一: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。
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
访问修改方法执行如下路径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
访问修改方法执行如下路径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>