概述
当系统需要使用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的动态方法调用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复