[Struts2] アクション名にスラッシュを許す

struts2 では、ネームスペース名とアクション名でアクセス時のパスが決定される。

http://HOST_NAME/CONTEXT_NAME/NAMESPACE_NAME/ACTION_NAME.suffix

ネームスペースには普通にスラッシュを含めて階層化できるけど、DefaultActionMapper を使っている場合にアクション名にスラッシュを含めることができるかどうかは設定による。関係のある設定項目は以下の2つ。

  • struts.enable.SlashesInActionNames
  • struts.mapper.alwaysSelectFullNamespace


1番目のものは名前の通りで、普通これだけでできると思う。けど期待通りに動作しなかったので調べてみると、2番目の設定が関係していた。DefaultActionMapper では struts.mapper.alwaysSelectFullNamespace が true になっているとネームスペース名としてスラッシュで終わる最長の文字列を決めうちで採用するので、実質アクション名にはスラッシュを含めることができない。これはデフォルトでは false になっているんだけど、codebihind-plugin の方で true に書き換えられていた。わかりにくいなあ。

そもそもなぜ struts.enable.SlashesInActionNames が設定項目になっているかというと、これを許可すると任意のパスからのデフォルトネームスペース("")にあるアクションを呼ぶときの挙動が変わってしまうかららしい。設定を false にしておくと任意のパスプレフィックスでデフォルトネームスペースのアクションを呼べたのが、設定を true になると呼べなくなってしまう。これを回避して呼び出し可能にするためには、デフォルトスペースのアクション名にワイルドカードを使って、"**/someAction" というふうにすれば良い。