41、商品管理
阿新 • • 發佈:2018-12-03
學習過程:
下面我們需要完成的是商品管理,雖然也是增刪改查這個幾個功能,不過因為需要上傳商品圖和分頁兩個功能,而且商品也和類別有多對一的關係,所以商品管理相比之下就比較複雜一點,不過也沒有關係,這方便的知識點我們前面也已經講過了。
1、完成dao層。注意分頁的程式碼,這裡用到了Page類,這個類可在原始碼中獲得。
public class GoodsDao extends BaseDao implements IGoodsDao { /** * 新增商品 * * @param goods * @return */ public int add(Goods goods) { int result = 0; getCon(); String sql = "insert into goods(type_id,goods_name,cash,infos,pic,nums) values(?,?,?,?,?,?)"; result = exeUpdate( sql, new Object[] { goods.getTypeId(), goods.getGoodsName(), goods.getCash(), goods.getInfos(), goods.getPic(), goods.getNums() }); closeAll(); return result; } /** * 根據Id刪除商品 * * @param id * @return */ public int del(int id) { int result = 0; getCon(); String sql = "delete from goods where goods_id=?"; result = exeUpdate(sql, new Object[] { id }); closeAll(); return result; } /** * 更新商品資訊 * * @param goods * @return */ public int update(Goods goods) { int result = 0; getCon(); String sql = "update goods set type_id=?,goods_name=?,cash=?,infos=?,pic=?,nums=? where goods_id=?"; result = exeUpdate( sql, new Object[] { goods.getTypeId(), goods.getGoodsName(), goods.getCash(), goods.getInfos(), goods.getPic(), goods.getNums(), goods.getGoodsId() }); closeAll(); return result; } /** * 根據商品Id獲得單個商品資訊 * * @param id * @return */ public Goods getById(int id) { Goods goods = null; getCon(); String sql = "select * from goods where goods_id=?"; rs = exeQuery(sql, new Object[] { id }); try { if (rs.next()) { goods = new Goods(); goods.setCash(rs.getDouble("cash")); goods.setGoodsId(rs.getInt("goods_id")); goods.setGoodsName(rs.getString("goods_name")); goods.setInfos(rs.getString("infos")); goods.setNums(rs.getInt("nums")); goods.setPic(rs.getString("pic")); goods.setTypeId(rs.getInt("type_id")); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { closeAll(); } return goods; } /** * 根據商品型別分頁顯示商品資訊列表 * * @param typeId * 商品類別ID * @param page * 分頁資訊 * @return */ public List<Goods> getByType(int typeId, Page page) { List<Goods> goodses = new ArrayList<Goods>(); getCon(); try { String sqlcount = "select count(*) from goods where type_id=?"; rs = exeQuery(sqlcount, new Object[] { typeId }); if (rs.next()) { page.setItmeCount(rs.getInt(1)); } String sql = "select * from goods where type_id=? limit ?,?"; //String sql="select * from(select t.*,rownum rn from(select * from goods where type_id=? order by goods_id desc) t where rownum<=?) where rn>? "; rs = exeQuery(sql,new Object[] { typeId, page.getItemStart(),page.getPageSize() }); while (rs.next()) { Goods goods = new Goods(); goods.setCash(rs.getDouble("cash")); goods.setGoodsId(rs.getInt("goods_id")); goods.setGoodsName(rs.getString("goods_name")); goods.setInfos(rs.getString("infos")); goods.setNums(rs.getInt("nums")); goods.setPic(rs.getString("pic")); goods.setTypeId(rs.getInt("type_id")); goodses.add(goods); } } catch (SQLException e) { e.printStackTrace(); } finally { closeAll(); } return goodses; } }
2、實現控制層也就是servlet層。需要注意的地方是,在列表頁面、新增頁面和修改頁面都需要把商品類別顯示出來,所有這些方法都需查詢所有的類別,並放到request作用域中。還有就是在刪除資料庫的商品時,注意應該把商品圖片也刪除了,這樣可以節省空間。
public class GoodsServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { IGoodsDao goodsDao=FactoryDao.getInstanse().newGoodsDao(); IGoodsTypesDao goodsTypesDao=FactoryDao.getInstanse().newGoodsTypesDao(); String ope = request.getParameter("ope"); if (ope == null || ope.equals("list")) {// 商品列表 int cpage = 1; int tid = 0; // 獲得所有的類別 List<GoodsTypes> goodsTypeses = goodsTypesDao.getAllTypes(); String cpagestr = request.getParameter("cpage"); String tidstr = request.getParameter("tid"); if (cpagestr != null) { cpage = Integer.parseInt(cpagestr); } if (tidstr == null) { tid = goodsTypeses.get(0).getTypeId(); } else { tid = Integer.parseInt(tidstr); } Page page = new Page(); page.setCurrentPage(cpage); page.setPageSize(5); List<Goods> goodses = goodsDao.getByType(tid, page); request.setAttribute("goodses", goodses); request.setAttribute("goodsTypeses", goodsTypeses); request.setAttribute("page", page); request.setAttribute("tid", tid); request.getRequestDispatcher("goodslist.jsp").forward(request, response); } else if (ope.equals("toadd")) {// 進入新增商品頁 List<GoodsTypes> goodsTypeses = goodsTypesDao.getAllTypes(); request.setAttribute("goodsTypeses", goodsTypeses); request.getRequestDispatcher("goodsadd.jsp").forward(request, response); } else if (ope.equals("add")) {// 執行新增 Map<String, String> forMap = new HashMap<String, String>(); String filename = null; FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); try { List items = upload.parseRequest(request); Iterator iter = items.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (item.isFormField()) { String name = item.getFieldName(); String value = item.getString("utf-8"); forMap.put(name, value); } else { String fieldname = item.getFieldName(); filename = item.getName(); // UUID唯一值 filename = UUID.randomUUID() + filename.substring(filename.indexOf(".")); String path = request.getSession().getServletContext() .getRealPath("/"); File uploadFile = new File(path + "/uploadfile/" + filename); item.write(uploadFile); } } } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } Goods goods = new Goods(); goods.setGoodsName(forMap.get("goodsName")); goods.setTypeId(Integer.parseInt(forMap.get("typeId"))); goods.setCash(Double.parseDouble(forMap.get("cash"))); goods.setInfos(forMap.get("infos")); goods.setNums(Integer.parseInt(forMap.get("nums"))); goods.setPic(filename); int result = goodsDao.add(goods); if (result > 0) { response.sendRedirect("GoodsServlet"); } else { response.sendRedirect("error.jsp"); } } else if (ope.equals("del")) {// 執行刪除 // 獲得要刪除id int gid = Integer.parseInt(request.getParameter("gid")); int result = goodsDao.del(gid); if (result > 0) { response.sendRedirect("GoodsServlet"); } else { response.sendRedirect("error.jsp"); } } else if (ope.equals("toupdate")) {// 進入更新 List<GoodsTypes> goodsTypeses = goodsTypesDao.getAllTypes(); int gid = Integer.parseInt(request.getParameter("gid")); Goods goods = goodsDao.getById(gid); request.setAttribute("goods", goods); request.setAttribute("goodsTypeses", goodsTypeses); request.getRequestDispatcher("goodsupdate.jsp").forward(request, response); } else if (ope.equals("update")) {// 執行更新 //修改 商品 //如果使用者沒有選擇新的圖片 》》 不能修改資料庫裡 商品 pic 屬性 》》 使用原先的值 //如果使用者選擇新的圖片 >> 1、修改資料庫 2、刪除原來的檔案 Map<String, String> forMap = new HashMap<String, String>(); String filename = null; //伺服器路徑 String path = request.getSession() .getServletContext().getRealPath("/"); FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); try { List items = upload.parseRequest(request); Iterator iter = items.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (item.isFormField()) { String name = item.getFieldName(); String value = item.getString("utf-8"); forMap.put(name, value); } else { String fieldname = item.getFieldName(); filename = item.getName(); // UUID唯一值 // 如果使用者上傳了新的圖片,那麼要把原來的圖片刪除 if (filename != "" || !filename.equals("") || filename != null) { filename = UUID.randomUUID() + filename.substring(filename.indexOf(".")); File uploadFile = new File(path + "/uploadfile/" + filename); item.write(uploadFile); } } } } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } Goods goods = new Goods(); int gid=Integer.parseInt(forMap.get("goodsId")); Goods temp=goodsDao.getById(gid);//原來儲存在資料庫中的資訊 goods.setGoodsId(gid); goods.setGoodsName(forMap.get("goodsName")); goods.setTypeId(Integer.parseInt(forMap.get("typeId"))); goods.setCash(Double.parseDouble(forMap.get("cash"))); goods.setInfos(forMap.get("infos")); goods.setNums(Integer.parseInt(forMap.get("nums"))); //如果使用者沒有上傳新的圖片 if (filename == "" || filename.equals("") || filename == null) { goods.setPic(temp.getPic()); } else { //刪除檔案 File file=new File(path+"/uploadfile/"+temp.getPic()); file.delete(); goods.setPic(filename); } int result = goodsDao.update(goods); if (result > 0) { response.sendRedirect("GoodsServlet"); } else { response.sendRedirect("error.jsp"); } } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
頁面程式碼比較多,也比較簡單,這裡就不全部顯示出來的,大家可以參考原始碼實現。今天的任務還需要完成後臺的使用者管理的,這部分內容和商品管理類似,留給大家作為作業吧。
這裡還用到日期格式化的標籤:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
下面列出商品列表的程式碼:
<!-- content --> <div id="manage_content_wrapper"> <div id="manage_content_left"> <jsp:include page="left.jsp"></jsp:include> </div> <div id="manage_content_right"> <div id="admin_content_contain"> <a href="GoodsServlet?ope=toadd">新增商品</a> <br /> <br /> <form action="GoodsServlet"> <select name="tid"> <c:forEach items="${goodsTypeses }" var="type"> <option value="${type.typeId }" <c:if test="${type.typeId eq tid }">selected="selected"</c:if>>${type.typeName }</option> </c:forEach> </select> <input type="submit" value="查詢" /> </form> <table width="859" border="0" cellspacing="1" bgcolor="#e8822e"> <tr class="admin_font3"> <td width="57" height="30">序號</td> <td width="98">商品名稱</td> <td width="90">商品價格</td> <td width="171">商品資訊</td> <td width="161">商品圖片</td> <td width="96">商品數量</td> <td width="69">操作</td> </tr> <c:forEach var="goods" items="${goodses }" varStatus="status"> <tr class="admin_font2"> <td height="25">${status.index+1 }</td> <td>${goods.goodsName }</td> <td>${goods.cash }</td> <td>${goods.infos }</td> <td><img src="<%=basePath %>uploadfile/${goods.pic }" height="50" /></td> <td>${goods.nums }</td> <td><a href="GoodsServlet?ope=toupdate&gid=${goods.goodsId }"> 修改 </a> | <a href="GoodsServlet?ope=del&gid=${goods.goodsId }"> 刪除</a> </td> </tr> </c:forEach> </table> </div> </div> <div align="center"> 第${page.currentPage }頁,共有 ${page.pageCount } 頁 <a href="GoodsServlet?tid=${tid }&cpage=${page.currentPage-1}">上一頁</a> <c:set var="endItem" value="${page.currentPage+5 }"/> <c:if test="${endItem>page.pageCount }"> <c:set var="endItem" value="${page.pageCount }"/> </c:if> <c:set var="startItem" value="${page.currentPage-5 }"></c:set> <c:if test="${startItem<1 }"> <c:set var="startItem" value="1"/> </c:if> <c:forEach begin="${startItem }" end="${endItem }" var="a"> <a href="GoodsServlet?tid=${tid }&cpage=${a}">[${a}]</a> </c:forEach> <a href="GoodsServlet?tid=${tid }&cpage=${page.currentPage+1}">下一頁</a> </div> </div> <!-- end of content -->