【web第二十天】Easymall商品模块开发
Easymall商品模块开发
1.点击全部商品
2.servlet:把所有商品信息都要获取到,需要调用到service,获取到数据后,将数据保存到request域中,跳转页面
3.service调用dao获取所有商品
4.dao:链接数据库查询所有商品,每件商品封装到javaBean,然后保存到list集合中返回
5.完成展示页面获取到list,遍历list
图片无法展示:因为浏览器无法直接访问WEB-INF下的东西
图片无法访问
- 1. EasyMall商品模块 - 商品列表
index.jsp:提供“所有商品”链接
ProdListServlet:调用service查询所有商品信息,存入request域带到页面展示。
ProdService:提供查询所有商品的方法
ProdDao:提供查询所有商品的方法
prodList.jsp:展示所有商品
代码示例:
在_head.jsp中,全部商品对应的<a>标签中修改href属性: <li><a href="${ app }/servlet/ProdListServlet">全部商品</a></li>
|
在web包中创建servlet:ProdListServlet,并添加如下代码: //1.调用Service查询寻所有上商品 ProdService service = BasicFactory.getFactory().getInstance(ProdService.class); List<Prod> list = service.findProdList(); //2.将查询到的所有商品存入request域 request.setAttribute("list", list); //3.转发到prodList.jsp展示数据 request.getRequestDispatcher("/prodList.jsp").forward(request, response);
|
在ProdService接口中添加findProdList方法: /** * 查询所有商品 * @return 所有商品组成的列表 */ List<Prod> findProdList();
|
在ProdServiceImpl中实现该方法,并调用dao层findProdList方法: public List<Prod> findProdList() { return dao.findProdList(); }
|
在ProdDao接口中添加findProdList方法: /** * 查询所有商品 * @return 所有商品信息组成的bean */ List<Prod> findProdList();
|
在ProdDaoImpl中实现该方法,并添加如下代码: public List<Prod> findProdList() { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try{ conn = JDBCUtils.getConnection(); String sql = "select * from prod,prod_category where prod.cid = prod_category.id"; ps = conn.prepareStatement(sql); rs = ps.executeQuery(); List<Prod> list = new ArrayList<Prod>(); while(rs.next()){ Prod prod = new Prod(); prod.setId(rs.getInt("prod.id")); prod.setName(rs.getString("prod.name")); prod.setPrice(rs.getDouble("prod.price")); prod.setCid(rs.getInt("prod.cid")); prod.setCname(rs.getString("prod_category.cname")); prod.setPnum(rs.getInt("pnum")); prod.setImgurl(rs.getString("imgurl")); prod.setDescription(rs.getString("description")); list.add(prod); } return list; }catch (Exception e) { throw new RuntimeException(e); } finally { JDBCUtils.close(conn, ps, rs); } }
|
在WebRoot下创建prodList.jsp,加入page指令标签,将编码改为utf-8,并将课前资料静态页面中的prodlist文件夹中css和img拷贝到WebRoot中,将prodList.html中的内容全部复制到prodList.jsp中。
在相对路径改为绝对路径:即在路径前加“${ app }/”即可 在<body>中,在最上面将头部包含进来,在最后将尾部包含进来: <body> <!-- 将头部引入进来 --> <%@ include file="/_head.jsp" %> ...... <!-- 将尾部引入进来 --> <%@ include file="/_foot.jsp" %> </body>
需要通过循环,将list中所有商品展示出来,所以在jsp最上面需要引入jstl标签库: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
在<div id="prod_content">中,将内容修改为如下代码: <c:forEach items="${ requestScope.list }" var="prod"> <div id="prod_div"> <img src="${ app }/servlet/ProdImgServlet?imgurl=${ prod.imgurl }"></img> <div id="prod_name_div"> ${ prod.name } </div> <div id="prod_price_div"> ${ prod.price }元 </div> <div> <div id="gotocart_div"> <a href="#">加入购物车</a> </div> <div id="say_div"> 133人评价 </div> </div> </div> </c:forEach>
|
图片中的src属性地址如果直接写图片地址,则无法访问,因为图片在WEB-INF下,外界无法访问,只能通过程序内部访问,所以图片访问一个servlet,并将图片地址作为参数传给servlet,servlet中获取图片路径,并将图片读取到,再响应给jsp。在web包下创建servlet:ProdImgServlet,并添加如下代码: String imgurl = request.getParameter("imgurl"); InputStream in = new FileInputStream(this.getServletContext().getRealPath(imgurl)); OutputStream out = response.getOutputStream(); byte [] data = new byte[1024]; int len = -1; while((len = in.read(data))!=-1){ out.write(data,0,len); } in.close(); |
- 1. EasyMall商品模块 - 商品修改
商品修改
1.manage.jsp中点击商品修改时,访问servlet
2.servlet:查询所有商品,存入request域,并跳转到修该页面
3.修改页面:提供修改库存的输入框,当失去焦点是,访问ajax来修改库存
4.servlet:获取参数并访问service来修改
5.service:访问dao来修改库存
6.dao:
在backend/manage.jsp 提供修改商品功能,访问ManageProdListServlet。
ManageProdListServlet 查询所有商品,存入request域并带到页面展示。
manageProdList.jsp 展示所有商品信息,并提供修改商品数量的输入框,当 修改数量时触发AJAX请求访问服务器,修改数量。
ManageUpdatePnumServlet 获取商品编号和最新数量,调用Service修改商品数量,发回成功或失败的消息。
ProdService 提供方法,可以通过调用dao,根据商品编号修改商品库存。
ProdDao 提供方法,通过商品编号修改商品库存。
代码示例:
在backend下_left.jsp中,修改商品修改对应<div>: <div><a href="${ app }/servlet/ManageProdListServlet" target="rightFrame">> 商品修改</a></div>
|
在backend包下创建servlet:ManageProdListServlet,并添加如下代码: //1.查询所有商品信息 ProdService service = BasicFactory.getFactory().getInstance(ProdService.class); List<Prod> list = service.findProdList(); //2.存入request域中 request.setAttribute("list", list); //3.带到manageProdList.jsp页面展示 request.getRequestDispatcher("/backend/manageProdList.jsp").forward(request, response);
|
将课前资料中的backend文件夹中manageProdList.jsp拷贝到WebRoot下的backend文件夹中,并添加taglib指令,添加for循环展示商品,并在商品库存栏提供输入框,并添加onblur事件,当失去焦点时触发ajax进行数量的修改,代码如下: Jsp最上面引入taglib指令: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
在<table>中,删除模板数据,并通过循环遍历list中所有商品信息: <c:forEach items="${requestScope.list }" var="prod" > <tr> <td><img width="120px" height="120px" src="${ app }/servlet/ProdImgServlet?imgurl=${prod.imgurl}"/></td> <td>${prod.id }</td> <td>${prod.name }</td> <td>${prod.cname }</td> <td>${prod.price }</td> <td><input type="text" value="${prod.pnum }" style="width: 50px" onblur="changeNum(this,'${prod.id}')"/></td> <td>${prod.description }</td> <td><a class="del" href="javascript:void(0)">删 除</a></td> </tr> </c:forEach>
在<head>中添加<script>标签,引入ajax: <script type="text/javascript" src="${ app }/js/jquery-1.4.2.js"></script> <script type="text/javascript"> function changeNum(inp,id){ $.get("${app}/servlet/AjaxChangePnumServlet", { "id" : id, "pnum" : inp.value}, function(data){ alert(data); }); } </script>
|
在backend包中创建servlet:AjaxChangePnumServlet,并添加如下代码: try { //1.获取参数 int id = Integer.parseInt(request.getParameter("id")); int pnum = Integer.parseInt(request.getParameter("pnum")); //2.调用Service修改商品 ProdService service = BasicFactory.getFactory().getInstance(ProdService.class); service.changePnum(id,pnum); //3.输出处理结果 response.getWriter().write("商品数量修改成功!"); } catch (Exception e) { response.getWriter().write("商品数量修改失败!"); e.printStackTrace(); }
|
在ProdService接口中添加如下代码: /** * 修改指定id商品的 库存数量 * @param id 商品编号 * @param pnum 最新的数量 */ void changePnum(int id, int pnum);
|
在ProdServiceImpl实现类中调用dao层方法,代码如下: public void changePnum(int id, int pnum) { dao.changePnum(id,pnum); }
|
在ProdDao接口中添加如下代码: /** * 修改商品数量 * @param id 商品编号 * @param pnum 新的库存数量 */ void changePnum(int id, int pnum);
|
在ProdDaoImpl实现类中添加如下代码: public void changePnum(int id, int pnum) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try{ conn = JDBCUtils.getConnection(); String sql = "update prod set pnum = ? where id = ?"; ps = conn.prepareStatement(sql); ps.setInt(1, pnum); ps.setInt(2, id); ps.executeUpdate(); }catch (Exception e) { throw new RuntimeException(e); } finally { JDBCUtils.close(conn, ps, rs); } } |
3.EasyMall商品模块 - 删除商品
1.准备删除按钮,并访问后台servlet ,带id
2.servlet:获取商品id,调用service删除,跳转页面,跳转到ManageProdServlet
3.service:根据商品id查找商品种类,如果此种类中的商品数量多于一件,只删除商品;如果种类中的商品数量只有一件,删除商品并且删除商品种类,调用dao删除商品
4.dao:连接数据库执行操作
在backend/manageProdList.jsp 商品中提供删除按钮,点击后带着当前商品的id访问后台。
ManageDelProdServlet 获取要删除的商品的id 调用Service层删除商品,删除成功后回到商品管理列表页面。
ProdService 提供根据id删除商品的方法:按照商品id查询商品信息,获取商品种类id,根据商品种类id查询商品种类,根据商品种类id查询商品表,判断该种类商品还剩多少。如果只有当前这件商品,则删除商品信息及商品种类信息,如果不是,则只删除当前商品信息。
ProdDao 提供相应方法。
代码示例:
在manageProdList.jsp中,修改删除对应<a>标签中个href属性: <td><a class="del" href="${ app }/servlet/ManageDelProdServlet?id=${prod.id}">删 除</a></td>
|
在backend包下创建servlet:ManageDelProdServlet,并添加如下代码: //1.获取要删除的商品id int id = Integer.parseInt(request.getParameter("id")); //2.调用Service删除指定id的商品 ProdService service = BasicFactory.getFactory().getInstance(ProdService.class); service.delProd(id); //3.重定向回到商品管理页面 response.getWriter().write("删除成功!"); response.setHeader("Refresh", "1;url="+request.getContextPath()+"/servlet/ManageProdListServlet");
|
在ProdService接口中添加如下代码: /** * 删除指定id商品 * @param id 要删除的商品的id */ void delProd(int id);
|
在ProdServiceImpl实现类中添加如下代码: public void delProd(int id) { try { TransactionManager.startTran(); //1.根据商品id查找商品信息 Prod prod = dao.findProdById(id); //2.获取种类 int cid = prod.getCid(); //3.根据商品种类查询商品表 获知 该种类的商品剩余几种 List<Prod> list = dao.findProdByCid(cid); //4.根据不同情况处理 if(list.size() > 1){ //--如果大于1 则只删除当前商品即可 dao.delProdById(id); }else{ //--如果小于等于1 则删除当前商品 再删除该商品种类 dao.delProdById(id); dao.delProdCategoryByCid(cid); } TransactionManager.commitTran(); } catch (Exception e) { TransactionManager.rollbackTran(); e.printStackTrace(); throw new RuntimeException(e); } finally { TransactionManager.release(); } }
|
在ProdDao接口中添加如下代码: /** * 根据商品id查询商品 * @param id 商品id * @return 封装了商品信息的bean */ Prod findProdById(int id); /** * 根据商品种类查询商品信息 * @param cid 商品的种类id * @return 找到的所有商品组成的bean */ List<Prod> findProdByCid(int cid); /** * 根据id删除商品 * @param id 商品编号 */ void delProdById(int id); /** * 根据商品种类id 删除商品种类 * @param cid 商品种类编号 */ void delProdCategoryByCid(int cid);
|
在ProdDaoImpl实现类中添加如下代码: public Prod findProdById(int id) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try{ conn = TransactionManager.getConn(); String sql = "select * from prod where id = ?"; ps = conn.prepareStatement(sql); ps.setInt(1, id); rs = ps.executeQuery(); Prod prod = null; if(rs.next()){ prod = new Prod(); prod.setId(rs.getInt("id")); prod.setName(rs.getString("name")); prod.setPrice(rs.getDouble("price")); prod.setCid(rs.getInt("cid")); prod.setPnum(rs.getInt("pnum")); prod.setImgurl(rs.getString("imgurl")); prod.setDescription(rs.getString("description")); } return prod; }catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } finally { JDBCUtils.close(null, ps, rs); } }
public List<Prod> findProdByCid(int cid) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try{ conn = TransactionManager.getConn(); String sql = "select * from prod where cid = ?"; ps = conn.prepareStatement(sql); ps.setInt(1, cid); rs = ps.executeQuery(); List<Prod> list = new ArrayList<Prod>(); while(rs.next()){ Prod prod = new Prod(); prod.setId(rs.getInt("id")); prod.setName(rs.getString("name")); prod.setPrice(rs.getDouble("price")); prod.setCid(rs.getInt("cid")); prod.setPnum(rs.getInt("pnum")); prod.setImgurl(rs.getString("imgurl")); prod.setDescription(rs.getString("description")); list.add(prod); } return list; }catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } finally { JDBCUtils.close(null, ps, rs); } }
public void delProdById(int id) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try{ conn = TransactionManager.getConn(); String sql = "delete from prod where id = ?"; ps = conn.prepareStatement(sql); ps.setInt(1, id); ps.executeUpdate(); }catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } finally { JDBCUtils.close(null, ps, rs); } }
public void delProdCategoryByCid(int cid) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try{ conn = TransactionManager.getConn(); String sql = "delete from prod_category where id = ?"; ps = conn.prepareStatement(sql); ps.setInt(1, cid); ps.executeUpdate(); }catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } finally { JDBCUtils.close(null, ps, rs); } } |