Struts 2中的下划线和通配符操作映射

时间:2014-03-27 08:49:40

标签: struts2 wildcard-mapping

我正在使用带有以下操作映射的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>

1 个答案:

答案 0 :(得分:1)

看起来通配符松散匹配以支持一些遗留语法。所以问题不在于下划线,而在于松散的匹配模式。

来自javadocs

  

模式可以选择“松散地”匹配。当模式的结尾与\*[^*]\*$(通配符,没有通配符,通配​​符)匹配时,如果模式失败,它也会匹配,就像最后两个字符不存在一样。目标是支持遗留"*!*"语法,其中"!*"是可选的。