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 ではアンダースコアが無視されるということです。しかし、 load を実行しても違いはあり/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から:

パターンはオプションで「大まかに」一致させることができます。パターンの末尾が一致する場合\*[^*]\*$(ワイルドカード、ワイルドカードなし、ワイルドカード)、パターンが失敗した場合も、最後の 2 文字が存在しないかのように一致します。目標は、レガシー"*!*"構文をサポートすることです。ここで、"!*"はオプションです。

于 2014-03-27T12:00:53.357 に答える