• 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来处理用户请求。

  • 相关阅读:
    Vue 从入门到进阶之路(十四)
    Vue 从入门到进阶之路(十三)
    Vue 从入门到进阶之路(十二)
    Vue 从入门到进阶之路(十一)
    vue-cli 3.x 开发插件并发布到 npm
    2018 年终总结 & 2019 年度计划
    帝都夜话
    移动端实现拖拽的两种方法
    前端面试(原生js篇)
    在前端获取图片宽高
  • 原文地址:https://www.cnblogs.com/kangsir/p/6653269.html
Copyright © 2020-2023  润新知