我是靠谱客的博主 苗条老虎,最近开发中收集的这篇文章主要介绍Struts2配置Action的动态方法调用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

    当系统需要使用Action的不同方法来处理用户请求的时候,就需要让同一个Action类包含有多个控制处理逻辑,然后再根据用户请求来调用不同的方法,这里就可以采用DMI(Dynamic Method Invocation,动态方法调用)来处理这种请求。struts2也提供了两种方式来实现这动态方法的调用。

一、第一种方式,strtus2提供的动态方法调用

首先,先新建一个测试动态调用的Action类

package com.bran.b_dynamic;

//测试动态方法调用
public class Demo1Action {
	
	public String add() {
		System.out.println("添加用户");
		return "success";
	}
	public String delete() {
		System.out.println("删除用户");
		return "success";
	}
	public String update() {
		System.out.println("更新用户");
		return "success";
	}
	public String find() {
		System.out.println("查找用户");
		return "success";
	}
}

然后在strtus2的配置文件struts.xml对该Action进行配置,可以不用指定method属性

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
	"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
	<!-- 配置动态方法调用常量 
		默认是关闭,一定要开启这段才能使用动态方法调用-->
	<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>

	<package name="dynamic" namespace="/dynamic" extends="struts-default">
		<action name="Demo1Action" class="com.bran.b_dynamic.Demo1Action">
			<result name="success">/hello.jsp</result>
			<allowed-methods>add,delete,update</allowed-methods>
		</action>
	</package>
	
</struts>

配置完了之后就可以通过actionName!methodName的形式来实现动态方法的调用,actionName是指定提交到哪一个Action,而methodName是指定调用该Action下的哪个方法,例如上面的配置,可以通过访问dynamic/Demo1Action!delete来调用Demo1Action的delete方法。

注意:配置该Action的时候需要指定<allowed-methods>...</allowed-methods>子元素。由于Struts2的DMI原来的设计存在一些安全隐患(恶意用户可通过在感叹号之后添加方法名来执行任意方法),现在Struts2使用<allowed-methods>...</allowed-methods>元素严格限制允许动态调用的方法,不在该元素中的方法名是无法动态调用的,例如:上面的<allowed-methods>...</allowed-methods>没有配置find方法,如果通过访问dynamic/Demo1Action!find来调用Demo1Action的find方法,就会抛出异常

com.opensymphony.xwork2.config.ConfigurationException: Method find for action Demo1Action is not allowed!

<allowed-methods>...</allowed-methods>该元素可以指定多个方法,多个方法名之间要用英文逗号隔开。

在struts2最新的2.5版本中,可以不用配置<allowed-methods>...</allowed-methods>,只需要在<package .../>中配置strict-method-invocation="false",也可以实现方法的访问,而不会出现方法不允许的异常,配置如下:

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
	"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
	<!-- 配置动态方法调用常量 
		默认是关闭
	-->
	<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
	<package name="dynamic" namespace="/dynamic" extends="struts-default" strict-method-invocation="false">
		<action name="Demo1Action" class="com.bran.b_dynamic.Demo1Action">
			<result name="success">/hello.jsp</result>
		</action>
	</package>
	
</struts>

二、第二种方式,使用通配符

同样,先新建一个测试动态调用的Action类

package com.bran.b_dynamic;

//测试动态方法调用
public class Demo1Action {
	
	public String add() {
		System.out.println("添加用户");
		return "success";
	}
	public String delete() {
		System.out.println("删除用户");
		return "success";
	}
	public String update() {
		System.out.println("更新用户");
		return "success";
	}
	public String find() {
		System.out.println("查找用户");
		return "success";
	}
}

然后在strtus2的配置文件struts.xml对该Action进行配置

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
	"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
	<package name="dynamic" namespace="/dynamic" extends="struts-default" strict-method-invocation="false">
		<action name="Demo1Action_*" class="com.bran.b_dynamic.Demo1Action" method="{1}">
			<result name="success">/hello.jsp</result>
		</action>
	</package>	
</struts>

          这种方式可以将一个Action类配置成多个逻辑Action,即Action类的每个处理方法都映射成一个逻辑Action。所以上面的<action name="Demo1Action_*" .../>元素不是定义了一个普通Action,而是定义了一系列的逻辑Action,只要是用户请求的URL是Demo1Action_*的模式,就都可用这个Action处理。还需要配置method属性(method属性用于指定处理用户请求的方法),method属性的{1}表达式是指name属性值中的第一个*的值。例如:用户请求的URL为dynamic/Demo1Action_add,则method属性中的{1}的值为add,即会调用该add方法,同理,如果用户请求的URL为dynamic/Demo1Action_delete,就会调用Demo1Action类中的delete方法。跟第一种方式一样,由于用到了动态调用方法,所以还需要配置<allowed-methods>...</allowed-methods>,或者可以在package里面配置属性<package ... strict-method-invocation="false">...</package>,这两种方式都可以。

 

最后

以上就是苗条老虎为你收集整理的Struts2配置Action的动态方法调用的全部内容,希望文章能够帮你解决Struts2配置Action的动态方法调用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部