购物商城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">&nbsp;</span> <span                                    id="decrease" class="decrease">&nbsp;</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";    }
0 0
原创粉丝点击