strust2-学习(三)<action>配置详解

属性

  • name:action请求的名称。
  • class:指定Action类。缺省值为ActionSupport类。
  • method:指定处理逻辑的方法名。缺省值为excute方法。

name-以action之名

一个基本的action请求

由上图可以直观的看出action的name如何和package的namespace组成一个action请求。
注意

  • 支持正斜杠[/],需要设置常量struts.enable.SlashesInActionNames的值为true
  • 支持[.][-]两个符号,但是注意使用[.]符号的话,action请求需要在最后显示设置请求后缀,例如.action。否者会被识别为请求后缀而出现错误。
  • 无法支持中文

ps:action请求还有更复杂的一些情况可以参看文章《strust2-学习(二)<package>配置详解》中namespace配置的实验部分

class-逻辑控制中心

MVC是一个经典的设计模式,而在struts2中的控制层就是action的class指定的Action类了。

class属性在没有容器管理的情况下,应包含Action的全路径。as follows:

<!-- class的配置 -->
<package name="class" namespace="/class" extends="struts-default">
    <!-- 为action指定逻辑处理的Action类 -->
    <action name="controller-default" class="struts2.action.action.ControllerAction">
        <result>/class/my-class.jsp</result>
    </action>
</package>
package struts2.action.action;

import com.opensymphony.xwork2.ActionSupport;

public class ControllerAction extends ActionSupport{
    @Override
    public String execute() throws Exception {
        System.out.println("进入ControllerAction控制器");
        return super.execute();
    }
}

如果action没有指定具体执行逻辑的方法,则默认的执行方法是execute。Action类可以继承ActionSupport类然后可以重写execute方法。否则会执行ActionSupport的execute方法,该方法返回字符串"success"。这里我们重写了一下execute方法使得控制台输出一些信息。最后返回的父类ActionSupport的execute执行的结果--success。

ps:系列文章基于循序渐进的方式编写,Action类的部分因为超出此部分内容所以此内容在后面的文章介绍。在此有关Action部分的内容--例如返回值“success”的作用大家可以先不求甚解。

method

前面说到Action是逻辑处理中心,而实际逻辑处理单元是method--就是Action类中的方法。上文中我们只使用了struts2默认的执行方execute。其实每个action不仅可以自定义执行的类同样可以指定方法。

例子:

    <!-- method的配置 -->
    <package name="method" namespace="/method" extends="struts-default">
        <!-- method缺省值为 execute -->
        <action name="default-method" class="struts2.action.action.MethodAction">
            <result>/method/my-method.jsp</result>
        </action>
    </package>
package struts2.action.action;

public class MethodAction {
    
    public String execute() throws Exception {
        System.out.println("执行默认的excute方法");
        return "success";
    }
}

这个例子和class小节中的配置相差不多,不同的是MethodAction此时没有继承ActionSupport类。但是实现的execute方法依然被当做默认方法被调用。所以可以看出struts2的Action类完全可以是一个简单类而与struts2无任何关系。

动态调用method

当我们想在一个action配置中指定不同的逻辑处理的方法,可以使用动态的调用method的方式。struts中提供了多种实现的方式。动态调用方法使得简化了action的配置,也是的配置更加灵活。

1. 使用符号--!

配置如下

<!-- 可以在action请求的最后使用!指定逻辑执行的方法 -->
<action name="dynamic-method" class="struts2.action.action.MethodAction">
    <result >/method/dynamic-method.jsp</result>
</action>

在上面的配置中制定了action的name和class属性。当我们在请求dynamic-method时在请求的最后加上符号[!]和具体执行方法的名称,就可以实现动态调用。例如

http://localhost:8080/struts2.action/method/dynamic-method!dymMethod1

http://localhost:8080/struts2.action/method/dynamic-method!dymMethod2

上面两个请求都是dynamic-method然后会根据!后的方法名称去执行对应的方法。可以在返回的页面和控制台看到执行了不同的方法。

补上MethodAction类新增的方法

    public String dymMethod1(){
        dynmMethod = "动态方法--1";
        System.out.println("执行动态方法--1");
        return "success";
    }
    public String dymMethod2(){
        dynmMethod = "动态方法--2";
        System.out.println("执行动态方法--2");
        return "success";
    }

ps:作者看的教材提到说要在配置文件中显示开启动态方法调用--设置常量struts.enable.DynamicMethodInvocation为true。配置如下:

<constant name="struts.enable.DynamicMethodInvocation" value="true"/>

作者发现无需显示配置也可支持。

2. 使用符号--*

看到*可能部分读者会感到亲切,在很多地方我们都把它作为一个通配符使用。在这里它同样是作为通配符使用。
配置如下:

<!-- 使用通配符*来动态调用方法 -->
<action name="dynamic-method-*" class="struts2.action.action.MethodAction" method="{1}">
        <result >/method/dynamic-method.jsp</result>
</action>

在name属性中使用通配符,这样可以匹配所有dynamic-method-xxxx形式的action请求。然后匹配到的字符串(例如:xxxx)就可以在method中通过{1}获取({2}获取的是第二个通配符匹配的字符串)。
访问以下请求动态调用不同的方法,返回不同的结果。

http://localhost:8080/struts2.action/method/dynamic-method-dymMethod1

http://localhost:8080/struts2.action/method/dynamic-method-dymMethod2

通配符匹配的字符串不近可以在method属性中使用,可以在result中使用。
例如:

<package name="pages" namespace="/pages" extends="struts-default">
    <action name="*-page">
        <result>{1}.jsp</result>
    </action>
</package>

在上面的配置下,我们可以通过输入jsp页面的名称来动态访问。
请求:

http://localhost:8080/struts2.action/pages/my-login-page

http://localhost:8080/struts2.action/pages/my-register-page

使用通配符引发的优先级问题。如果我们使用通配符的话会出现action请求匹配优先级的问题。

<!-- 验证通配符匹配优先级问题 -->
<action name="dynamic-*" class="struts2.action.action.MethodAction">
        <result >/method/dynamic-method2.jsp</result>
</action>
<!-- 使用通配符*来动态调用方法 -->
<action name="dynamic-method-*" class="struts2.action.action.MethodAction" method="{1}">
        <result >/method/dynamic-method.jsp</result>
</action> 

上面的配置会出现同时可以匹配以下的请求的情况。

http://localhost:8080/struts2.action/method/dynamic-method-dymMethod1

这个时候会进入的是哪个action呢?
结果:dynamic-method-的优先级比dynamic-**高,这与前一篇文章中判断package的namespace优先级的结果是一样--都是根据长度越长则优先级越高。

配置默认Action

当我们输入的action请求无法匹配到对应的actiond则会抛出异场,返回一个异常页面。struts2通过<default-action-ref>提供默认Action来处理无法匹配的action请求。配置如下

<package name="default-action" namespace="/default" extends="struts-default">
  <!-- 设置默认的action -->
  <default-action-ref name="default"/>
  <action name="default">
    <result>/default.jsp</result>
  </action>
</package>

但是默认action是针对每个package的。
default-action-ref的name指向的是已存在的action。
我们访问下面的网址,该请求无法匹配任何action所以结果是会返回name为default的action的物理视图。

localhost:8080/struts2.action/default/yyyy
localhost:8080/struts2.action/default/xxxx

配置默认Action类

我们知道如果不指定action中的class则会默认调用ActionSupport类。这其实是在struts-default.xml文件中配置好的。如下

<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />

所以我们自己也可以给package中的action指定默认执行的Action类。实现方式和上面的代码相同。


代码示例

可以在github下载study项目中的struts2.action工程。查看示例源码
struts2.action项目地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述 什么是Struts2的框架Struts2是Struts1的下一代产品,是在 struts1和WebWork的...
    inke阅读 2,269评论 0 50
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,841评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,740评论 18 399
  • 标签 如果要配置的标签,那么必须要先配置标签,代表的包的概念。 包含的属性 name包的名称,要求是唯一的,管理a...
    偷偷得路过阅读 1,389评论 0 0
  • 概述 Struts就是基于mvc模式的框架!(struts其实也是servlet封装,提高开发效率!) Strut...
    奋斗的老王阅读 2,973评论 0 51