我正在使用带有以下操作映射的Struts 2 webapp:
<action name="something_*" class="foo.whatever.MyAction" method="{1}">
<result>blah/myJsp.jsp</result>
...
</action>
因此,如果我加载了网址/something_load.action
,则会调用MyAction.load()
,依此类推。小菜一碟。让我感到困惑的是,加载/something.action
也有效(我猜它正在调用execute()
方法)。 怎么可能?我的动作映射应该匹配“something_”,但我的URL中没有低估。 它应该给我一个错误!不应该吗?
我已经仔细检查过struts配置文件中没有“something.action”的另一个映射。我还检查了web.xml文件,以防万一...
我能想象的唯一解释是,如果我使用通配符映射,Struts中会忽略下划线。但是加载/something_load.action
,/some_thing_lo_ad.action
......这没有任何区别......这不是真的。
我知道这一定是一个非常无聊的问题,但我一直无法解决这个问题,既没有查看Stackoverflow问题,也没有查看Struts documentation。
这是主要的struts.xml文件:
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" />
<constant name="struts.freemarker.templatesCache" value="true" />
<package name="default" extends="struts-default">
<!-- interceptors ... -->
<!-- global results for error pages -->
</package>
<!-- lots of includes -->
</struts>
答案 0 :(得分:1)
看起来通配符松散匹配以支持一些遗留语法。所以问题不在于下划线,而在于松散的匹配模式。
来自javadocs:
模式可以选择“松散地”匹配。当模式的结尾与
\*[^*]\*$
(通配符,没有通配符,通配符)匹配时,如果模式失败,它也会匹配,就像最后两个字符不存在一样。目标是支持遗留"*!*"
语法,其中"!*"
是可选的。