struts2 动态方法以及版本之间使用的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了struts2 动态方法以及版本之间使用的问题相关的知识,希望对你有一定的参考价值。

1.struts2 使用动态方法通用功能测试时(版本2.5),出现了报错。 当时我以为是自己写错了,但是返回看没检查出来错误,然后我就使用(版本2.3)测试。发现在2.3版本中,没有错误。经过官网查询,在版本2.5中default.properties 默认配置,如图

2.开启动态通用配置,默认是false

技术分享3.然后这就需要我们在struts.xml中添加配置了

<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>

4.满怀心细之情去测试,结果没有预测中的结果,却来了和原来一样的错误。如图

技术分享5.为什么我的报错那么多?你的报错却只有几行?原因在struts.xml 中添加

<!-- 启用开发模式配置 -->
<constant name="struts.devMode" value="true"></constant>

6.回归正题,头疼的事情依旧没有解决。没有办法,只好请教度娘了。

果然度娘依旧给力,我搜到了

 http://www.cnblogs.com/gsy52300/p/5778754.html

我看过后,心情终于好点了,头疼也神奇的好了。不过我发现这不是我最终想要的效果。

总结看过它之后的配置

   struts.xml配置如下

<struts>
   <!-- 使用下面这种方法,这里动态通配可以关闭 -->
   <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>
   <!-- 启用开发模式 -->
   <constant name="struts.devMode" value="true"></constant>
   
   <package name="a" extends="struts-default" namespace="/">
   		<action name="us*" class="com.struts2.action.Meths" method="{1}">
			<result name="login">/login.jsp</result>
			 <!-- 这里写自己的方法,用逗号分割开 -->
			<allowed-methods>userAdd,方法1,方法2,方法3</allowed-methods>
   		</action>
   </package>
</struts>

前台页面,伪代码。

<%
	String base = request.getScheme() + "://" +
				    request.getServerName() + ":" +
					request.getServerPort() + 
					request.getContextPath();
%>
<a href="<%=base%>/ususerAdd">测试</a>

测试了下,诶呦,终于成功了。

7.不过不是我要的效果,没办法,只要继续劳驾度娘了。终于皇天不负我真情,找到了最终我想要的效果。原文章地址 http://blog.csdn.net/maobois/article/details/51854607 (博主总结)这里主人也是引荐的  http://ask.csdn.net/questions/260958 (最终答案)

再来看看修改下的配置

<struts>
   <!-- 开启动态方法匹配 -->
   <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
   <constant name="struts.devMode" value="true"></constant>
   
   <package name="a" extends="struts-default" namespace="/">
   		 
   		<!-- 关键地方  struts2.5 为了提升安全性,添加了 allomethod 这么个玩意-->
   		 <global-allowed-methods>regex:.*</global-allowed-methods>
   		 
   		<action name="us*" class="com.struts2.action.Meths" method="{1}">
			<result name="login">/login.jsp</result>
   		</action>
   </package>
</struts>

前台页面不变。到此,终于解决了。

8.对于遇到的问题,解决方法总结下,免得记性不好,以后忘记,也给遇到此问题的小伙伴,一个惊喜。

1.1通过启用动态方法匹配

<constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>

1.2与之相对应的在package包的添加

<global-allowed-methods>regex:.*</global-allowed-methods>

完整配置

<?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>
   <constant name="struts.devMode" value="true"></constant>
   
   <package name="a" extends="struts-default" namespace="/">
   		 
   		<!-- 关键地方  struts2.5 为了提升安全性,添加了 allomethod 这么个玩意-->
   		 <global-allowed-methods>regex:.*</global-allowed-methods>
   		
   		<action name="us*" class="com.struts2.action.Meths" method="{1}">
			<result name="login">/login.jsp</result>
   		</action>
   </package>
</struts>

2.1 不需要开启动态方法匹配配置

<constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>

2.2 相关配置

<action name="us*" class="com.struts2.action.Meths" method="{1}">
	<result name="login">/login.jsp</result>
	<allowed-methods>方法1,方法2</allowed-methods>
</action>

2.3 如果你感觉,2.2一一写出方法,太麻烦,也可以这么写

<action name="us*" class="com.struts2.action.Meths" method="{1}">
	<result name="login">/login.jsp</result>
	<allowed-methods>regex:.*</allowed-methods>
 </action>

这里说下自己对这里的见解

什么时候用1.1 和2.1

如果你同一个包中,都需要使用这种动态匹配,显然1.1更适合你。

<package name="">
   	<action name=""></action>
   	<action name=""></action>
   	<action name=""></action>
</package>

反正,如果只是局部某个<action>使用,就选2.1


我擦,人都走完了,我也该进餐去了。

本文出自 “11134439” 博客,转载请与作者联系!

以上是关于struts2 动态方法以及版本之间使用的问题的主要内容,如果未能解决你的问题,请参考以下文章

Struts2 动态方法调用

第三章Struts2 Action中动态方法调用通配符的使用

Struts2的动态方法,及result跳转方式,全局结果以及默认的action的配置

Struts2.5的DMI与新增的SMI

关于Struts2中DMI(动态调用)错误问题

struts2动态方法无法调用