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

一: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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值