购物商城shopping连载(10)
来源:互联网 发布:淘宝开店需要哪些软件 编辑:程序博客网 时间:2024/05/29 15:01
购物车的跳转
点击添加到购物车,进行页面跳转
这里被红框框住的就是要提交的一个表单
跳转路径:productXQ.jsp
action="${pageContext.request.contextPath}/cart_addCart.do"
添加商品(购物项)到购物车
要提交的表单1.需要传入数量。2.商品pid
数量可以根据name属性在CartAction中通过属性驱动获得,pid应该通过hidden来传递
<input type="hidden" name="pid" value="<s:property value="pid"/>"
完整的form表单
<form action="${pageContext.request.contextPath}/cart_addCart.do" method="post"> <input type="hidden" name="pid" value="<s:property value="pid"/>"/> <div class="action"> <dl class="quantity"> <dt>购买数量:</dt> <dd> <input id="count" name="count" value="1" maxlength="4" type="text" /> <div> <span id="increase" class="increase"> </span> <span id="decrease" class="decrease"> </span> </div> </dd> <dd>件</dd> </dl> <div class="buy"> <input id="addCart" class="addCart" value="加入购物车" type="submit" /> </div> </div> </form>
CartAction:
//属性驱动,接收前台传来的参数 // 购物车接收商品的id private long pid; // 购物车接收商品的数量 private int count; //省略setter getter方法
因为点击提交按钮form表单提交的方法是addCart方法
即:
// 添加商品到购物车 public String addCart() { // System.out.println("商品的id"+pid); 成功接收 // System.out.println("商品的个数"+count); 成功接收 // 封装CartItem对象 CartItem cartItem = new CartItem(); // 设置商品信息 Product product = productService.getById(pid); cartItem.setProduct(product); // 设置数量 cartItem.setCount(count); // 将购物项添加到购物车 /** * Cart cart = new Cart();<br> * cart.addCart(cartItem);<br> * 说下为什么不能new 一个购物车用addCart方法来添加购物项<br> * 因为用户每次点击添加商品到购物车都会new一个新的购物车,<br> * 所有最后显示的就是最后一次添加的,这样肯定不行,应该把购物车存在session中<br> * 购物车应该存在session中 */ // 从session中获得购物车 Cart cart = getCartFormSession(); // 把购物项保存到购物车中 cart.addCart(cartItem); return "cart"; }
添加到购物车就是把一个购物项添加到购物车,就是为CartItem对象赋值,这里还需要注入@Autowired private ProductService productService;
来通过pid查找该商品。
这里说明下为什么Cart购物车不能New,因为用户每次添加商品到购物车访问这个addCart方法都会新建一个Cart对象,这样就会导致购物车里显示的是最后一次添加的购物项,所以购物车应该存在session中,从session中获取,判断如果session中有购物车就向购物车中添加购物项,如果没有,则创建购物车。
这里的getCartFormSession();
方法就是从session中拿到购物车。
// 从session中获得购物车 private Cart getCartFormSession() { // 先从session中找,如果有则直接返回购物车,如果没有则创建 Cart cart = (Cart) ServletActionContext.getRequest().getSession() .getAttribute("cart"); if (cart == null) { // 如果session中没有购物车,则创建新的购物车,并保存到session中 cart = new Cart(); ServletActionContext.getRequest().getSession() .setAttribute("cart", cart); } return cart; }
进入这个getCartFormSession(),先从session中取,如果session中有购物车,则返回。如果没有,则新建一个购物车,并保存到session中。
struts:
<!-- 购物车模块 --> <action name="cart_*" method="{1}" class="cartAction"> <result name="cart">/WEB-INF/jsp/cart.jsp</result> <result name="clearCat">/WEB-INF/jsp/cart.jsp</result> <result name="deleteCartItem">/WEB-INF/jsp/cart.jsp</result> </action>
点击“添加到购物车”成功完成。
清空购物车
调用的方法是:
<a href="${ pageContext.request.contextPath }/cart_clearCart.do" id="clear" class="clear">清空购物车</a>
访问的是clearCart方法
1.从session中获取购物车
2.clear掉map
// 清空购物车 public String clearCart() { // 获得购物车对象 Cart cart = getCartFormSession(); //清空购物车 cart.clearCart(); return "clearCat"; }
clearCart()方法在Cart类中定义
// 3.清空购物车 public void clearCart() { // 清空所有购物项 map.clear(); // 总计置为0 total = 0; }
清空购物车可以成功实现,但是清空后,还有表单按钮显示在页面上,因此我们通过<s:if>
标签来判断,如果购物车中的购物项长度不为0 时显示什么界面,为0 时显示什么界面。因为ognl表达式支持调用对象方法,所有这样写:
Cart.jsp
<!--判断如果清空购物车则不显示此内容及表单按钮 --> <s:if test="#session.cart.cartItems.size()!=0">
如果为0 则显示:
<s:else> <div class="span24"> <div class="step step1"> <h3>亲!您还没有购物!请先去购物!</h3> </div> </div> </s:else>
完整代码:
<div class="container cart"> <!--判断如果清空购物车则不显示此内容及表单按钮 --> <s:if test="#session.cart.cartItems.size()!=0"> <div class="span24"> <div class="step step1"></div> <table> <tbody> <tr> <th>图片</th> <th>商品</th> <th>价格</th> <th>数量</th> <th>小计</th> <th>操作</th> </tr> <!-- 遍历购物项 --> <!-- 从session中获得购物车,再从购物车中拿到购物项的集合 --> <s:iterator value="#session.cart.cartItems" var="cartItem"> <tr> <td width="60"><input type="hidden" name="id" value="22"> <img src="${ pageContext.request.contextPath }/<s:property value="#cartItem.product.image"/>" /> </td> <td><a target="_blank"><s:property value="#cartItem.product.pname" /> </a> </td> <td> <!-- 价格 --> <s:property value="#cartItem.product.shop_price" /> </td> <td class="quantity" width="60"> <!-- 数量 --> <s:property value="count" /></td> <td width="140"> <!-- 小计 --> <span class="subtotal"> <s:property value="#cartItem.subtotal" /> </span></td> <td><a href="${ pageContext.request.contextPath }/cart_deleteCartItem.do?pid= <s:property value="#cartItem.product.pid" />" class="delete">删除</a> </td> </tr> </s:iterator> </tbody> </table> <dl id="giftItems" class="hidden" style="display: none;"> </dl> <div class="total"> <em id="promotion"></em> <em> 登录后确认是否享有优惠 </em> 赠送积分: <em id="effectivePoint"><s:property value="#session.cart.total" /> </em> 商品金额: <strong id="effectivePrice"> ¥<s:property value="#session.cart.total" />元 </strong> </div> <div class="bottom"> <a href="${ pageContext.request.contextPath }/cart_clearCart.do" id="clear" class="clear">清空购物车</a> <a href="./会员登录.htm" id="submit" class="submit">提交订单</a> </div> </div> </s:if> <s:else> <div class="span24"> <div class="step step1"> <h3>亲!您还没有购物!请先去购物!</h3> </div> </div> </s:else> </div>
移除一项购物项
要移除必须传一个商品id
<a href="${ pageContext.request.contextPath }/cart_deleteCartItem.do?pid= <s:property value="#cartItem.product.pid" />" class="delete">删除</a>
访问的是deleteCartItem方法:
1.从session中取出购物车
2.通过key找到这个map对象
3.移除
//移除购物项 public String deleteCartItem(){ //获得购物车对象 Cart cart = getCartFormSession(); cart.removeCart(pid); return "deleteCartItem"; }
removeCart方法在Cart类中
// 2.移除一个购物项' public void removeCart(long pid) { // 将购物项移除购物车 CartItem cartItem = map.remove(pid);// 返回移除的对象 // 总计=总结-移除购物项小计 total = total - cartItem.getSubtotal(); }
到这里移除一条购物项也做完了,后期改动的时候可以通过ajax异步请求做,这里暂时先这么处理。
session序列化异常
session销毁的三种方式
1.超时 30min
2.服务器非正常关闭
3.手动调用session的invalidate方法
什么是非正常关闭服务器:
那什么又是正常关闭服务器:
这样停止服务器,就是正常关闭服务器。
正常关闭服务器session不销毁。
正常关闭服务器,session会存在硬盘上,那么你保存在session中的对象:比如用户,一级分类,购物车就会被序列化到本地磁盘中。
如果正常关闭服务器,服务器才会序列化session,这里就是tomcat会去序列化后保存到tomcat/work/Catalina/localhost/shopping下的session文件。
当你再次启动服务器时,这个文件就会被反序列化,如果你的User类,一级分类和购物车没有实现反序列化,则控制台就会报错。
所以应该把保存到session中的对象实现序列化接口。
public class Category implements Serializable{
点击我的购物车跳转
JSP跳转路径
<a href="${ pageContext.request.contextPath }/cart_myCart.do">购物车</a>
action:
//我的购物车 public String myCart(){ //完成页面跳转 return "myCart"; }
- 购物商城shopping连载(10)
- 购物商城shopping连载(2)
- 购物商城shopping连载(1)
- 购物商城shopping连载(3)
- 购物商城shopping连载(4)
- 购物商城shopping连载(5)
- 购物商城shopping连载(6)
- 购物商城shopping连载(7)
- 购物商城shopping连载(8)
- 购物商城shopping连载(9)
- 购物商城shopping连载(11)
- Shopping+在线购物商城的实现(Spring+SpringMVC+Hibernate)(附源码)
- shopping 购物 (树型dp)
- Shopping 购物
- Shopping商店购物
- 购物商城---购物车,结算
- 购物车shopping-cart问题
- 研究购物商城网站
- VS2013+OpenCV3.0编译CMT跟踪算法
- (OK) Linux epoll模型—socket epoll server client chat
- PHP基础整理5
- SSH公钥生成以及各主机间的无密码登录
- ADO.NET
- 购物商城shopping连载(10)
- 云主机主机名修改
- Signal ()函数详细介绍 Linux函数
- Qt中读写xml文件
- uva11478 Halum【二分+差分约束】
- genymotion登入老报unknown generic error
- 装修过程中的经典工序流程图(三)
- cocos2d-JS (二)Cocos Creater
- HDU1016——Prime Ring Problem(dfs,输入格式)