インタビュー: Emmanuel Bernard氏にBean Validation仕様について聞く
Bean Validationフレームワークの初期ドラフトに関する以前の記事に続き、InfoQは専門家グループが求めているコミュニティの関与と提案について理解を深めるため、Emmanuel Bernard氏と対談しました。
- Java,

作者 Ian Roughley, 翻訳者 編集部 投稿日 2007年9月26日 午前6時10分
Struts は、多くの人に親しまれています。実際に使用したことがある人や、関連の記事や書籍を読んだことがある人も多いことでしょう。この記事では、Struts の視点から Struts2 の機能を説明し、単純なアプリケーションを移行してみたいと思います。
移行プロセスの説明を始める前に、Struts2 の背景を少し説明しておく必要があります。この記事では最初に Struts2 の概要を説明します。全体の概念を理解するのに役立つよう、コアアーキテクチャの違いをいくつか説明します。パート Ⅱ では、バックエンドの移行について説明します。アクションの違い、フレームワーク機能に関連したアクション、およびアクション設定について詳しく説明します。この記事の最終パートでは、ユーザーインターフェイスについて説明します。アーキテクチャ、UI コンポーネント、およびテーマとタグを説明し、アプリケーションの新しいインターフェイスを作成します。
この記事の目的は、利用可能な移行シナリオすべてを説明することではなく、一般的な出発点から、Struts2 の概念、および使用可能な新機能を紹介することです。この知識さえ装備しておけば、どのようなスケールのアプリケーションでも容易に移行することができます。
Struts の最初のバージョンは、2001 年 6 月にリリースされました。これは、JSP とサーブレットを組み合わせて使用することで、Web アプリケーションのビューと、ビジネスロジックやアプリケーションロジックとを明確に分離する、という考えから生まれました。Struts の登場以前は、ビジネスロジックやアプリケーションロジックを JSP に追加したり、サーブレットから println() ステートメントを使用して表示を行ったりするという選択肢が最も広く用いられていました。
Struts のリリース以降は、Struts が Web アプリケーションの事実上の業界標準になっています。このような浸透と同時に、機能拡張および変更も継続的に行われています。Web アプリケーションフレームワークに対する要件は変化が激しく、それに応えなければならならないというのはもちろん、次々と登場してくる競合フレームワークの機能に対応するという意図もあります。
このため、次世代 Struts についてはいくつかの提案がされてきました。昨年に最もまとまってきた選択肢の 2 つが、Shale と Struts Ti です。Shale は、コンポーネントベースのフレームワークであり、最近、Apache プロジェクトのトップレベルプロジェクトとなりました。一方、Struts Ti は、Struts を成功へと導いたフロントコントローラ、つまりモデル - ビュー - コントローラのパターンを継承しています。
WebWork プロジェクトは、Struts の革命として始まったものです。これは、Struts から分岐したものですが、もともとの Struts コードとは互換性のなくなる可能性のある新しい概念および機能を採用しています。最初のリリースは、2002 年 3 月でした。WebWork は、いくつかのマイナーリリースおよびメジャーリリースを経て、現在は成熟した 1 つのフレームワークとなっています。
2005 年 12 月には、WebWork と Struts Ti が合体することが発表されました。このときに、Struts Ti は、Struts Action Framework 2.0、つまり Struts の後継となりました。
なお、Struts プロジェクトと WebWork プロジェクトがなくなっていくわけではありません。関心が高く、意欲的な開発者が存在する間は、バグ修正、機能拡張や新機能の追加などでどちらのプロジェクトも継続します。
アプリケーションを Struts から Struts2 に変換する詳細な方法を説明する前に、まずは要求が処理されるプロセスをたどりながら、新しいアーキテクチャがどのようなものなのかを説明します。
要求のライフサイクルについてウォークスルーを確認行う中で、Struts2 は依然としてフロントコントローラを使用するフレームワークである、という重要な事実がわかってくることでしょう。今まで慣れてきたすべての概念は、今回も応用することができます。
つまり、次のことを意味します。
要求処理の概要を以下の図に示します。

要求の処理は、6 個のステップに分けることができます。
既におわかりのとおり、いくつかの違いがあります。最も明らかなのは、Struts2 が プル型 のMVC アーキテクチャであるという点です。これは、どういうことでしょうか。開発者の視点からすると、ユーザーに表示する必要のあるデータを、アクションから取得できる (引っぱってくる) ということを意味します。これは、Struts とは異なります。Struts では、HTTP ページ、要求、またはセッションなどの形でデータが bean に存在することが前提とされています。データを取得できる元としては、ほかにもいくつかの場所があるので、それらについてはそれぞれのシナリオのときに説明します。
まず、最も重要な設定は、サーブレットコンテナ web.xml ファイル内で Web アプリケーションフレームワークを有効にすることです。
Struts の設定としては、一般的に次のようなものが使用されています。
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
Struts2 では、少し変更があります。最も大きな変更は、指示がサーブレットからサーブレットのフィルタに変更されていることです。設定は、サーブレットの場合と同じように簡単であり、以下のようになります。
<filter>
<filter-name>webwork</filter-name>
<filter-class>
org.apache.struts.action2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>webwork</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
サーブレットの設定と同様、フィルタの設定では、名前 (参照のための) とフィルタのクラスを定義します。フィルタのマッピングは、名前と、そのフィルタを呼び出す URI パターンを関連付けています。デフォルトでは、拡張子が .action であるというパターンです。これは、default.properties ファイル (Struts2 JAR ファイル内) で struts.action.extension プロパティとして定義されています。
補足: default.properties ファイルは、多くの設定オプションが定義されている場所です。struts.properties という名前のファイルを Web アプリケーションの classpath に含めることで、そのプロパティのさまざまな値でデフォルトの設定を上書きできます。
Struts の場合は、サーブレット設定に、Struts の設定のために使用するファイルの名前を定義する init-param タグがあります。Struts2 には、そのような設定パラメータはありません。その代わりに、Struts2 のデフォルトの設定ファイルは、struts.xml という名前で、Webアプリケーションの classpath 上にある必要があります。
補足とヒント: Struts アクション (拡張子は .do) と、Struts2 アクション (拡張子は .action) は名前空間が分離されているため、同じ Web アプリケーションでそれらを共存させることに何の問題もありません。これは、移行プロセスを開始するときに非常に役立ちます。まずは、必要な設定を追加して、新機能をすべて Struts2 で開発します。残りのアクションは、時間とリソースに余裕があるときに変換します。また、2 つのフレームワークを永続的に共存させることも可能です。既存のアクションを必ず移行しなければならないということはありません。移行のもう 1 つの戦略として、Struts2 の拡張子を .do に変更することにより、アクションのみを更新する方法があります。このように変更することで、既存の JSP はそのまま残して再使用することが可能です。
要求が関するウォークスルーで、Struts と Struts2 の違いのいくつかを大まかに説明しました。ここでは、より詳しく説明します。各フレームワークのアクションの構造の違いを見ていきましょう。
最初に、Struts アクションの一般的な構造を確認します。Struts アクションは、一般的には次のような構造になります。
public class MyAction extends Action {
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// do the work
return (mapping.findForward("success"));
}
}
Struts アクションを実装する際は、次のような事項を意識する必要があります。
これに対し、Struts2 アクションの実装は大幅に簡略化されています。 次のようになります。
public class MyAction {
public String execute() throws Exception {
// do the work
return "success";
}
}
まず、アクションがいずれのクラスまたはインターフェイスも拡張していないことに注意してください。実際には、拡張よりも高度な方法となっています。慣例により、アクションの処理で呼び出されるメソッドは execute メソッドになっていますが、このようにする必要はありません。public String methodName() というメソッドシグネチャに準拠したメソッドであれば、どのようなメソッドでも設定によって呼び出し可能にすることができます。
次に、返されるオブジェクトは String です。コードにおいて String リテラルが適切でない場合は、ヘルパインターフェイス Action が使用可能です。これは、success、none、error、input、および login という一般的な結果を定数として提供することができます。
最後に、おそらく最初の Struts 実装から最も大きく、革命的に変更された点は、アクションの処理で呼び出されるメソッド (execute メソッド) のパラメータがなくなったことです。では、処理する必要のあるオブジェクトにどのようにアクセスするのでしょうか。この質問の回答は、「制御の反転 (inversion of control)」または「依存性注入 (dependency injection)」と言われるパターンに関係します (詳細については、Martin Fowler の http://www.martinfowler.com/articles/injection.html の記事を参照してください)。このパターンを普及させたのは Spring Framework ですが、Struts2 の前身 (WebWork) も同時期にこのパターンの使用を開始しています。
制御の反転の理解を深めるために、アクションの処理が現在の要求の HttpServerRequest オブジェクトへのアクセスを必要とする例を考えてみましょう。
この例で使用される依存性注入のメカニズムは、インターフェイス注入です。名前からもわかるように、インターフェイス注入では、実装する必要のあるインターフェイスが存在します。このインターフェイスには setter が含まれ、この setter が、データをアクションに提供するために使用されます。ここでの例では、次のような ServletRequestAware インターフェイスを使用します。
public interface ServletRequestAware {
public void setServletRequest(HttpServletRequest request);
}
このインターフェイスを実装する場合、上記の単純なアクションは少し複雑になります。しかし、HttpServerRequest オブジェクトを使用することができるようになります。
public class MyAction implements ServletRequestAware {
private HttpServletRequest request;
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public String execute() throws Exception {
// do the work using the request
return Action.SUCCESS;
}
}
おそらく、この時点でいくつかの注意点が浮かぶことでしょう。アクションに、クラスレベルの属性が存在することになりますが、これらは実際には問題ありません (ただし、スレッドセーフではありません)。Struts2 では、要求ごとにアクションインスタンスが作成されます。アクションインスタンスは、共有されることなく、要求が完了した後に破棄されます。
残されている最後のステップは、ServletConfigInterceptor インターセプタをこのアクションに関連付けることです。このインターセプタは、HttpServletRequest を取得し、それを ServletRequestAware インターフェイスを実装したアクションに注入する機能を提供します。ここでは、設定の詳細について気にする必要はありません。次の記事で詳しく説明します。今回の記事で重要なことは、インターセプタとインターフェイスが連携して、アクションに対して依存性注入を行っている、ということを理解しておくことです。
この設計の利点は、アクションがフレームワークから完全に分離される点です。アクションは、フレームワーク以外でも使用することが可能な単純な POJO (Plain Old Java Object: ごく普通の昔からある Java) となります。これは、単体テストのときにも効果があります。Struts アクションを StrutsTestCase や MockStrutsTestCase の単体テストに組み入れる労力に比べると、Struts2 アクションの単体テストの実施はかなり簡単になります。
この記事により、Struts2 の高レベルのアーキテクチャ、および要求の基本的なワークフローが理解できたことでしょう。サーブレットコンテナとして Struts2 を設定し、Struts と Struts2 のアクションの違いを知ることができるはずです。
次の記事では、移行するアプリケーションのサンプルを紹介し、この記事での知識を基に、サンプルのアプリケーションのアクションを Struts から Struts2 へ移行します。最終的には、JSTL、JSP および Struts2 を使用して機能するアプリケーションを目指します。アクションの違い、およびアクションと他のフレームワーク要素の設定についてもさらに詳しく説明します。フレームワーク機能に関連するアクションについてもさらに説明します。
Ian Roughley(メール) は、マサチューセッツ州ボストンを拠点とする独立コンサルタントであり、講演や執筆などの活動も行っています。彼は、フォーチュン 10 社から創業間もないクライアントまで、さまざまな規模のクライアントに対して、アーキテクチャ、開発、プロセス改善および指導サービスを 10 年間にわたり提供してきました。彼は、実用的で成果重視の手法に注目し、オープンソースや、アジャイル開発技法によるプロセス改善および品質改善を支持しています。
原文はこちらです:http://www.infoq.com/articles/converting-struts-2-part1
(このArticleは2006年9月19日にリリースされました)
Bean Validationフレームワークの初期ドラフトに関する以前の記事に続き、InfoQは専門家グループが求めているコミュニティの関与と提案について理解を深めるため、Emmanuel Bernard氏と対談しました。
ポーカーは他のトピックにも広く適用できるような数少ない教えを私にもたらしてくれたと信じています。実際私はソフトウェアを開発すればするほど、これら二つの仕事は非常に似ていると言う確信の度合いを深めています。
恒例の「バーチャルパネルセッション」で、InfoQは新しいOASIS BPEL4People技術委員会の代表と対談をし、この作業が何故必要であるかについて彼らのフィードバックを得る機会を得ました。
ドメイン特化言語は最近非常に人気が高まっている話題です。これは恐らく、Rails現象に起因していると考えられます。Railsの人気と、Railsにおけるドメイン特化言語(以降、DSL)の大規模な使用は、DSLに対する広範な関心を呼び起こしました。
Rubyには、Rubyコミュニティの内外で広く知られている誤解が一つある。Rubyにはデバッガがないという誤解だ。しかし、Rubyにデバッガが無いということは誤解なのだ。実際のところ、Rubyにはデバッガ用のツールがある。
InfoQ Chinaは中国でスクラム(Scrum)がどのように導入されているかに関する調査を行いました。私たちはこの記事のために5つの事例をピックアップしました。これらの事例は、異なるさまざまな会社によるもので、異なるプロセスが利用され、異なる結果が生じたものです。
Udi Dahan氏のチームが、サービス契約を利用した2度の失敗を避け、複数の側面でのスケーラビリティに対処しています。
Agileを始めるときは、とても分かりにくいです。一体どこから手をつければいいのでしょう?この物語はそんな皆様の一助になれば幸いです。本書は、スウェーデンにある、とある40人ほどの会社で、どのようにAgileとXPを実行したか、プロセス改善を行ったかを記しています。
No comments
返信