第一部分:购物车的基本功能
从已有的物品列表中选择物品添加到购物车;
可以修改购物车中的物品数量;
可删除购物车中的物品;
可以结账。
通常购物车还有的功能包括:根据购物车生成订单、添加邮寄信息等。这些功能相对比较简单,所以不在这里实现。
第二部分:实现
实例包括以下文件:
文件名
|
主要内容
|
作用
|
生成方式
|
index.jsp
|
一个超链,链接到购物页面
|
进入购物页面
|
使用向导,然后添加代码
|
DBManager
|
封装了建立与数据库的连接,执行各种SQL语句的方法
|
完成与数据库之间的交互
|
代码完全手写
|
Good
|
封装了物品的基本信息,包括
|
作为值对象在各个层之间传递
|
代码完全手写
|
GoodsM
|
业务逻辑,封装了查询所有物品信息的方法,以及根据编号查询物品信息的方法
|
管理物品信息,主要查询物品信息
|
代码完全手写
|
CartManager
|
向购物车添加物品,从购物车删除物品,修改购物车中的物品
|
管理购物车
|
代码全部手写
|
BuyAction
|
根据用户选择的物品编号,把选择的物品添加到购物车中。
|
购买物品
|
使用向导,然后修改代码
|
buy.jsp
|
显示已有物品的列表,显示购物车中物品信息,物品列表后面有添加购物车的功能,购物车信息后面有修改购物车信息的功能。
|
显示物品,显示购物车,可以通过这个界面添加、修改购物车信息。
|
先使用向导生成,然后添加物品信息列表,然后再添加购物车管理功能。
|
UpdateForm
|
包含物品编号和物品数量信息,以及验证的方法
|
完成更新的时候使用
|
向导生成,然后修改
|
web.xml
|
核心控制器ActionServlet的声明,访问方式的声明
|
完成核心控制器的配置
|
通过向导生成
|
struts-config.xml
|
声明ActionForm,声明Action,声明映射关系
|
与ActionServlet共同完成控制功能
|
多数内容是通过向导生成的
|
所涉及的文件之间的关系如下:
显示所有物品信息
向购物车中添加信息
修改购物车中的信息
基本过程如下:
Ø 创建数据库
Ø 创建表
Ø 向表中插入测试数据
Ø 创建工程
Ø 创建与数据库进行交互的DBManager
Ø 创建表示物品信息的Good
Ø 创建一个单独的欢迎界面index.jsp
Ø 创建管理物品信息的GoodsM
Ø 创建BuyAction及其配置信息
Ø 创建buy.jsp,显示物品信息
Ø 创建CartManager,用于管理购物车
Ø 创建AddAction,完成物品的添加Action
Ø 修改JSP文件buy.jsp,增加代码来显示购物车中的信息
Ø 创建UpdateAction和UpdateForm
Ø 进行异常处理
在最后添加了一部分内容:如何在MyEclipse中创建Form。
下面详细介绍每一部分。
1、 创建数据库
数据库的名字是:cart
2、 创建表
表名:goods;
创建表的SQL语句:
create table goods(gid char(13) primary key,gname varchar(30),price float,quantity int);
3、 向表中插入测试数据
insert into goods values('0001','洗发水',18,30);
insert into goods values('0002','洗衣粉',6.5,300);
insert into goods values('0003','羽毛球',3,330);
insert into goods values('0004','拖鞋',4.9,230);
insert into goods values('0005','面包',4,380);
insert into goods values('0006','订书机',11,80);
insert into goods values('0007','电池',2.5,1130);
4、 创建工程
工程的名字:cart
Ø 第一步:选择【File】
à【New】
à【Project】,打开创建工程对话框。
Ø 第二步:选择【MyEclipse】
à【J2EE Projects】
à【Web Project】。
Ø 第三步:输入Web工程的名字cart即可。
包的名字:com.neu.cart
Ø 第一步:在【src】上点击右键;
Ø 第二步:在弹出的对话框中选择【New】
à【Package】;
Ø 第三步:输入包的名字com.neu.cart。
Ø 点击【Finish】。
导入Struts相关的包:
Ø 第一步:在工程的名字cart上点击鼠标右键。
Ø 第二步:在弹出的对话框中选择【MyEclipse】
à【Add Struts Capabilities…】。
Ø 第三步:在下面的文件中输设置以下信息:
n 选择Struts的版本1.2
n 选择包的路径,选择刚才建好的包
n 选中画面下面的两个复选框
Ø 点击【Finish】
Ø 导入之后察看WEB-INF下面的web.xml,包含了中心控制器的声明以及其它配置信息等,内容如下:
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
web-app
xmlns
=
"http://java.sun.com/xml/ns/j2ee"
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
version
=
"2.4"
xsi:schemaLocation
=
"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>
<
servlet
>
<
servlet-name
>
action
</
servlet-name
>
<
servlet-class
>
org.apache.struts.action.ActionServlet
</
servlet-class
>
<
init-param
>
<
param-name
>
config
</
param-name
>
<
param-value
>
/WEB-INF/struts-config.xml
</
param-value
>
</
init-param
>
<
init-param
>
<
param-name
>
debug
</
param-name
>
<
param-value
>
3
</
param-value
>
</
init-param
>
<
init-param
>
<
param-name
>
detail
</
param-name
>
<
param-value
>
3
</
param-value
>
</
init-param
>
<
load-on-startup
>
0
</
load-on-startup
>
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>
action
</
servlet-name
>
<
url-pattern
>
*.do
</
url-pattern
>
</
servlet-mapping
>
</
web-app
>
本例中我们使用mysql的驱动程序,导入MySql的驱动程序:
Ø 在工程上点击右键
Ø 在弹出的界面上选择【Properties】
Ø 选择左边的【Java Builder Path】,然后选择右边的【Liberaries】。
Ø 点击【Add External JARs…】,在打开的界面中选择数据库的驱动程序。
为了能够在部署的时候把驱动程序也部署到服务器上,需要进行设置:
Ø 选择【Window】
à【Preferences…】
Ø 在左边选择【MyEclipse】
à【J2EE Projects】
à【Web Project】,在右边选择【Deployment】。出现下面的界面:
Ø 如图选择4个复选框中的第一个。这样部署的时候就会把我们添加在Builder Path中的类库部署到服务器上。
5、 创建与数据库进行交互的DBManager
创建包com.neu.cart.common,创建的方式与前面创建com.neu.cart包的过程一样。
创建类DBManager,参考代码如下:
package com.neu.cart.common;
import java.sql.*;
public class DBManager extends Object{
private Connection con = null;
private Statement stmt = null;
private ResultSet rs = null;
public void init()
{
try
{
Class.forName("com.mysql.jdbc.Driver");
//
加载驱动程序
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/bookstore","root","root");
//
创建连接
}catch(Exception e){}
}
//
获取连接
public Connection getConnection()
{
if(con == null)
init();
return con;
}
//
执行有结果集的查询
public int executeUpdate(String sql) throws SQLException
{
stmt = getConnection().createStatement();
return stmt.executeUpdate(sql);
}
public ResultSet executeQuery(String sql) throws SQLException
{
stmt = getConnection().createStatement();
return stmt.executeQuery(sql);
}
public void close()
{
if(rs!=null)
try {
rs.close();
} catch (SQLException e) { }
if(stmt!=null)
try {
stmt.close();
} catch (SQLException e) { }
if(con!=null)
try {
con.close();
} catch (SQLException e) { }
}
}
6、 创建表示物品信息的Good
创建包:com.neu.cart.vo
创建类Good
package com.neu.cart.vo;
public class Goods {
private String gid;
private String gname;
private float price;
private int quantity;
public String getGid() {
return gid;
}
public void setGid(String gid) {
this.gid = gid;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
}
7、 创建一个单独的欢迎界面
文件名:index.jsp
创建过程如下:
Ø 在工程上点击右键
Ø 在弹出的界面中选择【New】
à【JSP】,弹出界面如下:
Ø 在弹出的界面中设置两个信息:第一个是JSP文件的名字index.jsp,第二个是文件的模板,选择【Standard JSP using Struts 1.2】,点击【Finish】。
Ø 生成的代码如下:
<%@
page
language
=
"java"
pageEncoding
=
"UTF-8"
%>
<%@
taglib
uri
=
"http://struts.apache.org/tags-bean"
prefix
=
"bean"
%>
<%@
taglib
uri
=
"http://struts.apache.org/tags-html"
prefix
=
"html"
%>
<%@
taglib
uri
=
"http://struts.apache.org/tags-logic"
prefix
=
"logic"
%>
<%@
taglib
uri
=
"http://struts.apache.org/tags-tiles"
prefix
=
"tiles"
%>
<!
DOCTYPE
HTML
PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN"
>
<
html:html
locale
=
"true"
>
<
head
>
<
html:base
/>
<
title
>
index.jsp
</
title
>
<
meta
http-equiv
=
"pragma"
content
=
"no-cache"
>
<
meta
http-equiv
=
"cache-control"
content
=
"no-cache"
>
<
meta
http-equiv
=
"expires"
content
=
"0"
>
<
meta
http-equiv
=
"keywords"
content
=
"keyword1,keyword2,keyword3"
>
<
meta
http-equiv
=
"description"
content
=
"This is my page"
>
</
head
>
<
body
>
This a struts page.
<
br
>
</
body
>
</
html:html
>
Ø 把body中的代码替换成下面的代码即可:
<
html:link
action
=
"/buy.do"
>
我要购物!
</
html:link
>
8、 创建GoodsM
完成Goods相关的操作,创建model包。
创建GoodsM类,完成物品的管理。
package com.neu.cart.model;
import java.util.ArrayList;
import com.neu.cart.common.*;
import com.neu.cart.vo.*;
import java.sql.*;
public class GoodsM {
public ArrayList getGoodsList(int page)
{
DBManager dbm = new DBManager();
ArrayList list = new ArrayList();
try {
ResultSet rs = dbm.executeQuery("select * from goods");
while(rs.next())
{
Goods goods = new Goods();
goods.setGid(rs.getString(1));
goods.setGname(rs.getString(2));
goods.setPrice(rs.getFloat(3));
goods.setQuantity(rs.getInt(4));
list.add(goods);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
dbm.close();
return list;
}
public static Goods findGoodsById(String id)
{
DBManager dbm = new DBManager();
Goods goods = new Goods();
try {
StringBuffer sql = new StringBuffer();
sql.append("select * from goods where id='");
sql.append(id);
sql.append("'");
ResultSet rs = dbm.executeQuery(sql.toString());
while(rs.next())
{
goods.setGid(rs.getString(1));
goods.setGname(rs.getString(2));
goods.setPrice(rs.getFloat(3));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
dbm.close();
return goods;
}
}
9、 创建BuyAction及其配置信息
在MyElipse中创建的过程:
Ø 在工程上点击右键,在弹出点的界面上,选择【New】
à【Others…】
Ø 在弹出的界面中,选择【MyEclipse】
à【Web-Struts】
à【Struts1.2】
à【Struts1.2 Action】
Ø 在弹出的界面中输入以下信息:
n 在【Use case】后面输入buy,表示这个用例的名字。
n 【path】中输入“/buy”,表示访问的时候使用的路径,就是在index.jsp文件的超链中使用的内容。这个内容通常是根据use case自动生成的,不需要输入。
n 【Action Type】选择【Type】,也就是默认情况,其它相当于重定向和包含,这里是直接提交给Action处理。
n 【Action Impl】:选择【Create new Action class】,如果使用已经存在的类,选择后面的。
n 下面的内容选择默认即可。
Ø 配置跳转关系,在上面的界面中选择中间的【Forwards】,然后点击【Add】,弹出下面的界面:
Ø 【Name】后面输入success,是你为这个跳转关系起的名字,【Path】中输入要跳转到的JSP页面,当Action中选择了success的时候,就跳转到这个文件。点击【Add】完成添加。
Ø 点击【Finish】完成Action的创建。
Ø 创建之后的Action的名字是BuyAction,在execute方法中添加处理代码,修改之后的代码如下:
//Created by MyEclipse Struts
// XSL source (default): platform:/plugin/com.genuitec.eclipse.cross.easystruts.eclipse_3.9.210/xslt/JavaClass.xsl
package com.neu.cart.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.neu.cart.model.*;
import java.util.ArrayList;
/**
* MyEclipse Struts
* Creation date: 12-13-2005
*
* XDoclet definition:
* @struts:action validate="true"
* @struts:action-forward name="success" path="/buy.jsp"
*/
public class BuyAction extends Action {
// --------------------------------------------------------- Instance Variables
// --------------------------------------------------------- Methods
/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
GoodsM gm = new GoodsM();
ArrayList goods = gm.getGoodsList(1);
//
如果想进行分页显示,可以在此基础上修改
request.setAttribute("goods",goods);
return mapping.findForward("success");
}
}
功能分析:创建业务逻辑Bean GoodsM的对象,然后调用getGoodsList方法得到所有的物品列表,之后把物品列表保存到request中。最后,通过mapping的findForward方法选择“success”对应的界面对用户进行响应。“success”是前面配置的跳转关系。
10、 显示物品信息
创建buy.jsp,显示所有的物品信息。该文件的创建过程与前面的index.jsp的创建过程相同。只是显示物品信息的代码如下:
buy.jsp文件:
<
body
>
可以购买的物品有:
<
br
>
<
table
>
<
tr
>
<
TH
>
物品编号
</
TH
><
TH
>
物品名称
</
TH
><
TH
>
物品价格
</
TH
><
th
>
库存
</
th
><
TH
>
添加
</
TH
>
</
tr
>
<
logic:iterate
id
=
"element"
name
=
"goods"
>
<
tr
>
<
TD
><
bean:write
name
=
"element"
property
=
"gid"
/></
TD
>
<
TD
><
bean:write
name
=
"element"
property
=
"gname"
/></
TD
>
<
TD
><
bean:write
name
=
"element"
property
=
"price"
/></
TD
>
<
TD
><
bean:write
name
=
"element"
property
=
"quantity"
/></
TD
>
<
TD
><
html:link
action
=
"/add.do"
paramId
=
"gid"
paramName
=
"element"
paramProperty
=
"gid"
>
添加到购物车
</
html:link
></
TD
>
</
tr
>
</
logic:iterate
>
</
table
>
</
body
>
其中,<logic:iterate>标签用于迭代输出物品列表中的信息。name指出循环的对象,id表示其中的一个元素。
<bean:write>标签用于输出信息,name是对象的名字,property是对象的属性的名字。
<html:link>标签生成一个超链,提交add.do处理,传递一个参数,参数的名字是gid,参数的值通过paramName和paramProperty指出。意思是在点击【添加到购物车】这个超链的时候,把物品的id传递过去。
11、 创建业务逻辑,完成购物车的管理
创建包com.neu.cart.model。
创建类CartManager,创建的过程如下:
Ø 在包com.neu.cart.model上点击右键,选择【New】
à【Class】
Ø 在弹出的界面中输入类的名子CartManager即可。
Ø 之后,修改CartManager的代码如下:
package com.neu.cart.model;
import java.util.*;
import com.neu.cart.vo.*;
public class CartManager {
private ArrayList list;
public CartManager()
{
}
/*
* 向购物车中添加物品,参数是要添加的物品的编号,默认的一次添加一个。
*/
public ArrayList addGoods(String gid)
{
// 如果没有物品,直接创建该物品的对象,然后添加到购物车中
if(list == null)
{
System.out.println("Method:addGoods");
Goods goods = GoodsM.findGoodsById(gid);
System.out.println("godds"+goods.getGid());
goods.setQuantity(1);
list = new ArrayList();
list.add(goods);
}
else
{
int i=0;
boolean find = false;
// 查找购物车中是否存在要添加的物品,如果存在直接修改购物车
// 中物品的数量,如果不存在,则添加这个物品
for(;i<list.size();i++)
{
Goods goods = (Goods)list.get(i);
if(goods.getGid().equals(gid))
{
goods.setQuantity(goods.getQuantity()+1);
//如果已经存在,修改数量
list.set(i,goods);
find = true;
break;
}
}
if(!find)
{
Goods goods = GoodsM.findGoodsById(gid);
goods.setQuantity(1);
list.add(goods);
}
}
System.out.println("元素:"+list.size());
return list;
}
/*
* 删除购物车中的信息,参数是要删除的物品的编号。
* 删除的过程:首先查找这个物品,查找到这个物品之后,使用List的remove方法删
* 除。
*/
public ArrayList deleteGoods(String gid)
{
if(list == null)
return null;
for(int i=0;i<list.size();i++)
{
Goods goods = (Goods)list.get(i);
if(goods.getGid().equals(gid))
{
list.remove(i);
break;
}
}
return list;
}
/*
*更新物品的数量,第一个参数是要更新的物品的编号,第二个参数是更新后的物品的
*数量。首先查找这个物品,查找到之后修改数量,然后再更新的到链表中。
*/
public ArrayList updateGoods(String gid,int quantity)
{
if(list == null)
return null;
for(int i=0;i<list.size();i++)
{
Goods goods = (Goods)list.get(i);
if(goods.getGid().equals(gid))
{
goods.setQuantity(quantity);
list.set(i,goods);
break;
}
}
return list;
}
// 返回购物信息
public getList(){return list;}
}
12、 创建AddAction
这个Action的创建过程与前面的BuyAction的创建过程基本相同。execute方法中的主要代码如下:
// 得到session对象,购物车对象存储在session中
HttpSession session = request.getSession();
// 从session中获取到购物车对象
Object o = session.getAttribute("cart");
CartManager cart = null;
if(o == null)
{
cart = new CartManager();
}
else
cart = (CartManager)o;
// 得到要添加的物品的id
String gid = request.getParameter("gid");
// 如果没有物品id,直接跳转到buy.jsp
if(gid==null)
return mapping.findForward("success");
// 把这个物品添加到购物车中
cart.addGoods(request.getParameter("gid"));
// 把购物车重新保存到session中
session.setAttribute("cart",cart);
// 创建消息对象
ActionMessages errors = new ActionMessages();
// 把操作成功的信息写到errors对象中
errors.add("operation",new ActionMessage("message.operation.add"));
// 保存存储信息
this.saveErrors(request,errors);
// 返回选择物品的界面
return mapping.findForward("success");
13、 修改JSP文件buy.jsp,增加代码来显示购物车中的信息
购物车中的物品:
<
br
>
<
table
>
<
tr
>
<
TH
>
物品编号
</
TH
><
TH
>
物品名称
</
TH
><
TH
>
物品价格
</
TH
><
th
>
数量
</
th
><
TH
>
添加
</
TH
>
</
tr
>
<
logic:iterate
id
=
"element"
name
=
"cart" property="list"
>
<
tr
>
<
html:form
action
=
"/update.do"
method
=
"post"
>
<
html:hidden
property
=
"gid"
name
=
"element"
/>
<
TD
><
bean:write
name
=
"element"
property
=
"gid"
/></
TD
>
<
TD
><
bean:write
name
=
"element"
property
=
"gname"
/></
TD
>
<
TD
><
bean:write
name
=
"element"
property
=
"price"
/></
TD
>
<
TD
><
html:text
property
=
"quantity"
name
=
"element"
></
html:text
>
</
TD
>
<
TD
><
html:submit
property
=
"action"
value
=
"update"
/><
html:submit
property
=
"action"
value
=
"delete"
/></
TD
>
</
html:form
>
</
tr
>
</
logic:iterate
>
</
table
>
14、 创建UpdateAction和UpdateForm
与AddAction非常类似,自己完成。
15、 进行异常处理
主要是对修改时候输入的数量进行验证。
另外对各种操作的结果进行提示。
附:Form的创建过程
Ø 选择【New】
à【Others…】,弹出下面的界面:
Ø 选择【MyEclipse】
à【Web-Struts】
à【Struts1.2】
à【Struts1.2 Form】
Ø 在这个界面输入相关信息
n Use case:使用update,更新购物车时候使用这个这个form,更新购物车对应的是action的use case是update。
n Name:form的名字,输入use case之后,自动生成,可以不改。
n Form Impl:选择第一个,表示创建一个新的Form
n SuperClass:采用默认值即可。
n Form Type:这个form对应的类文件,也就是创建的ActionForm
Ø 如果要给form添加属性
n 可以选择下面的Form Properties,然后选择【Add】
n 在弹出的界面中配置属性的名字、类型、和输入类型(对应的表单元素的类型)。有多少个属性,添加多少次就可以了。
Ø 设置Form的方法
n 可以选择【Methods】,然后看到下面的界面,选择默认值即可。
Ø 可以根据Form创建JSP文件
n 选择上面的界面中的【JSP】,出现下面的界面:
n 把复选框【Create JSP form】选中,然后在输入jsp文件的名字。我们这里不需要。