购物系统这部分由加入购物车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><< 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 >></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