Spring自带的JPetStore分析(四)

购物系统这部分由加入购物车addItemToCart.do,从购物车移出removeItemFromCart.do,更新购物车updateCartQuantities.do,购物明细checkout.do,下订单newOrderForm.do,订单明细newOrder.do组成。
加入购物车addItemToCart.do
<action path="/shop/addItemToCart" type="org.springframework.samples.jpetstore.web.struts.AddItemToCartAction"
  name="cartForm" scope="session"
  validate="false">
  <forward name="success" path="/WEB-INF/jsp/struts/Cart.jsp"/>
</action>
这个action先获取当前的购物车对象Cart和当前操作的物品id(workingItemId)判断当前操作物品是否在cart中,然后加入cart对象中。

CartActionForm是如何从jsp页面中取得cart对象和workingItemId的呢?
workingItemId是url的参数,struts可以很容易获取。
带有addItemToCart功能的jsp页面有Item.jsp和Product.jsp,而这两个页面都没有form。
而如果没有对应的cart,Struts将对cart进行初始化,这里是创建cart对象。
public void addItem(Item item, boolean isInStock) {
  CartItem cartItem = (CartItem) itemMap.get(item.getItemId());
    if (cartItem == null) {
      cartItem = new CartItem();
      cartItem.setItem(item);
      cartItem.setQuantity(0);
      cartItem.setInStock(isInStock);
      itemMap.put(item.getItemId(), cartItem);
      itemList.getSource().add(cartItem);
    }
  cartItem.incrementQuantity();
}
第一次调用这个方法的时候,itemMap是null,于是获取不到任何CartItem,于是创建一个新的CartItem,放入cartItem和itemList中,数量加1。

然后就是转到显示购物车的页面cart.jsp,这个页面被多次重用了,MVC思想的优势之一。
这里有个错误,就是分页的时候,previous和next的显示不正确,应该改成:
<center>
  <c:if test="${!cartForm.cart.cartItemList.firstPage}">
    <a href="<c:url value="viewCart.do?page=previousCart"/>"><font color="green"><B>&lt;&lt; Prev</B></font></a>
  </c:if>
  <c:if test="${!cartForm.cart.cartItemList.lastPage}">
    <a href="<c:url value="viewCart.do?page=nextCart"/>"><font color="green"><B>Next &gt;&gt;</B></font></a>
  </c:if>
</center>
这里可以更新购物车,从购物车中移除商品,
结帐shop/checkout.do
<action path="/shop/checkout" type="org.springframework.samples.jpetstore.web.struts.ViewCartAction"
  name="cartForm" scope="session"
  validate="false">
  <forward name="success" path="/WEB-INF/jsp/struts/Checkout.jsp"/>
</action>
这里和shop/viewcart.do使用的是同一个类org.springframework.samples.jpetstore.web.struts.ViewCartAction,但forward的jsp页面不同。
下一步是:shop/newOrderForm.do
<action path="/shop/newOrderForm" type="org.springframework.samples.jpetstore.web.struts.NewOrderFormAction"
  name="workingOrderForm" scope="session"
  validate="false">
  <forward name="success" path="/WEB-INF/jsp/struts/NewOrderForm.jsp"/>
</action>
这个action继承了SecureBaseAction,所以需要登录。
在newOrderForm中调用了order的initOrder方法,对表单进行了填充。
成功后转到NewOrderForm.jsp
在页面中显示支付方式和帐单地址,提交到/shop/newOrder.do
<action path="/shop/newOrder" type="org.springframework.samples.jpetstore.web.struts.NewOrderAction"
  name="workingOrderForm" scope="session"
  validate="true" input="/WEB-INF/jsp/struts/NewOrderForm.jsp">
  <forward name="confirm" path="/WEB-INF/jsp/struts/ConfirmOrder.jsp"/>
  <forward name="shipping" path="/WEB-INF/jsp/struts/ShippingForm.jsp"/>
  <forward name="success" path="/WEB-INF/jsp/struts/ViewOrder.jsp"/>
</action>
当选中Ship to different address...复选框的时候,会forward到confirm
confirm这种forward没有用到
实际的订单和数量更新操作在这一步执行,方法被封装在bo中了
getPetStore().insertOrder(order);
如果通过验证将order等移出session,forward到ViewOrder.jsp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值