【web第二十天】Easymall商品模块开发

Easymall商品模块开发

1.点击全部商品

2.servlet:把所有商品信息都要获取到,需要调用到service,获取到数据后,将数据保存到request域中,跳转页面

3.service调用dao获取所有商品

4.dao:链接数据库查询所有商品,每件商品封装到javaBean,然后保存到list集合中返回

5.完成展示页面获取到list,遍历list

   图片无法展示:因为浏览器无法直接访问WEB-INF下的东西

      图片无法访问

  1. 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文件夹中cssimg拷贝到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. 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);

    }

}

 

posted @ 2018-03-29 22:36  songyao  阅读(156)  评论(0编辑  收藏  举报