提供显示购物车商品的Servlet
//先判断该用户是否登陆了
Useruser=(User)request.getSession().getAttribute("user");
if(user==null){
request.setAttribute("message","您还没有登陆呢!");
request.getRequestDispatcher("/message.jsp").forward(request,response);
return;
}
//如果登陆了.....
Cartcart=(Cart)request.getSession().getAttribute("cart");
//把该用户的购物车给JSP页面显示
request.setAttribute("cart",cart);
request.getRequestDispatcher("/client/listCart.jsp").forward(request,response);
显示购物车的JSP页面
<c:iftest="${empty(cart.map)}">
您还没有购买过任何商品哦!!!
</c:if>
<tableborder="1px">
<c:iftest="${!empty(cart.map)}">
<h1>您购物车下有如下的商品:</h1><br>
<tr>
<td>书名:</td>
<td>作者:</td>
<td>数量:</td>
<td>价钱:</td>
</tr>
<c:forEachitems="${cart.map}"var="cartItme">
<tr>
<td>${cartItme.value.book.name}</td>
<td>${cartItme.value.book.author}</td>
<td>${cartItme.value.quantity}</td>
<td>${cartItme.value.price}</td>
</tr>
</c:forEach>
</c:if>
</table>
效果:
订单模块
在前台用户界面中,当用户要把购物车付款时,应该提供生成订单的超链接....
设计订单实体
订单应该包含id,收货人信息,下单的时间,订单的总价,订单的状态【有无发货】..而不应该包含商品的信息的。商品的信息用一个专门的”订单项“来表示
一个订单对应多个订单项,这是一对多的关系!
privateStringid;
//下单的时间、日期、状态
privateDatedate;
privatedoubleprice;
privatebooleanstate;
//一个用户可以有多个订单,把用户记住
privateStringuser_id;
//一个订单中有多个订单项
privateSet<OrderItem>items=newHashSet<>();
//各种的setter和getter
设计订单项实体
privateStringid;
//一本书对应多个订单项,订单项一定是由书组成,记住书
privateStringbook_id;
privatedoubleprice;
privateintquantity;
//各种的setter和getter
设计数据库表
- 订单表
mysql不能创建名为”order”的表,后边加个s就可以
CREATETABLEorders(
id VARCHAR(40)PRIMARYKEY,
date DATE NOTNULL,
user_idVARCHAR(40)NOTNULL,
state BOOLEAN,
price DOUBLE,
CONSTRAINTuser_id_FKFOREIGNKEY(user_id)REFERENCESuser(id)
);
- 订单项表:
CREATETABLEorderItem(
id VARCHAR(40)PRIMARYKEY,
price DOUBLE,
quantityINT,
order_idVARCHAR(40),
book_id VARCHAR(40),
CONSTRAINTorder_id_FKFOREIGNKEY(order_id)REFERENCESorders(id),
CONSTRAINTbook_id_FKFOREIGNKEY(book_id)REFERENCESbook(id)
);
- 表之间的结构:
设计Dao
publicclassOrderDaoImplimplementszhongfucheng.dao.OrderDao{
@Override
publicvoidaddOrder(Orderorder){
QueryRunnerqueryRunner=newQueryRunner(Utils2DB.getDataSource());
Stringsql1="INSERT INTO orders(id,ordertime,user_id,state,price) VALUES(?,?,?,?,?)";
try{
//订单的基本信息
queryRunner.update(sql1,newObject[]{order.getId(),order.getOrdertime(),order.getUser_id(),order.isState(),order.getPrice()});
//订单项的信息
Stringsql2="INSERT INTO orderItem(id,price,quantity,order_id,book_id) VALUES(?,?,?,?,?)";
Set<OrderItem>items=order.getItems();
for(OrderItemitem:items){
queryRunner.update(sql2,newObject[]{item.getId(),item.getPrice(),item.getQuantity(),item.getOrder_id(),item.getBook_id()});
}
}catch(SQLExceptione){
thrownewRuntimeException(e);
}
}
@Override
publicOrderfindOrder(Stringid){
QueryRunnerqueryRunner=newQueryRunner(Utils2DB.getDataSource());
Orderorder;
try{
//找出订单的基本信息
Stringsql="SELECT * FROM orders WHERE id=?";
order=(Order)queryRunner.query(sql,newBeanHandler(Order.class),newObject[]{id});
//找出订单的所有订单项
Stringsql2="SELECT * FROM orderItem WHERE order_id=?";
List<OrderItem>list=(List<OrderItem>)queryRunner.query(sql2,newBeanListHandler(OrderItem.class),newObject[]{order.getId()});
System.out.println("这是数据库拿到的list集合:"+list.size());
//将所有订单项装到订单里边
order.getItems().addAll(list);
System.out.println("这是数据库拿到的"+order.getItems().size());
//找出该订单是属于哪一个用户的
Stringsql3="SELECT * FROM orders o,user u WHERE o.user_id=u.id AND o.id=? ";
Useruser=(User)queryRunner.query(sql3,newBeanHandler(User.class),newObject[]{order.getId()});
order.setUser_id(user.getId());
returnorder;
}catch(SQLExceptione){
thrownewRuntimeException(e);
}
}
//更新订单的状态
publicvoidupdateState(Stringid){
QueryRunnerqueryRunner=newQueryRunner(Utils2DB.getDataSource());
Stringsql="UPDATE orders SET state=? WHERE id=?";
try{
queryRunner.update(sql,newObject[]{true,id});
}catch(SQLExceptione){
thrownewRuntimeException(e);
}
}
//查看已经发货或没发货的订单信息
publicList<Order>getAllOrder(booleanstate){
QueryRunnerqueryRunner=newQueryRunner(Utils2DB.getDataSource());
Stringsql="SELECT * FROM orders WHERE state=? ";
try{
return(List<Order>)queryRunner.query(sql,newBeanListHandler(Order.class),newObject[]{state});
}catch(SQLExceptione){
thrownewRuntimeException(e);
}
}
//通过用户的id查找用户的订单,可能不止一个
publicList<Order>findUserOrder(Stringuser_id){
QueryRunnerqueryRunner=newQueryRunner(Utils2DB.getDataSource());
Stringsql="SELECT * FROM orders WHERE user_id=? ";
try{
returnList<Order>queryRunner.query(sql,newBeanHandler(Order.class),newObject[]{user_id});
}catch(SQLExceptione){
thrownewRuntimeException(e);
}
}
}
二次更新
在编写dao的时候,尤其是Add方法。它是将所有数据都封装到Order对象上,然后取出数据,把数据插入到数据表中
- 其实,我们的Order和OrderItem的操作可以分开。OrderItem也可以另外编写一个Dao,那么我们在插入完Order对象之后,得到Order对象返回的主键,再调用OrderItemDao的方法来插入OrderItem的数据,这样我觉得会让代码清晰一些。
- 在OrderItemDao中接收的是一个List,因为我们一个订单会对应多个订单项。
抽取成DAO接口
publicinterfaceOrderDao{
voidaddOrder(Orderorder);
OrderfindOrder(Stringid);
List<Order>getAllOrder(booleanstate);
voidupdateState(Stringuser_id);
List<Order>findUserOrder(Stringuser_id);
}
BussinessService
privateOrderDaoorderDao=DaoFactory.getInstance().createDao("zhongfucheng.dao.impl.OrderDaoImpl",OrderDao.class);
publicvoidcreateOrder(Cartcart,Useruser){
//订单的基本信息
Stringorder_id=WebUtils.makeId();
Orderorder=newOrder();
order.setId(order_id);
order.setPrice(cart.getPrice());
order.setOrdertime(newDate());
order.setState(false);
order.setUser_id(user.getId());
//订单项的基本信息
//得到每个购物项,购物项就作为订单项
for(Map.Entry<String,CartItem>me:cart.getMap().entrySet()){
OrderItemorderItem=newOrderItem();
CartItemcartItem=me.getValue();
orderItem.setId(WebUtils.makeId());
orderItem.setPrice(cartItem.getPrice());
orderItem.setBook_id(cartItem.getBook().getId());
orderItem.setQuantity(cartItem.getQuantity());
orderItem.setOrder_id(order_id);
order.getItems().add(orderItem);
}
orderDao.addOrder(order);
}
publicOrderfindOrder(Stringuser_id){
returnorderDao.findOrder(user_id);
}
publicList<Order>getAllOrder(booleanstate){
returnorderDao.getAllOrder(state);
}
publicvoidsendOutOrder(Stringid){
orderDao.updateState(id);
}
publicList<Order>findUserOrder(Stringuser_id){
returnorderDao.findUserOrder(user_id);
}