Strutsの新しいメジャー・バージョン1.2が,正式リリースに向けカウントダウン状態に入った。Strutsのソースコードを管理しているApache Software FoundationのCVSサーバー(ソースコードなどのリソースの管理を行うサーバー)で,次期バージョンを示す1.2.0および1.2.1でのバージョン固定作業が行われている。

 1.2が正式にリリースされれば,現在の安定版である1.1が2003年6月にリリースされて以来の,1年ぶりのメジャー・バージョンアップとなる。

 しかし,正式リリースまでにはもう少し時間がかかりそうだ。開発は,リリース日を定めずに品質を重視して進められている。実際の正式リリースがいつになるかは,筆者もわからない。Strutsを取り巻く環境は大きく変化し,バージョン1.1リリースのころとはユーザー数や期待度が違っている。多くの利用者はビジネス・ユースとしてStrutsを採用しており,土台であるフレームワークには絶対の信頼性が必要とされる。開発に携わっているメンバーもそのことを理解しており,慎重になっているのだろう。

 ただし,仕様については固まったといっていい。以下,1.2の新機能を解説する。

Struts1.2の新機能

 執筆時現在のStrutsの正式リリース版はバージョン1.1だが,前述したようにStruts1.2.1をソースコードで入手することが可能となっている。このバージョンでは,様々な機能が追加されているが,Sturts1.0から1.1へのバージョンアップほどの劇的な変更は行われていない。むしろ,安定化と便利な機能が追加されたといったレベルのバージョンアップだ。

 注目の新機能は,MappingDispatchActionクラスの新規追加と,ワイルドカード・アクションマッピングの実装だろう。両者とも,アクションマッピングとアクションをよりシンプルに定義するための機能だ。

MappingDispatchActionクラス

 MappingDispatchActionは,アクションマッピングで呼び出すメソッドを指定することができるアクションだ。このアクションを利用することで,1つのアクションのクラスで複数のアクションマッピングを扱うことができ,リクエストパスごとに呼び出されるメソッドを変更することができるようになる。

 このアクションを利用したアクションマッピングの定義は,以下のようになる。例では,2つのアクションマッピングが1つのアクションクラスUserDispatchActionを利用しているが,呼びだされるパスによって,起動されるメソッドがappendMethodかdeleteMethodかを変更することができる。

<action path="/append"
   type="sample.actions.UserDispatchAction"
   parameter="appendMethod">
  <forward name="append"  path="/top.jsp" />
</action>
  
<action path="/delete"
   type="sample.actions.UserDispatchAction"
   parameter="deleteMethod">
  <forward name="delete"  path="/top.jsp" />
</action>

 この機能によって,ハイパーリンクなどのいままでDispatchActionをうまく利用できなかったケースでもDispatchActionが利用できるようになった。

ワイルドカード・アクションマッピング

 ワイルドカード・アクションマッピングは,アクションマッピングのリクエストパスの定義にワイルドカード「*」を利用する機能だ。この機能を利用すると,複数のアクションマッピングを1つの定義で行えるようになり,アクションマッピングの定義が非常にすっきり記述できるようになる。マッピングの記述のみの機能強化であり,呼び出されるアクションは何でも構わない。

 ワイルドカード・アクションマッピングを利用したアクションマッピングの定義は以下のようになる。

<action path="/member*"
    type="sample.actions.Member{1}Action"
    name="member{1}Form"
    scope="request" >
  <forward name="failure" path="/top.jsp"/>
  <forward name="success" path="/{1}.jsp"/>
</action>

 例からも分かるように,path属性にワイルドカードを示す「*」が記述できるようになった。この指定によって,/memberAppend.doでも/memberDelete.do でもこのマッピングが実行されることになる。そして,実際に呼び出すクラスやメソッド,利用するアクションフォームビーンも動的に変更可能となっている。

 {}をアクションクラス名やアクションフォームビーン名の中に記述しておけば,マッチした文字列で置き換えるという機能も用意されている。利用方法によっては大幅にアクションマッピングの記述を省略できるのではないだろうか。