`
Riddick
  • 浏览: 640216 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Struts2动态方法调用

阅读更多

 

       Struts2支持动态方法调用,它指的是一个Action中有多个方法时,系统根据表单元素给定的action来访问不同的方法,而不用写多个Action。

 

       使用动态方法调用前必须设置Struts2允许动态方法调用,它是通过设置

struts.enable.DynamicMethodInvocation = true来完成的。

 

       Struts2主要有3种方式实现动态方法调用(以下action请求的后缀均设置为do,而非默认的action):

 

 (1). 修改页面Form的action请求方式

 

       将页面上action的请求方式改为:action = “ActionName!MethodName.do”,示例:

       Login.jsp

              ……

              var contextPath = “<%=request.getContextPath()%>”;

              <script type=”text/javascript”>

                     function dynamicMethodInvoke(){

                            document.forms[0].action = contextPath + “Login!dynamicMethod.do”;

                            document.forms[0].submit();

}

              </script>

              ……

              <input type=”button” value=”动态方法调用” onclick=”dynamoicMethodInvoke()”/>

              ……

 

       当点击“动态方法调用”按钮时,执行dynamoicMethodInvoke方法,在此方法中修改提交的action为Login!dynamicMethod.do,它的意思是将表单提交给Login Action的dynamicMethod方法进行处理。

//LoginAction.java

       public class LoginAction {

       ……

       public String dynamicMethod() throws Exception{
                     ……

              return “success”;

          }

 

           public String execute() throws Exception{

               ……

          if (…){

                 return “error”;

               }

              ……

          return “success”

        }

      }

  

       通过这种方式,可以在一个Action中包含多个方法,通过指定不同的action属性来提交给Action的不同方法进行处理。

       对于使用动态方法调用的方法,它的声明与系统默认的execute方法的方法声明只有方法名不同,其他的如参数、返回值类型都必须相同。

 

 (2). 指定action的method属性

 

       另一种动态调用方式是在struts.xml中指定action的method属性,这样可以让Action类调用指定方法,而不是默认的execute方法来处理请求。示例:

//struts.xml

       ……

       <package name=”demo1” extends=”struts-default”>

              <action name=”Login” class=”com.demo.LoginAction” />

                     <result name=”input”>/input.jsp</result>

                     <result name=”error”>/error.jsp</result>

                     <result name=”success”>/success.jsp</result>

              </action>

              <action name=”Registry” class=”com.demo.LoginAction” method=”registry” />

                     <result name=”input”>/input.jsp</result>

                     <result name=”error”>/error.jsp</result>

                     <result name=”success”>/success.jsp</result>

              </action>

       </package>

        

       上述配置中两个action的实现类均为com.demo.LoginAction,他们的实现类虽然相同,但处理逻辑却不同,处理逻辑通过method方法指定,其中名为Login的Action对应的处理逻辑为默认的execute方法,而名为Registry的Action对应的处理逻辑则为method指定的registry方法。

 

 (3). 使用通配符

 

       仔细看上面struts.xml中两个action的定义,可以发现他们除了name和method属性不同以外,其余的都一样,这种定义相当的冗余,为了解决这种类型的问题,Struts2提供了通配符定义方式。

       在配置<action/>元素时,需要指定name、class、method等属性,这3个属性都支持通配符,在使用通配符定义Action的name属性时,相当于一个元素action定义多个逻辑Action。(2)中的action配置可以更改为:

<package name=”demo” extends=”struts-default”>

       <action name=”*Action” class=”com.demo.LoginAction” method=”{1}”>

              <result name=”input”>/input.jsp</result>

              <result name=”error”>/error.jsp</result>

              <result name=”success”>/success.jsp</result>

       </action>

</package>

 

上述定义不是定义了一个普通的action,而是定义一系列的action,只要用户请求的URL满足*Action.do的模式,都可通过该Action进行处理,而method属性使用了一个表达式{1},该表达式的值就是name属性中第一个*的值,例如,用户请求的URL为LoginAction.do,则调用com.demo.LoginAction类的Login方法来处理,如果请示的URL为RegistryAction.do的话,则调用com.demo.LoginAction的Registry方法进行处理。

 

以下配置在class属性中使用通配符:

<package name=”demo” extends=”struts-default”>

       <action name=”*Action” class=”com.demo.{1}Action”>

              <result name=”input”>/input.jsp</result>

              <result name=”error”>/error.jsp</result>

              <result name=”success”>/success.jsp</result>

       </action>

</package>

 

       此配置中没有指定method属性,所以请示由默认的execute方式来执行,但class中使用了通配符,它的含义与上面一样,例如,当用户请求的为LoginAction.do时,其中*的值为Login,该值传入class属性,即该Action的处理类为com.demo.LoginAction;而如果请求为RegistryAction.do时,则该Action的处理类将变为com.demo.RegistryAction。

 

       Struts2允许在class属性和method属性中同时使用表达式,示例如下:

<action name=”*_*” class=”com.demo.{1} method=”{2}” />

不难看出,只要满足*_*模式的Action都会被其处理,例如有Order_Booking.do请求到来,由于第一个*的值为Order,第二个*的值为Booking,那么意味着将会调用com.demo.Order处理类中的Booking方法来处理用户请求。

 

       Struts2除了允许在name、class、method中使用表达式外,在<result/>元素中也可以使用表达式,如下:

<action name=”*Action” class=”com.demo.{1}Action method=”{1}” >

        <result name=”success”>/{1}.jsp</result>

</action>

        

       当请求为LoginAction.do时,将调用com.demo.LoginAction处理类中的Login方法处理用户的请求,当返回为success时,显示/Login.jsp页面。

 

       注意:在使用通配符后,除非请求的URL与Action的name属性绝对相同,否则将按Action在struts.xml中定义的先后顺序来决定由哪个Action来处理用户请求。

 

       对于一些只是简单的转发操作,如超级链接等的请求,可以定义name为*的Action来处理,此外,Struts2框架允许在struts.xml中使用<default-action-ref/>元素定义一个默认Action来处理用户请求:

<package name=”demo” extends=”struts-default” namespace=”/”>

        <action name=”defaultAction” class=”com.demo.DefaultAction”>

               <result>/default.jsp</action>

         </action>

         <default-action-ref name=”defaultAction” />

</package>

 

<default-action-ref/>的name属性为struts.xml中一个已经定义好的Action。

 

分享到:
评论
2 楼 zhangyuqing052 2010-04-13  
原来是我自己忘加/了,如namespace="/control/demo",忘加第一个/了。
1 楼 zhangyuqing052 2010-04-13  
Struts2 用的不是很熟,这段时间自己做了个DynamicMethodInvocation的demo.
想问一下,第三种方法,是不是不能指定namespace啊?
我加namespace就报404错误,不加就OK。

相关推荐

    Struts2 动态方法调用(十三)

    在Struts2中,动态方法调用(Dynamic Method Invocation,DMI)是一种特性,允许我们通过URL直接调用Action类的方法,而无需在配置文件中显式指定。这在某些情况下提供了更大的灵活性。 在Struts2的动态方法调用中...

    struts2 动态方法调用(DMI)

    Struts2 动态方法调用(DMI,Dynamic Method Invocation)是Struts2框架中一个特色功能,允许开发者通过URL直接调用Action类中的方法,而无需预先在配置文件中显式声明这些方法。这种机制增加了开发的灵活性,但也...

    Struts2_动态方法调用

    Struts2_动态方法调用,使用struts2架构的动态方法进行资源调用

    详解Struts2动态方法调用

    Struts2 动态方法调用详解 Struts2 框架提供了动态方法调用的机制,允许一个 Action 对应多个请求,从而减少 Action 的数量。这种机制可以提高系统的灵活性和可维护性。 方法一:指定 Method 属性 在 Struts2 中...

    struts2中动态方法的调用

    ### Struts2动态方法调用的实现原理 在Struts2中,动态方法调用基于Action类中的方法名与URL中的参数相匹配的原则。当一个请求到达时,Struts2会解析URL中的方法名(通常是通过在Action名称后加上“!”符号后跟的...

    struts2动态方法配置

    Struts2动态方法调用是该框架的一个重要特性,它允许开发者通过URL直接映射到Action类中的方法,而不仅仅是类。这种灵活性极大地增强了应用程序的可扩展性和可维护性。在Struts2中,动态方法调用是通过ActionMapper...

    struts 2 action 动态调用

    ### Struts 2 Action 动态方法调用详解 #### 一、引言 在Struts 2框架中,Action动态方法调用是一项非常实用的功能。它允许开发者在一个Action类中定义多个处理方法,而不仅仅局限于传统的`execute()`方法。这种...

    struts2动态访问调用-method方法

    2. 动态方法调用 在URL请求中,我们可以传递一个名为`method`的参数,Struts2会根据这个参数值来寻找并执行相应的方法。例如,访问`http://example.com/multiMethodTest.action?method=executeMethod2`,Struts2就...

    struts2动态调用之通配符

    通配符动态调用是Struts2动态调用的一种进阶形式,它的主要优点在于减少重复配置。传统的动态调用可能需要为每个method写一条配置,例如: ```xml *" class="com.example.UserAction"&gt; &lt;result type="dispatcher"&gt;...

    struts2的API耦合与动态方法调用

    本文将重点讨论Struts2中的API耦合和动态方法调用,这两种特性对于理解框架的工作原理和提高代码的灵活性至关重要。 首先,我们来看看Struts2 API耦合的几种方式: 1. **ActionContext类**:ActionContext是Struts...

    struts2利用通配符调用同一个Action里面不同的方法

    此外,它还支持动态方法调用,即根据请求参数的不同,动态决定执行哪个方法。例如,你可以设置一个`execute`方法来处理默认请求,而其他方法则通过通配符调用。 在实际开发中,我们还可以结合Struts2的拦截器...

    struts2的学习笔记+测试源代码

    压缩包文件`struts2_5_dynamicRequestMethod`很可能包含了与Struts2动态方法调用相关的示例代码和测试用例。这些源代码可能展示了如何配置Struts2的配置文件以支持动态方法调用,以及如何在Action类中定义对应的方法...

    struts2 经典案例。运行调试通过,代码规范全解析。

    三、Struts2动态方法调用 Struts2支持动态方法调用,即可以根据请求参数动态决定Action中的执行方法,无需在struts.xml中显式列出所有方法。 四、Struts2结果类型 1. Forward:将控制权转发到另一个页面。 2. ...

    Struts2之异步调用机制详解案例struts014

    在Struts2中,异步调用机制是实现页面动态更新和提高用户体验的关键技术之一。这个案例“struts014”很可能展示了如何在Struts2中实现异步调用来处理耗时操作,如数据库查询或复杂计算。 异步调用的基本概念是,...

    Struts2中直接和间接访问ServletAPI以及动态方法调用之感叹号

    在Struts2框架中,直接和间接访问Servlet API以及动态方法调用是两个关键概念,它们对理解和优化应用性能至关重要。 首先,让我们深入理解直接访问Servlet API。在传统的MVC模式中,Servlet扮演着控制器的角色,...

    blog(struts2+hibernate3)

    Struts2 支持动态方法调用,这意味着你可以通过 URL 直接调用 Action 类的方法,无需预先在配置文件中硬编码。这种灵活性使得应用的扩展性更强。 **4. Struts2 结合 Hibernate3** Hibernate3 是一个流行的 Java ORM...

    一个Action多方法调用的Struts 2的应用程序

    利用Struts 2框架创建一个web项目chap2_e22,实现用户登录过程。具体要求是在loginAction类中分别用login()和registered()处理用户登录和注册的过程,分别创建login.jsp和register.jsp两个页面实现登录和注册的...

Global site tag (gtag.js) - Google Analytics