Action搜索顺序及动态方法调用

来源:互联网 发布:大连软件发展状况 编辑:程序博客网 时间:2024/04/30 04:32

一:Action搜索顺序

新建一个struts2项目,命名为struts2。按照如下XML文件配置一个Action:
<package name="hello" namespace="/test" extends="struts-default">    <action name="helloworld" class="com.ittx.struts.action.HelloWorldAction" method="execute">            <result name="success">/hello.jsp</result>    </action></package>

将应用部署,访问如下路径:http://localhost:8080/struts2/test/sdf/dsf/32/d/helloworld.action 依然可以访问到Action。
这主要是因为Struts2对Action名称的搜索是按照一定顺序进行的。以上面的情况为例:

1.struts2首先搜索命名空间为/test/sdf/dsf/32/d的包是否存在,存在的情况下,是否有helloworld这个Action;
2.搜索命名空间为/test/sdf/dsf/32的包是否存在,存在的情况下,是否有helloworld这个Action;
3.搜索命名空间为/test/sdf/dsf的包是否存在,存在的情况下,是否有helloworld这个Action;
4.搜索命名空间为/test/sdf的包是否存在,存在的情况下,是否有helloworld这个Action;
5.搜索命名空间为/test的包是否存在。在这种情况下能够搜索到,因此,可以访问到helloworld这个Action。
此外,如果按照这种搜索顺序搜索,发现所有的包均不存在,那么struts2则会到命名空间为””(默认命名空间)的包下面去找helloworld这个Action。

二:动态方法调用

1:Action的method属性完成动态方法调用

Action类:

package com.Demo;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import com.opensymphony.xwork2.ActionSupport;public class StrutsDemo extends ActionSupport {private static Logger log = LogManager.getLogger(StrutsDemo.class.getName());public String add() {log.debug("执行add用户操作 >>>>>>");return "ADD";}public String update() {log.debug("执行update用户操作 >>>>>>");return "UPDATE";}}

struts.xml

<!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"    "http://struts.apache.org/dtds/struts-2.5.dtd"><struts><package name="user" namespace="/" extends="struts-default"><action name="StrutsDemoAdd" class="com.Demo.StrutsDemo.StrutsDemo"method="add"><result name="ADD">/add_student.jsp</result></action><action name="StrutsDemoUpdate" class="com.Demo.StrutsDemo.StrutsDemo"method="update"><result name="UPDATE">/update_student.jsp</result></action></package></struts>
访问添加方法执行如下路径:http://localhost:8080/struts2/StrutsDemoAdd.action
访问修改方法执行如下路径http://localhost:8080/struts2/StrutsDemoUpdate.action

2:感叹号方式 

在上述使用method属性的方式来实现动态方法有一个不好的地方在于:如果只有几个方法需要被调用,我们只需要在struts.xml文件中,写几个类似上面的代码段。如果有几百个方法需要被动态调用,那么用这种方法可能就不适合了,这样代码冗余太大,也不便于管理。因此就有了!、通配符的使用的两种方法
首先使用!、通配符的方法。必须先添加以下两段代码
<!-- 让struts2支持动态方法调用,配置在包标签之前,这个常量也可以在 struts.properties中配置--><constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<!-- 适配struts2.5感叹号通配符调用无效的问题:在pakcage标签下添加如下标签 --><global-allowed-methods>regex:.*</global-allowed-methods>
将上述事例struts.xml改为:
<!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"    "http://struts.apache.org/dtds/struts-2.5.dtd"><struts><!-- 让struts2支持动态方法调用,配置在包标签之前,这个常量也可以在 struts.properties中配置 --><!-- <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> -->
<package name="user" namespace="/" extends="struts-default"><!-- 解决struts2.5 通配符调用无效的问题 --><global-allowed-methods>regex:.*</global-allowed-methods><action name="StrutsDemo" class="com.Demo.StrutsDemo"><result>/sucess.jsp</result><result name="ADD">/add_user.jsp</result><result name="UPDATE">/update_user.jsp</result></action></package></struts>

</struts>
在访问时,用!加方法名调用如:
访问添加方法执行如下路径:http://localhost:8080/struts2/StrutsDemo!add.action
访问修改方法执行如下路径http://localhost:8080/struts2/StrutsDemo!update.action

3:通配符方式 

通配符方式是使用最为广泛的方式。当然,在使用之前也需要和!方式一样需要struts支持动态调配及适配通配符
将上述事例的struts.xml改为:
<!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"    "http://struts.apache.org/dtds/struts-2.5.dtd"><struts><package name="user" namespace="/" extends="struts-default"><!-- 解决struts2.5 通配符调用无效的问题 --><global-allowed-methods>regex:.*</global-allowed-methods><action name="StrutsDemo_*" class="com.Demo.StrutsDemo"method="{1}"><result>/sucess.jsp</result><result name="ADD">/add_user.jsp</result><result name="UPDATE">/update_user.jsp</result></action></package></struts>

说明:上述代码中<action>标签中的name属性的下划线“_“ 作用为分开类名和方法名,这是一种习惯写法,可以省略。
method="{1}中的1表示第一个*。
在访问时,用!加方法名调用如:
访问添加方法执行如下路径:http://localhost:8080/struts2/StrutsDemo_add.action
访问修改方法执行如下路径http://localhost:8080/struts2/StrutsDemo_update.action

如上文所述,method="{1}中的1表示第一个*。那么通配符是可以有多个的,将上述事例修改,

可以用第一个*表示类名,第二个*号表示方法名。代码如下:

<!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"    "http://struts.apache.org/dtds/struts-2.5.dtd"><struts><package name="user" namespace="/" extends="struts-default"><!-- 解决struts2.5 通配符调用无效的问题 --><global-allowed-methods>regex:.*</global-allowed-methods><action name="*_*" class="com.Demo.{1}"method="{2}"><result>/sucess.jsp</result><result name="ADD">/add_user.jsp</result><result name="UPDATE">/update_user.jsp</result></action></package></struts>




0 0
原创粉丝点击