Struts1.1より導入されたモジュール機能を使うと、Struts構成ファイル(struts-config.xml)を分割することができます。こうすることで、Struts構成ファイルの肥大化を防ぎ、アプリケーションを小さな単位に分けることができます。しかし、以下のような点で注意が必要です。
- Struts構成ファイル内のパスと実際のURLとの関係
- 「/do/*」のタイプのURLマッピングが使えない
- 別モジュールのリソースへアクセスする方法
- forward属性とForwardActionとの挙動の違い
ここでは、これらの注意点とその解決策について説明します。
Struts構成ファイル内のパスと実際のURLとの関係
モジュールを用いた場合、Struts構成ファイルにて参照されるパスは、基本的にすべてモジュールからの相対パスとして扱われます。すなはち、モジュール「module」のStruts構成ファイルにて、
<action path="/myAction" ... > <forward name="success" path="/myPage.jsp" /> </action>
と定義されたアクションに対しては、
http://localhost:8080/context/module/myAction.do
というURLでアクセスされることになります。そして、この場合転送先のJSPは「<Webアプリケーションのルートフォルダ>\module\myPage.jsp」になります。
こうした仕組みは、モジュールを別々のチームで開発している場合に、同名JSPなどの衝突を起こさない点で優れています。一方で、JSPをすべてWEB-INFフォルダ以下に置いている場合に厄介な問題が起こります。
「module」モジュールにて、次のような設定があるとします。このアクションへアクセスすると、先ほどと同じように「<Webアプリケーションのルートフォルダ>\module\WEB-INF\pages\myPage.jsp」を探してしまい、ページが見つからずエラーが発生してしまうのです。
<action path="/myAction" ... > <forward name="success" path="/WEB-INF/pages/myPage.jsp" /> </action>
この問題を解決するには、<forward>要素のcontextRelative属性を使い、パスをコンテキストからの相対にする必要があります。下記のように記述すると、正しいページを見つけることができようになります。
<action path="/myAction" ... > <forward name="success" contextRelative="true" path="/WEB-INF/pages/myPage.jsp" /> </action>
「/do/*」のタイプのURLマッピングが使えない
モジュールを用いる場合は、Webアプリケーション配備記述子(web.xml)で定義されるアクションへのURLマッピングに、「/do/*」という形を用いることができません。例えば、
http://localhost:8080/context/do/myAction
などとしてアクションを起動していたときに、これを「module」モジュールに移したとすると、以下のいずれかの方法でアクションにアクセスできそうな気がします。
http://localhost:8080/context/do/module/myAction http://localhost:8080/context/module/do/myAction
しかし、まず前者の方法だと、デフォルトモジュールに定義された「/module/myAction」アクションへのリクエストと解釈されてしまいます。また、後者の方法はそもそも「/do/*」というURLパターンにマッチしませんので、アクションサーブレットを起動することすらできません。
この制限は、Struts本家サイトのユーザガイドに明記されています。Webアプリケーション配備記述子とStrutsのそれぞれの仕様が原因で引き起こされる問題ですので、回避方法はありません。モジュールを利用したい場合は、「*.do」のように拡張子を使ったタイプのURLマッピングに切り替える必要があります。
Copyright © ITmedia, Inc. All Rights Reserved.