在开发购物车之前,首先要把几个关键类之间的关系理清楚
首先各个类的意义:1.Product产品2.User用户3.Order订单4.OrderItem订单项前3者都好理解,订单项需要解释一下。比如阁下在某宝下了一次订单,这个订单包括了
苹果3个
蜡烛2个
玩具4个
一条记录就是一个订单项,对应一种商品,以及购买数量。
1.产品和订单项的关系是一对多一种产品,对应多条订单项。一条订单项,对应一种产品2.订单项和订单的关系多对一一个订单里有多条订单项一个订单项,只会出现在一个订单里3.订单和用户的关系:多对一一个订单,只能属于一个用户一个用户,可以下多个订单
在开始之前,需要做一些数据库方面的准备工作.
1.创建数据库cart
2.在cart数据库中创建表product
3.为product准备4条数据
4.在cart数据库中创建表user
5.为user准备1条数据
6.创建order表,里面有一个uid字段用于表明该订单属于哪个用户(注:order是关键字,不能直接用作表名,通常的做法是加一个下划线order_)7.创建orderitem,表里有id,pid,num,oid等字段。分别表示主键,商品对应的id,购买数量以及订单id
注:插入中文的时候,如果失败,要记得把表的编码方式修改为UTF-8
创建数据库:
createdatabasecart;创建product表:
DROPTABLEIFEXISTS`product`;CREATETABLE`product`(`id`int(11)DEFAULTNULL,`name`varchar(50)DEFAULTNULL,`price`floatDEFAULTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf8;插入四条数据:
insertintoproductvalues(1,'黑色的丝袜',500);insertintoproductvalues(2,'相机',2500);insertintoproductvalues(3,'电动牙刷',180);insertintoproductvalues(4,'蜡烛',0.20);创建user表:
createtableuser(idint,namevarchar(50),passwordvarchar(50))ENGINE=InnoDBDEFAULTCHARSET=utf8;插入一条数据:
insertintouservalues(1,'tom','123');创建order表和orderItem表:
createtableorder_(idintAUTO_INCREMENT,uidint,primarykey(id));createtableorderitem(idintAUTO_INCREMENT,pidint,numint,oidint,primarykey(id));创建实体类创建Product类
packagebean;publicclassProduct{privateintid;privateStringname;privatefloatprice;publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicfloatgetPrice(){returnprice;}publicvoidsetPrice(floatprice){this.price=price;}}创建user类:
packagebean;publicclassUser{privateintid;privateStringname;privateStringpassword;publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}}创建OrderItem类:
packagebean;publicclassOrderItem{privateintid;privateProductproduct;privateintnum;privateOrderorder;publicOrdergetOrder(){returnorder;}publicvoidsetOrder(Orderorder){this.order=order;}publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicProductgetProduct(){returnproduct;}publicvoidsetProduct(Productproduct){this.product=product;}publicintgetNum(){returnnum;}publicvoidsetNum(intnum){this.num=num;}}创建Order类:
packagebean;publicclassOrder{intid;Useruser;publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicUsergetUser(){returnuser;}publicvoidsetUser(Useruser){this.user=user;}}创建DAO类
(记得导入数据库驱动包)
ProductDAO提供对Product的查询:
因为购买的时候,提交到服务器的是pid,而OrderItem类的product属性是一个Product类型所以ProductDAO需要根据id获取Product对象
packagedao;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importbean.User;publicclassUserDAO{publicstaticvoidmain(String[]args){System.out.println(newUserDAO().getUser("tom","123").getId());}publicUsergetUser(Stringname,Stringpassword){Userresult=null;try{Class.forName("com.mysql.jdbc.Driver");Connectionc=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/cartcharacterEncoding=UTF-8","root","admin");Stringsql="select*fromuserwherename=andpassword=";PreparedStatementps=c.prepareStatement(sql);ps.setString(1,name);ps.setString(2,password);ResultSetrs=ps.executeQuery();if(rs.next()){result=newUser();result.setId(rs.getInt(1));result.setPassword(password);result.setName(name);}ps.close();c.close();}catch(ClassNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}returnresult;}}OrderDAO:
packagedao;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importbean.Order;publicclassOrderDAO{publicvoidinsert(Ordero){try{Class.forName("com.mysql.jdbc.Driver");Connectionc=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/cartcharacterEncoding=UTF-8","root","admin");Stringsql="insertintoorder_values(null,)";PreparedStatementps=c.prepareStatement(sql);ps.setInt(1,o.getUser().getId());ps.execute();ResultSetrs=ps.getGeneratedKeys();if(rs.next()){intid=rs.getInt(1);o.setId(id);}ps.close();c.close();}catch(ClassNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}OrderItemDAO:
创建商品展示页面listProduct.jsp:
显示购物车内容listOrderItem.jsp:
其中添加生成用户订单功能
点击生成订单后,在数据库中的orderitem表观察到插入的数据
UserLoginServlet:
登陆Servlet,通过name和password获取user对象如果对象不为空,就表示账号密码正确,跳转到产品显示界面/listProduct如果对象为空,就跳转到登陆界面,重新登陆
ProductListServlet的作用是通过ProductDAO把product从数据库查出来,然后通过listProduct.jsp显示出来
购买行为本身就是创建一个OrderItem对象在负责购买商品的OrderItemAddServlet中,进行如下流程1.获取购买数量2.获取购买商品的id3.根据id获取商品对象4.创建一个新的OrderItem对象5.从session中取出一个List,这个List里面存放陆续购买的商品。如果是第一次从session中获取该List,那么它会是空的,需要创建一个ArrayList6.把新创建的OrderItem对象放入该List中7.跳转到显示购物车的listOrderItem
(在遇到购买相同物品时,遍历session中所有的OrderItem,如果找到对应的product.id一样的条目,就调整其数量,如果没有找到,就新增加一条)
显示购物车的OrderItemListServlet其实什么也没做,因为数据已经在session准备好了,直接服务端跳转到listOrderItem.jsp在listOrderItem.jsp中,从session中遍历出所有的OrderItem。因为保存在OrderItem上的是一个Product对象,所以很容易就可以通过EL表达式遍历出商品的名称和价格。
OrderCreateServlet创建订单的Servlet1.首选判断用户是否登陆,如果没有登陆跳转到登陆页面2.创建一个订单对象,并设置其所属用户3.把该订单对象保存到数据库中4.遍历session中所有的订单项,设置他们的Order。然后保存到数据库中5.清空session中的订单项6.最后打印订单创建成功