3

我正在使用具有以下操作映射的 Struts 2 webapp:

<action name="something_*" class="foo.whatever.MyAction" method="{1}">
  <result>blah/myJsp.jsp</result>
  ...
</action>

因此,如果我加载 URL /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 文档

这是主要的 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>
4

1 回答 1

1

通配符似乎松散地匹配以支持某些遗留语法。所以问题不在于下划线,而在于松散的匹配模式。

javadocs

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

于 2014-03-27T12:00:53.357 回答