1、目标: l 掌握购物车的信息如何存储; l 掌握购物车常用功能的实现。 主要内容: l 首先分析用户上网购物的一般过程; l 介绍采用什么样的数据结构存储购物信息; l 编写购物界面; l 完成向购物车添加物品的功能。 1、 用户上网购物的一般过程 在浏览物品的过程中如果对某件物品感兴趣,会添加到购物车(购物篮)中,随时可以查看购物车中的信息,如果不想要某件物品的话,可以删除,或者修改某种物品的数量,或者整个清空购物车,可以继续选择物品向购物车中添加。最后用户可以购物这些物品,经过
2、输入个人的送货地址信息和设定交易方式之后,可以生成订单。网站的管理员可以对订单进行管理。 本实例模拟这个过程,但是进行了简化:只能在物品列表中选择物品向购物车中添加。确定购买后,不需要设置交易方式以及付款等。实际处理过程,可以使用我们前面介绍的功能完成。 2、 购物车信息组织 因为在用户访问网站的整个过程中都可以访问购物车信息,所以购物车对象应该存放在session中。 因为用户购买的物品的种类和数量都不确定,所以需要使用一个合适的数据结构存储,我们选择ArrayList。 每一种物品都涉及数量,需要进行封装,把物品和数量封装成购物项,使用Item,每个Item对应一种物品以及该种物
3、品的数量。 需要编写物品类表示物品的基本信息。 参考代码如下: 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(St
4、ring goodsid) { this.goodsid = goodsid; } public String getGoodsid() { return goodsid; } // 物品名称 public void setGoodsname(String goodsname) { this.goodsname = goodsname; } public String getGoodsname() { return goodsname; }
5、 // 物品价格 public void setPrice(float price) { this.price = price; } public float getPrice() { return price; } public ArrayList getGoodsByPage(int pageNo) { int number = 10; // 每一页显示的记录数 int begin = (pageNo *
6、number) - 9; int end = pageNo * number; int index = 1; DBBean db = new DBBean(); // 要返回的结果对象 ArrayList goods = new ArrayList(); String sql = "select * from goods"; R
7、esultSet rs; try{ rs = db.executeQuery(sql,null); while (rs.next()) { // 在begin之前的记录是不显示的 if (index < begin) { index++;
8、 continue; } // 在end之后的记录也不显示 if (index > end) break; index++; String goodsid = rs.getString(1);
9、 String goodsname = rs.getString(2); float price = rs.getFloat(3); Goods g = new Goods(); g.setGoodsid(goodsid); g.setGoodsname(goodsname); g
10、setPrice(price); goods.add(g); } }catch(Exception e){ e.printStackTrace(); }finally{ db.close(); } return goods; } public Goods
11、findGoodsById(String goodsid) { try { // 编写查询数据库信息的SQL语句 String sql = "select * from goods where goodsid=?"; DBBean db = new DBBean(); ArrayList params = new ArrayList();
12、 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);
13、 Goods temp = new Goods(); temp.setGoodsid(goodsid); temp.setGoodsname(goodsname); temp.setPrice(price); db.close(); return temp; }else{ return null;
14、 } } catch (Exception e) { System.out.println(e.toString()); return null; } } public int getPageCount() { try { // 编写查询数据库信息的SQL语句 String sql = "select count(*) from
15、goods"; DBBean db = new DBBean(); ResultSet rs=db.executeQuery(sql,null); int number=0; if(rs.next()) number = rs.getInt(1); db.close();
16、 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(G
17、oods 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 = quantit
18、y;
}
public int getQuantity()
{
return quantity;
}
}
3、 物品信息显示功能
采用MVC模式,考虑视图部分,不需要输入界面,只需要显示信息的界面。
模型部分,在前面的代码中已经实现。
控制器部分,需要编写GetAllGoods.java。
参考代码分别如下:
3.1 界面代码
文件名:goodslist.jsp
<%@ page contentType="text/html;charset=gb2312"%>
<%@ taglib prefix="c" uri="
19、f test="${pageNo!=1}">
第一页
上一页
20、
21、 物品价格
22、
3.2 控制器代
package servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javabean.*;
import java.util.*;
public c
物品编号
物品名称
${g.goodsid}
${g.goodsname}
${g.price}
添加到购物车
24、lass GetAllGoods extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException { //response.setContentType("text/html;charset=gb2312"); //PrintWriter out = response.getWriter(); // 第一
25、步:获取用户的输入信息 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)
26、 int pageCount=g.getPageCount(); // out.println("记录数:"+users.size()); // out.println("当前页码:"+iPageNo); // out.println("总页码:"+pageCount); // 第三步:传值 request.setAttribute("goods",goods); request.setAttribute("pageNo",new Integer(iPageNo));
27、 request.setAttribute("pageCounter",new Integer(pageCount)); // 第四步:选择一个界面对用户进行响应 String forward="goodslist.jsp"; RequestDispatcher rd = request.getRequestDispatcher(forward); rd.forward(request,response); } public void doPost(HttpServletRequest request,Htt
28、pServletResponse response)
throws IOException,ServletException
{
doGet(request,response);
}
}
4、 显示购物车中信息
该功能直接从session中获取购物车信息,所以不需要控制器和模型部分,只需要编写显示购物车信息的JSP文件即可,文件名为cart.jsp,参考代码如下:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ taglib prefix="c" uri="
购物车中的信息
29、
| 物品编号 | 物品名称 | 价格 | 数量 |
| ${item.goods.goodsid} | ${item.goods.goodsname} | ${item.goods.price} | ${item.q 30、uantity} |
31、 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(
32、cart==null){ // 实例化购物车对象 cart=new ArrayList(); // 添加到购物车 Item item = new Item(g,quantity); cart.add(item); } else { // 转换成数组 Object items[] = cart.toArray(); boolean find=false; // 表示是否查找到
33、
for(int i=0;i 34、nd=true;
break;
}
}
if(!find)
{
// 添加到购物车
Item item = new Item(g,quantity);
cart.add(item);
}
}
return cart;
}
}
5.2 控制器部分
文件名:AddToCart.java
package servlet;
import ja 35、va.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.se 36、tContentType("text/html;charset=gb2312");
// PrintWriter out = response.getWriter();
try{
// 得到要添加的物品的编号
String goodsid = request.getParameter("goodsid");
// 创建JavaBean对象
CartManager cartManager=new CartManager();
// 得到session对象
HttpSession sessi 37、on = 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());
38、
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,Http 39、ServletResponse response)
throws IOException,ServletException
{
doGet(request,response);
}
}
6、 Servlet的配置
web.xml文件内容如下:
物品编号
物品名称
价格
数量