一. 由来
最近用Struts1.x做项目时遇到个问题,对一个表做操作,增删改查什么的,需要定义很多Action对应相应的操作,假如有4个jsp,分别是 user表的增删改查页,理论上就要有4个增删改查Action,一个jsp对应一个Action,夸张了些吧。。。,另一种方法是写4个jsp,每个 jsp中写一个隐藏域,Action只写一个,4个jsp都提交的这个Action,在Action里,取出隐藏域的值来判断是由哪个jsp提交过来的, 这种方法貌似也不是太好,因为会造成execute方法太长了,很恶心人。
查了孙维琴的书,原来Struts.x早就有解决方案了——DispatchAction 。
二. DispatchAction的使用
恩,虽然是从孙维琴的书上抄下来的,但是看看吧,就算给自己连手了。
正文如下:
通常,在一个Action类中只能完成一种业务操作,如果希望在同一个Action类中完成一组相关的业务操作,可以使用DispatchAction 类。例如,与购物车相关的业务操作包括:查看购物车、添加商品、修改商品及数量等。一种设计方案是为每种业务操作创建独立的Action类,如 AddItemAction、ViewShoppingCartAction和UpdateShoppingCartAction。尽管这种设计方案是可 行的,但是这三个Action在执行各自的任务中,可能会执行一些相同的操作。
为了减少重复编程,使应用更加便于维护,可以由同一个Action类来完成一组相关的业务操作,DispatchAction类就提供了这种功能。
创建一个扩展DispatchAction类的子类,不必覆盖execute()方法,而是创建一些实现实际业务操作的方法,这些业务方法都应该和 execute()方法具有同样的方法签名,即它们的参数和返回类型都应该相同,此外也应该声明抛出的Exception异常。例程5-6是一个扩展 DispatchAction的例子。
例程5-6 ShoppingCartActions.java
package netstore.order;
public class ShoppingCartActions extends NetstoreDispatchAction{
public ActionForward view(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
SessionContainer sessionContainer=getSessionContainer(request);
return mapping.findForward(IConstants.SUCCESS_KEY);
}
public ActionForward update(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
updateItems(request);
updateQuantitis(request);
return mapping.findForward(IConstants.SUCCESS_KEY);
}
public ActionForward addItem(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
String itemId = request.getParameter(IConstants.ID_KEY);
ItemDetailView itemDetailView = serviceImpl.getItemDetailView(itemId);
}
如上所示:在DispatchAction中定义了三个方法view、update、addItem方法,这三个方法的签名与execute相同。那么当jsp提交到这个Action中使struts是怎么知道调用哪个方法呢???
在配置DispatchAction类时,需要把parameter属性设置为“method”,以下是ShoppingCartActions类的配置代码:
< path="/cart">
type="netstore.order.ShoppingCartActions"
scope="request"
input="/order/shoppingcart.jsp"
validate="false"
parameter="method" >
把parameter的属性设置为"method"后,当用户请求访问DispatchAction时,应该提供method请求参数,例如:
http://localhost:8080/nestore/action/cart?method=addItem&id=2
以上method请求参数值为"addItem",它指定了需要调用的业务方法,因此DispatchAction将调用相应的addItem()方法。