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
我擦,人都走完了,我也该进餐去了。