`
holdbelief
  • 浏览: 696495 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

DispatchAction类的使用

阅读更多

一. 由来

    最近用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()方法。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics