目标:

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

第一页

上一页

下一页

最后一页

物品编号

物品名称

物品价格

${g.goodsid}

${g.goodsname}

${g.price}

添加到购物车

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,参考代码如下:

购物车中的信息

物品编号

物品名称

价格

数量

${item.goods.goodsid}

${item.goods.goodsname}

${item.goods.price}

${item.quantity}