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项目地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

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