基于struts的购物车(转)

本文介绍了一个简单的购物车系统的实现过程,包括购物车的基本功能、所需文件及其实现方式,详细展示了从创建数据库到实现购物车增删改查的全过程。

来源:http://blog.youkuaiyun.com/JavaEETeacher/archive/2007/09/29/1806692.aspx

第一部分:购物车的基本功能

从已有的物品列表中选择物品添加到购物车;

可以修改购物车中的物品数量;

可删除购物车中的物品;

可以结账。

 

通常购物车还有的功能包括:根据购物车生成订单、添加邮寄信息等。这些功能相对比较简单,所以不在这里实现。

 

第二部分:实现

       实例包括以下文件:

文件名

主要内容

作用

生成方式

index.jsp

一个超链,链接到购物页面

进入购物页面

使用向导,然后添加代码

DBManager

封装了建立与数据库的连接,执行各种SQL语句的方法

完成与数据库之间的交互

代码完全手写

Good

封装了物品的基本信息,包括

作为值对象在各个层之间传递

代码完全手写

GoodsM

业务逻辑,封装了查询所有物品信息的方法,以及根据编号查询物品信息的方法

管理物品信息,主要查询物品信息

代码完全手写

CartManager

向购物车添加物品,从购物车删除物品,修改购物车中的物品

管理购物车

代码全部手写

BuyAction

根据用户选择的物品编号,把选择的物品添加到购物车中。

购买物品

使用向导,然后修改代码

buy.jsp

显示已有物品的列表,显示购物车中物品信息,物品列表后面有添加购物车的功能,购物车信息后面有修改购物车信息的功能。

显示物品,显示购物车,可以通过这个界面添加、修改购物车信息。

先使用向导生成,然后添加物品信息列表,然后再添加购物车管理功能。

UpdateForm

包含物品编号和物品数量信息,以及验证的方法

完成更新的时候使用

向导生成,然后修改

web.xml

核心控制器ActionServlet的声明,访问方式的声明

完成核心控制器的配置

通过向导生成

struts-config.xml

声明ActionForm,声明Action,声明映射关系

ActionServlet共同完成控制功能

多数内容是通过向导生成的

       所涉及的文件之间的关系如下:

 

 

DB

 

DBManager

 

GoodsM

 

BuyAction

 

index.jsp

 

buy.jsp

 

goods

显示所有物品信息

DB

 

DBManager

 

GoodsM

 

buy.jsp

 

Good

 

cart

 

AddAction

 

goods

向购物车中添加信息

DB

 

DBManager

 

GoodsM

 

buy.jsp

 

Good

 

cart

 

AddAction

 

goods

修改购物车中的信息

       基本过程如下:

Ø         创建数据库

Ø         创建表

Ø         向表中插入测试数据

Ø         创建工程

Ø         创建与数据库进行交互的DBManager

Ø         创建表示物品信息的Good

Ø         创建一个单独的欢迎界面index.jsp

Ø         创建管理物品信息的GoodsM

Ø         创建BuyAction及其配置信息

Ø         创建buy.jsp,显示物品信息

Ø         创建CartManager,用于管理购物车

Ø         创建AddAction,完成物品的添加Action

Ø         修改JSP文件buy.jsp,增加代码来显示购物车中的信息

Ø         创建UpdateActionUpdateForm

Ø         进行异常处理

在最后添加了一部分内容:如何在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中。最后,通过mappingfindForward方法选择“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,参数的值通过paramNameparamProperty指出。意思是在点击【添加到购物车】这个超链的时候,把物品的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;

}

/*

* 删除购物车中的信息,参数是要删除的物品的编号。

* 删除的过程:首先查找这个物品,查找到这个物品之后,使用Listremove方法删

* 除。

*/

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              创建UpdateActionUpdateForm

AddAction非常类似,自己完成。

15              进行异常处理

主要是对修改时候输入的数量进行验证。

另外对各种操作的结果进行提示。

 

附:Form的创建过程

Ø         选择【NewàOthers…】,弹出下面的界面:

 

Ø         选择【MyEclipseàWeb-StrutsàStruts1.2àStruts1.2 Form

 

Ø         在这个界面输入相关信息

n         Use case:使用update,更新购物车时候使用这个这个form,更新购物车对应的是actionuse caseupdate

n         Nameform的名字,输入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文件的名字。我们这里不需要。

 

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值