Struts2--动态Action的三种实现方法

最早使用动态方式调用是在spring中,没想到Struts2也支持动态方法调用了,真是方便不少啊,呵呵,下面就来说说吧 :-)     

1.动态方法调用

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

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

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

       Struts2有多种方式实现动态方法调用(以下action请求的后缀均设置为do(也可省略),而非默认的action)

 (1). 修改页面Formaction请求方式

       将页面上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=”动态方法调用” οnclick=”dynamoicMethodInvoke()”/>

              ……

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

       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). 指定actionmethod属性

       另一种动态调用方式是在struts.xml中指定actionmethod属性,这样可以让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方法指定,其中名为LoginAction对应的处理逻辑为默认的execute方法,而名为RegistryAction对应的处理逻辑则为method指定的registry方法。

 

 (3). 使用通配符

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

       在配置<action/>元素时,需要指定nameclassmethod等属性,这3个属性都支持通配符,在使用通配符定义Actionname属性时,相当于一个元素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属性中第一个*的值,例如,用户请求的URLLoginAction.do,则调用com.demo.LoginAction类的Login方法来处理,如果请示的URLRegistryAction.do的话,则调用com.demo.LoginActionRegistry方法进行处理。

 

以下配置在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除了允许在nameclassmethod中使用表达式外,在<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页面。

       注意:在使用通配符后,除非请求的URLActionname属性绝对相同,否则将按Actionstruts.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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值