购物车

来源:互联网 发布:javaweb所需软件 编辑:程序博客网 时间:2024/05/17 06:34
目标:
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,然后在物品信息界面上选择物品添加到购物车,之后就可以看到购物车中的信息了。
原创粉丝点击