zoukankan      html  css  js  c++  java
  • Struts2的动态Action实现


    在Struts2中动态方法调用有三种方式,动态方法调用就是为了解决一个Action对应多个请求的处理,以免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方法。

    二、感叹号方式(需要开启),官网不推荐使用这种方式,建议大家不要使用。
    用这种方式需要先开启一个开关
    <constant name="struts.enable.DynamicMethodInvocation" value="true" /> 
    将此常量设置为true,这种方式才能使用,使用见示例
    Action定义如下:
    package chapter3.action;
    public class Chapter3Action {
    public String result1(){
       return "result1";
    }
    public String result2(){
       return "result2";
    }



    Jsp中关键代码:
    <body>
        <a href="basePath/chapter3/chapter3Action!result1">result1</a>
        <br>
        <a href="basePath/chapter3/chapter3Action!result2">result2</a>
        <br>
        <a href="basePath/chapter3/chapter3Action!result3">result3</a>
        <br>
    </body> 
    如果配置了后缀.action,必须这样写:
    /chapter4/chapter4Action!create.action
    XML中配置方式
    <package name="chapter3" namespace="/chapter3" extends="struts-default">
        <action name="chapter3Action" class="chapter3.action.Chapter3Action">
        <result name="result1">/WEB-INF/JspPage/chapter3/result1.jsp</result>
        <result name="result2">/WEB-INF/JspPage/chapter3/result2.jsp</result>
        <result name="result3">/WEB-INF/JspPage/chapter3/result3.jsp</result>
       </action>
    </package> 


    三、通配符方式(官网推荐使用)
    仔细看第一种方法的struts.xml中两个action的定义,可以发现他们除了name和method属性不同以外,其余的都一样,这种定义相当的冗余,为了解决这种类型的问题,Struts2提供了通配符定义方式。
    在配置<action>元素时,需要指定name、class、method等属性,这3个属性都支持通配符,在使用通配符定义Action的name属性时,相当于一个元素action定义多个逻辑Action。第一种方法中的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的模式,都可通过该Action进行处理,而method属性使用了一个表达式{1},该表达式的值就是name属性中第一个*的所代表的值,例如,用户请求的URL为LoginAction,则*所代表的是Login字符串,故调用com.demo.LoginAction类的Login方法来处理。如果请示的URL为RegistryAction的话,则调用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时,其中*的值为Login,该值传入class属性,即该Action的处理类为com.demo.LoginAction;而如果请求为RegistryAction时,则该Action的处理类将变为com.demo.RegistryAction。
    Struts2允许在class属性和method属性中同时使用表达式,示例如下:
    <action name=”*_*” class=”com.demo.{1} method=”{2}” />
    不难看出,只要满足*_*模式的Action都会被其处理,例如有Order_Booking请求到来,由于第一个*的值为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时,将调用com.demo.LoginAction处理类中的Login方法处理用户的请求,当返回为success时,显示/Login.jsp页面。
    注意:在使用通配符后,除非请求的URL与Action的name属性绝对相同,否则将按Action在struts.xml中定义的先后顺序来决定由哪个Action来处理用户请求。

  • 相关阅读:
    android 中文 api (43) —— Chronometer
    SVN客户端清除密码
    Android 中文 API (35) —— ImageSwitcher
    Android 中文API (46) —— SimpleAdapter
    Android 中文 API (28) —— CheckedTextView
    Android 中文 API (36) —— Toast
    Android 中文 API (29) —— CompoundButton
    android 中文 API (41) —— RatingBar.OnRatingBarChangeListener
    Android 中文 API (30) —— CompoundButton.OnCheckedChangeListener
    Android 中文 API (24) —— MultiAutoCompleteTextView.CommaTokenizer
  • 原文地址:https://www.cnblogs.com/kangsir/p/6653269.html
Copyright © 2011-2022 走看看