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,增加代码来显示购物车中的信息 Ø 创建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文件的名字。我们这里不需要。