JSP培训(14)——购物车实例(上)

    技术2022-05-11  86

    目标: l         掌握购物车的信息如何存储; l         掌握购物车常用功能的实现。 主要内容: l         首先分析用户上网购物的一般过程; l         介绍采用什么样的数据结构存储购物信息; l         编写购物界面; l         完成向购物车添加物品的功能。 1、 用户上网购物的一般过程 在浏览物品的过程中如果对某件物品感兴趣,会添加到购物车(购物篮)中,随时可以查看购物车中的信息,如果不想要某件物品的话,可以删除,或者修改某种物品的数量,或者整个清空购物车,可以继续选择物品向购物车中添加。最后用户可以购物这些物品,经过输入个人的送货地址信息和设定交易方式之后,可以生成订单。网站的管理员可以对订单进行管理。 本实例模拟这个过程,但是进行了简化:只能在物品列表中选择物品向购物车中添加。确定购买后,不需要设置交易方式以及付款等。实际处理过程,可以使用我们前面介绍的功能完成。 2、 购物车信息组织 因为在用户访问网站的整个过程中都可以访问购物车信息,所以购物车对象应该存放在session中。 因为用户购买的物品的种类和数量都不确定,所以需要使用一个合适的数据结构存储,我们选择ArrayList。 每一种物品都涉及数量,需要进行封装,把物品和数量封装成购物项,使用Item,每个Item对应一种物品以及该种物品的数量。 需要编写物品类表示物品的基本信息。 参考代码如下: 2.1 物品类     该类中包含两个与分页显示相关的方法。其中用到的DBBean是前面介绍的。 package javabean;   import java.util.ArrayList; import java.sql.*;   public class Goods {    private String goodsid;    private String goodsname;    private float price;    // 物品编号    public void setGoodsid(String goodsid)    {       this.goodsid = goodsid;    }      public String getGoodsid()    {       return goodsid;    }      // 物品名称    public void setGoodsname(String goodsname)    {       this.goodsname = goodsname;   }      public String getGoodsname()    {       return goodsname;    }      // 物品价格    public void setPrice(float price)    {       this.price = price;    }      public float getPrice()    {       return price;    }          public ArrayList getGoodsByPage(int pageNo) {               int number = 10;               // 每一页显示的记录数                 int begin = (pageNo * number) - 9;               int end = pageNo * number;               int index = 1;                             DBBean db = new DBBean();               // 要返回的结果对象               ArrayList goods = new ArrayList();                             String sql = "select * from goods";               ResultSet rs;               try{                      rs = db.executeQuery(sql,null);                      while (rs.next()) {                             // 在begin之前的记录是不显示的                             if (index < begin) {                                    index++;                                    continue;                             }                               // 在end之后的记录也不显示                             if (index > end)                                    break;                               index++;                               String goodsid = rs.getString(1);                             String goodsname = rs.getString(2);                             float price = rs.getFloat(3);                               Goods g = new Goods();                             g.setGoodsid(goodsid);                             g.setGoodsname(goodsname);                             g.setPrice(price);                             goods.add(g);                      }               }catch(Exception e){                      e.printStackTrace();               }finally{                      db.close();               }               return goods;        }        public Goods findGoodsById(String goodsid)         {            try {                   // 编写查询数据库信息的SQL语句              String sql = "select * from goods where goodsid=?";                             DBBean db = new DBBean();                             ArrayList params = new ArrayList();               params.add(goodsid);                             ResultSet rs = db.executeQuery(sql,params);               if(rs.next())               {                   //String goodsid =rs.getString(1);                   String goodsname = rs.getString(2);                   float price = rs.getFloat(3);                   Goods temp = new Goods();                   temp.setGoodsid(goodsid);                   temp.setGoodsname(goodsname);                   temp.setPrice(price);                   db.close();                   return temp;               }else{                   return null;               }           } catch (Exception e) {              System.out.println(e.toString());              return null;         }      }        public int getPageCount() {                 try {                          // 编写查询数据库信息的SQL语句                      String sql = "select count(*) from goods";                              DBBean db = new DBBean();                         ResultSet rs=db.executeQuery(sql,null);                         int number=0;                         if(rs.next())                            number = rs.getInt(1);                         db.close();                      return (number - 1) / 10 + 1;                                       } catch (Exception e) {                      return 0;               }        } } 2.2 Item类 package javabean;   // 购物项 public class Item {    private Goods goods;    private int quantity;      public Item(Goods d,int quantity)    {       this.goods = d;       this.quantity = quantity;    }    public void setGoods(Goods goods){       this.goods = goods;    }      public Goods getGoods()    {       return goods;    }      public void setQuantity(int quantity)    {       this.quantity = quantity;    }    public int getQuantity()    {        return quantity;    } } 3、 物品信息显示功能 采用MVC模式,考虑视图部分,不需要输入界面,只需要显示信息的界面。 模型部分,在前面的代码中已经实现。 控制器部分,需要编写GetAllGoods.java。 参考代码分别如下: 3.1 界面代码 文件名:goodslist.jsp <%@ page contentType="text/html;charset=gb2312"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>   <c:if test="${pageNo!=1}">        <a href="getAllGoods?pageNo=1">第一页</a>        <a href="getAllGoods?pageNo=${pageNo-1}">上一页</a> </c:if> <c:if test="${pageNo!=pageCounter}">        <a href="getAllGoods?pageNo=${pageNo+1}">下一页</a>        <a href="getAllGoods?pageNo=${pageCounter}">最后一页</a> </c:if> <br> <table width="200" border="1" height="56">        <tbody>               <tr>                      <td>                             物品编号                      </td>                      <td>                             物品名称                      </td>                      <td>                             物品价格                      </td>               </tr>               <c:forEach var="g" items="${goods}">                      <tr>                             <td>                                    ${g.goodsid}                             </td>                             <td>                                    ${g.goodsname}                             </td>                             <td>                                    ${g.price}                             </td>                             <td>                                    <a href="addToCart?goodsid=${g.goodsid}">添加到购物车</a>                             </td>                      </tr>               </c:forEach>        </tbody> </table> 3.2 控制器代 package servlet; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import javabean.*; import java.util.*;   public class GetAllGoods extends HttpServlet {    public void doGet(HttpServletRequest request,HttpServletResponse response)      throws IOException,ServletException    {       //response.setContentType("text/html;charset=gb2312");       //PrintWriter out = response.getWriter();                // 第一步:获取用户的输入信息       String pageNo=request.getParameter("pageNo");       int iPageNo=1;       if(pageNo!=null)       {           iPageNo = Integer.parseInt(pageNo);       }         // 第二步:调用JavaBean       Goods g = new Goods();       ArrayList goods=null;       goods = g.getGoodsByPage(iPageNo);       int pageCount=g.getPageCount();             // out.println("记录数:"+users.size());       // out.println("当前页码:"+iPageNo);       // out.println("总页码:"+pageCount);               // 第三步:传值       request.setAttribute("goods",goods);       request.setAttribute("pageNo",new Integer(iPageNo));       request.setAttribute("pageCounter",new Integer(pageCount));         // 第四步:选择一个界面对用户进行响应       String forward="goodslist.jsp";         RequestDispatcher rd = request.getRequestDispatcher(forward);       rd.forward(request,response);      }    public void doPost(HttpServletRequest request,HttpServletResponse response)      throws IOException,ServletException    {       doGet(request,response);    } } 4、 显示购物车中信息 该功能直接从session中获取购物车信息,所以不需要控制器和模型部分,只需要编写显示购物车信息的JSP文件即可,文件名为cart.jsp,参考代码如下: <%@ page contentType="text/html;charset=gb2312"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>   购物车中的信息<br> <table border=1>    <tr>       <td>物品编号</td>       <td>物品名称</td>       <td>价格</td>       <td>数量</td>    </tr> <c:forEach var="item" items="${cart}">    <tr>       <td>${item.goods.goodsid}</td>       <td>${item.goods.goodsname}</td>       <td>${item.goods.price}</td>       <td>${item.quantity}</td> </c:forEach> </table> 5、 向购物车中添加物品 采用MVC模式。 首先考虑输入和输出,添加物品的输入就是物品信息列表界面,输出应该是添加后的购物车信息界面(也可以重新回到物品信息界面),这两个界面都不需要编写。 考虑模型部分,需要编写购物车管理JavaBean,完成处理。 考虑控制器部分,需要获取用户选择的物品,然后添加到调用购物车管理Bean,完成添加。 下面是参考代码。 5.1 模型部分 文件名CartManager.java package javabean;   import java.util.ArrayList;   public class CartManager {    // 表示购物车    private ArrayList cart;      public void setCart(ArrayList cart)    {       this.cart = cart;    }    public ArrayList getCart()    {       return cart;    }       // 添加的物品&数量    public ArrayList addToCart(Goods g,int quantity)    {       if(cart==null){          // 实例化购物车对象          cart=new ArrayList();            // 添加到购物车          Item item = new Item(g,quantity);          cart.add(item);       }       else       {          // 转换成数组          Object items[] = cart.toArray();            boolean find=false; // 表示是否查找到                    for(int i=0;i<items.length;i++)          {              Item temp = (Item)items[i];              // 判断购物车中是否存在要添加的物品              if(temp.getGoods().getGoodsid().equals(g.getGoodsid()))              {                 temp.setQuantity(temp.getQuantity()+quantity);                 find=true;                 break;              }          }          if(!find)          {             // 添加到购物车             Item item = new Item(g,quantity);              cart.add(item);          }       }       return cart;    } } 5.2 控制器部分 文件名:AddToCart.java package servlet;   import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import javabean.*; import java.util.*;   public class AddToCart extends HttpServlet {    public void doGet(HttpServletRequest request,HttpServletResponse response)      throws IOException,ServletException    { //        response.setContentType("text/html;charset=gb2312"); //        PrintWriter out = response.getWriter();      try{         // 得到要添加的物品的编号       String goodsid = request.getParameter("goodsid");           // 创建JavaBean对象       CartManager cartManager=new CartManager();       // 得到session对象       HttpSession session = request.getSession(true);       // 得到购物车对象       ArrayList cart = (ArrayList)session.getAttribute("cart");           // 用cart初始化cartManager       cartManager.setCart(cart);       // 构造物品对象       Goods g = new Goods();       g = g.findGoodsById(goodsid);         // out.println(g.getGoodsid());         cartManager.addToCart(g,1);         // 先把购物车重新存到session       session.setAttribute("cart",cartManager.getCart());     }catch(Exception e){       // out.println(e.toString());     }         response.sendRedirect("cart.jsp");         }    public void doPost(HttpServletRequest request,HttpServletResponse response)      throws IOException,ServletException    {       doGet(request,response);    } } 6、 Servlet的配置 web.xml文件内容如下: <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">   <servlet>         <servlet-name>getAllGoods</servlet-name>         <servlet-class>servlet.GetAllGoods</servlet-class> </servlet>   <servlet-mapping>         <servlet-name>getAllGoods</servlet-name>         <url-pattern>/getAllGoods</url-pattern> </servlet-mapping>   <servlet>         <servlet-name>addToCart</servlet-name>         <servlet-class>servlet.AddToCart</servlet-class> </servlet>   <servlet-mapping>         <servlet-name>addToCart</servlet-name>         <url-pattern>/addToCart</url-pattern> </servlet-mapping> </web-app> 7、 运行 编译所有文件,然后先访问getAllGoods Servlet,然后在物品信息界面上选择物品添加到购物车,之后就可以看到购物车中的信息了。

     

    参考教材:《Java Web程序设计基础教程》


    最新回复(0)