リスト3 ●日記一覧を表示するread.jsp のコード
リスト3 ●日記一覧を表示するread.jsp のコード
[画像のクリックで拡大表示]
リスト4 ●簡易日記帳アプリケーションのためのリソース・ファイル(抜粋)
リスト4 ●簡易日記帳アプリケーションのためのリソース・ファイル(抜粋)
[画像のクリックで拡大表示]
リスト5 ●クラスやJSP ページの関連付けを行う設定ファイルstruts­ config.xml (抜粋)
リスト5 ●クラスやJSP ページの関連付けを行う設定ファイルstruts­ config.xml (抜粋)
[画像のクリックで拡大表示]
リスト6 ●アクション・クラスUpdateAction のupdate メソッド(抜粋)
リスト6 ●アクション・クラスUpdateAction のupdate メソッド(抜粋)
[画像のクリックで拡大表示]

Viewを担うJSPページに実行結果を表示する

 アクション・クラスでの実行結果は,JSPページに渡されます。UpdateAction#readメソッドの実行結果を表示するのが,read.jsp(リスト3[拡大表示])の役割です。ここではJSPページに含まれるタグに注目してみましょう。タグ・ライブラリを利用することで,HTMLに似たタグの形式で動的な仕組みを構築できるようになります。

 <html:~,<bean:~で始まるタグがStrutsタグ・ライブラリ,<c:~で始まるタグと${fn~}で始まる式言語*8がJSTLで提供されるタグです。これらのタグ・ライブラリを利用するには,あらかじめ@taglibディレクティブで宣言しておく必要があります*9

 UpdateAction#readメソッドでセットされたリクエスト属性「Article.List」(Articleオブジェクトの可変配列)の内容を表示しているのがリスト3(1)の部分です。<c:forEach>要素は,items属性で指定された配列の内容を順番にvar属性で指定された変数にセットしながら,配列内の要素がなくなるまで繰り返し処理を行います。ループ内で配列内の要素値を出力するには「${変数名.プロパティ名}」とします*10

 <bean:message>は,リソース・ファイル(リスト4[拡大表示])*11で指定された文字列を出力するためのタグです(リスト3(2))。リソース・ファイルはWebページに表示する文字などのリソースを記述するファイルです。JSPページ上に言語/地域依存の情報を直接コーディングするのは好ましくありません。将来的に別言語にも対応する必要が出てくるかもしれないからです。この例のように,あらかじめ地域依存情報をリソース・ファイルに外部化しておけば,国際化のニーズにも容易に対応できます。

 <html:link>は,アンカー・タグを生成するためのタグで,ここでは日記登録画面へのリンクを生成しています(リスト3(3))。action属性の値は,struts-config.xmlで指定した値と対応している必要があります。

クラスの関連付けを行うstruts-config.xml

 Strutsでは,一つのリクエストを処理するためにアクション・クラスやJSPページといった複数の部品を利用します。これらの関連付けを行うのがstruts-config.xmlという設定ファイルの役割です(リスト5[拡大表示])。struts-config.xmlは,Strutsの心臓部であるアクション・サーブレットに指示を出す「要件書」と考えればわかりやすいかもしれません。

 例えば,リスト5の(1)を見てください。<action>要素は,path属性で指定されたアクション名に対し,実行するアクション・クラス(type属性)とメソッド名(parameter属性)を関連付けます。つまりこの設定により「http://localhost:8080/nikkei/ReadAction.do」というURLに対して,UpdateAction#readメソッドが呼び出されるわけです。また,アクション・クラスの実行メソッドから結果ステータスとして「success」が返された場合には,その処理結果をread.jspで表示します。ちなみに複数の<forward>要素を併記することで,処理ステータスが「success」の場合はa.jsp,「fault」の場合はb.jspというように,アクション・クラスの処理結果によって遷移するページを振り分けられます。

 また,アクション・クラスを必要とせず,そのままJSPページにアクセスしたい場合,空のアクション・クラスを記述しても構いませんが,ForwardActionクラスを利用すればアクション・クラスを経由せずにJSPページに処理を転送できます(リスト5(2))*12

リクエスト・データを取得しアクション・フォームで受け渡し

 次に,登録画面を眺めてみましょう。ここで注目していただきたいのはリクエスト・データの授受です。

 アプリケーションを構築するうえで,ユーザーが入力した情報の授受は欠かせない処理です。Strutsにリクエスト・データを引き渡すにはいくつかの方法がありますが,ここではその中で最も単純な方法を示します。図1で示したアクション・フォームに相当する部分になります*13

 フォームから引き渡せるプロパティ情報を定義しているのがstruts-config.xmlの<form-bean>要素です(リスト5(3))。name属性はフォームを一意に識別する論理名,type属性はフォーム機能を実装するクラスを指定します。サンプルではリクエスト・データの検証機能を利用しているので,DynaActionFormクラスを指定する必要があります*14。フォームに含まれる要素の設定は,<form-bean>要素内の<form-property>要素で定義します。name属性は要素名を,type属性はデータ型をそれぞれ指定します。

 あとは,このフォームを特定のアクション(<action>要素)に関連付けるだけです(リスト5(4))。name属性に<form-bean>要素で命名したフォームの論理名を,scope属性にフォーム情報のスコープを指定してください。

 このように定義されたフォーム情報は,アクション・クラスからActionFormオブジェクト(サンプルではform)を介して取得できます(リスト6[拡大表示])。引数で渡されたActionFormオブジェクトは,使用に先立って「必ずDynaBeanオブジェクトにキャストすること」と「DynaBean#getメソッドで取得したデータは適切なデータ型にキャストすること」の2点に注意してください。ここでは,入力された件名,本文,日付をArticleオブジェクトにセットし,updateInfoメソッドでデータベースに登録しています。updateInfoメソッドの詳細については,サンプルに含まれるソースコード「Article.java」を参照してください。

☆               ☆               ☆

 今回は代表的なオープンソースのフレームワークとしてStrutsを取り上げました。もちろん,Strutsの機能は今回紹介したものだけではありません。冒頭に挙げたほかのフレームワークもそれぞれ特徴を持っています。この記事を足がかりに様々なフレームワークに触れていただければ幸いです。


山田 祥寛(やまだ よしひろ)

千葉県鎌ヶ谷市在住のフリーライター(http://www.wings.msn.to/