新トップページへ | Tip

strutsの使い方メモ(1.2系)

LastUpdate : 09/04/25

 自分用に、strutsのまとめを書いておこうと思い、このページを作成しました。丁寧な解説は皆無ですw
実行結果と、ソースしかのっけてませんが、まぁ、ソースだけみればなんとなくわかるんじゃないかなぁ〜と思います。

※注意
 内容について、大してチェックしてないので、間違ってる点があるかもしれません・・・。
 間違っていたら、ごめんなさいtt

私は、主に以下の本を参考に勉強しました。

『プログラミング Jakarta Struts』(オライリー・ジャパン)
『StrutsによるWebアプリケーションスーパーサンプル 第2版』(ソフトバンク クリエイティブ)

このページでのstruts対象バージョンは1.2.9を基本としています。

もくじ

前提とする環境
jsp内で画面遷移させる方法(画面のredirectとforward)
各種入力フォームの基本的な使い方
入力フォームの初期値をActionBean内で指定する(+Iteratorタグの使い方
DynaActionFormの使い方
動的に増える入力フォームの扱い方
一つのフォームに複数のsubmitボタンがある場合(LookupDispatchAction)
tokenを使う(二度押し防止)
単純に画面遷移させる方法
一つのフォームに複数のsubmitボタンがある場合(DispatchAction)
struts上でのメッセージの扱い方
struts上での例外の処理方法
strutsによる入力チェック方法
strutsによる入力チェック方法(DynaValidatorFormの使用)
tileタグの基本的な使い方
基本的な各種タグの使い方のサンプル
strutsのモジュール分割機能の利用方法(サブアプリケーション)
ActionMappingの拡張方法
struts-config.xmlをファイル分割する方法

前提とする環境

http://struts.apache.org/より、strutsをDLします。今回使用したのは「 struts-1.2.9.zip 」です。
解凍後、webappsディレクトリ内の、struts-blank.warファイルを解凍したものを基本として使用します(普通にアーカイバで解凍できます)。

私の実行環境は、

WindowsVista HomeBasic
Eclipse3.4
Tomcat6.0
JDK1.6.0_11
InternetExplorer7

です。

jsp内で画面遷移させる方法(画面のredirectとforward)

単純な画面の、forward/redirectについてです。
index.jspページにアクセスすると、sample1.jspページへ遷移します。遷移方法にforwardとredirectが指定可能ですので、その方法について記述しています。

index.jspの中にコメントとして簡単な説明が書いてあります。

今回作成したファイルは以下のものです。

index.jsp
トップ画面です。このjspにて、forward/redirectのコードが書かれています。forwardをする場合に指定するコード、redirectをする場合に指定するコードと、コメント中に記述してあります。使用したいほうをコメントからコピペします。
例として、forwardを使う例をコメントからコピペしてあります。
sample1.jsp
index.jspからredirect/forwardで画面遷移させる画面です。ただのいたって普通のjspです。
struts-config.xml
ファイル名を直接指定し、画面遷移させない場合、このファイルにどのjspに遷移させるかを記述します。

各種入力フォームの基本的な使い方

strutsを使う場合、jspも、strutsのタグライブラリを使用し、記述していきます。
以下のような遷移をするプログラムが、今回使用するサンプルです。

サンプルのような動作をさせるため、以下のようなファイルを用意しました。

inputPage.jsp
各種入力フォームを表示します。
InputAction.java
入力画面jspからのsubmitに対し、strutsのコントローラから呼ばれるActionBean。今回は、ほとんど何も処理しません(画面の遷移先のみ指定しています)
InputForm.java
inputPage.jspにて入力された値を保持する、FormBean。
resetメソッドを実装することで、各種入力フォームの初期値を設定しています。
result.jsp
InputActionの処理結果を出力する結果画面
struts-config.xml
各種設定を記述しています。

以下のような動作をします。

■各種フォームに値を入力し、「submit」ボタンを押下(inputPage.jsp)

■前画面で入力された値を一覧表示する(result.jsp)


入力フォームの初期値をActionBean内で指定する(+Iteratorタグの使い方

画面の入力フォームに、動的に初期値を設定したい時があります。ActionBean内で初期値を設定し、次画面でその値がデフォルト値として入力済みの状態にすることが可能です。

今回は、以下のようなファイルを作成しました。

DataBucket.java
データ格納用に使用したクラスです。
InputAction.java
input.jspにて、「submit」ボタンを押下すると、呼び出されるActionBeanクラスです。
InputForm.java
InputActionにて使用するフォームBeanです。
MessageResources.properties
messageタグにて表示する文字列は、このファイルにて指定します。
WEB-INF/classes/Messageresource.properties に配置します。
input.jsp
最初に表示される画面用のjspです。
result.jsp
InputActionの処理結果を表示するための画面用jspです。
InputFormから受け取ったリストをIteratorタグを使用し、すべて表示しています。
struts-config.xml
InputActionとInputFormの関連性、そして画面遷移先を設定しています。また、今回から、MessageResourceファイルを指定しています。

■トップ画面(input.jsp)

■初期値がActionBeanによって設定されている(result.jsp)

DynaActionFormの使い方

DynaActionFormを使うと、フォームBeanの作成を省略することができます。よい点というのが、フォームBeanのファイルの数が減らせる点・・・ぐらい??

今回のサンプルでは、以下のようなファイルを作成しました。

GeneralForm.java
とくに今回のサンプルにおいて必要ではなかったのですが、おまけで作成しました。
InputActionにて、setAttributeで自分のつけた名前を、result.jspの中で、writeタグのnameに指定してやることで、自由に値をだすことが可能です。
index.jsp
トップ画面のjspです。
InputAction.java
input.jspにて「submit」ボタンが押下された際、呼び出されるアクションBeanです。
result.jsp
InputActionの処理結果を表示する画面です。
struts-config.xml
form-beanにて、使用するフォームBeanを、DynaActionFormに設定することで、DynaActionFormを使用することが可能です。form-propertyで、どのような値がセットされるのか、設定してやる必要があります。
MessageResources.properties
トップ画面のタイトルの文字列を定義しています。

■トップ画面(index.jsp)

■結果画面(result.jsp)


動的に増える入力フォームの扱い方

この場合、フォームBeanにて、ちょっとした細工が必要になります。普通、setXXXメソッドを呼び出し、フォームBeanに値がセットされますが、jspタグにて、indexed="true"がつけられると(詳しくは、showList.jspを参照)、フォームBeanで値をセットする際、setXXXメソッドではなく、getXXX(index値)のメソッドが呼ばれます。strutsは、その帰ってきたインスタンスに対し、setXXXメソッドを呼びます(そういう仕様らしい??)。
 なので、フォームBeanとしては、さきほど、getXXX(int index)で生成したインスタンスを保持しておく必要があります(サンプルではリンクリストにいれてます)。
まぁ・・・この仕組みはすぐに、私は理解できませんでした・・・。結構複雑ですね。

今回、作成したものは以下の通りです。

InputAction.java
トップ画面から、中間画面へ遷移する際、処理されるアクションBeanです。トップ画面にて、与えられた数分、入力フォームを生成しています。
InputAction2.java
特になにもしていません。結果画面へ遷移させています。
DataBucket.java
データの格納先として使用しています。
ListFormBean.java
今回、一番のミソとなる部分です。中間画面から、結果画面へ遷移する際使用されるフォームBeanです。
index.jsp
トップ画面のjspです。
result.jsp
結果画面のjspです。
showList.jsp
中間画面のjspです。
struts-config.xml
特に変わった部分はありません。いつもどおりです。必要なもののみ記述しています。


■トップ画面(index.jsp)

■中間画面(showList.jsp)

■結果画面(result.jsp)


一つのフォームに複数のsubmitボタンがある場合(LookupDispatchAction)

一つのフォームに複数のsubmitボタンを配置し、それぞれのボタンが押下された場合、処理を行うロジックの出しわけを行いたい場合があります。今回はそれの対応方法です。
DispatchActionクラスを使用する方法もあるのですが、こちらは、個人的に、使いづらいと思っているため扱わないこととします(struts DispatchActionでググればすぐ出てくると思います)。

今回作成したのは、以下のファイルです。

SubmitAction.java
index.jsp画面にて、submitボタンが押下された際、呼び出されるActionBeanです。submit1、submit2どちらを押下しても、このクラスが呼ばれます。
SubmitActionForm.java
今回、このサンプルでは、特に意味がありません。
MessageResources.properties
submitボタンに表示するラベルを指定するのに使用します。
struts-config.xml
actionに、パラメータとして、parameterが増え、そこで、submitタグで指定しているpropertyと同じ値を指定してやります。
index.jsp
トップ画面です。一つのフォームに二つのsubmitボタンがあります。
result1.jsp
submit1ボタンが押下されたときの、遷移先画面です。
result2.jsp
submit2ボタンが押下されたときの、遷移先画面です。

■トップ画面(index.jsp)

■「submit1」ボタンを押下した場合の、結果画面(result1.jsp)


tokenを使う(二度押し防止)

strutsにより、セッション上に、(たぶん)重複のないtokenを保存しておき、それを画面のhidden値として埋め込みます。そして、submitを受け取るアクションBeanにて、そのtokenが有効化チェックしてやることで、二重押し、または、ブラウザの「戻る」ボタンを使い、複数回、submitボタンが押下されたのか、チェックを行うことができます。

サンプルでは、二重押しの場合はエラー画面(result_error.jsp)へ遷移し、正常ならば、正常画面(result_ok.jsp)へ遷移するようにしています。

今回作成したのは、以下のファイルです。

index.jsp
トップ画面です。
check.jsp
この画面の、フォームには、tokenの値がhiddenでセットされており、ActionBeanにて、複数回押されているかどうか、確認することができます。
result_ok.jsp
サンプルにおいて、二重押しされていない場合は、この画面へ遷移するようになっています。
result_error.jsp
サンプルにおいて、二重押しされている場合は、この画面へ遷移するようになっています。
NextAction.java
index.jsp画面にて、submitボタンが押下されると、このクラスが呼ばれます。トークンをセットする旨をstrutsへ指示をしています。
ResultAction.java
check.jsp画面にて、submitボタンが押下されると、このクラスが呼ばれます。トークンをチェックし、二回以上ボタンが押されているか確認し、result_ok.jsp画面へ遷移させるか、result_error.jsp画面へ遷移させるか判定しています。
struts-config.xml
通常の設定を行っています。トークン処理において、struts-config.xmlにて、特別な設定は不要です。

■トップ画面(index.jsp)

■二重押しチェックが有効なボタンがある画面(chec.jsp)

■正常系結果画面(resut_ok.jsp)

■異常系結果画面(result_error.jsp)


単純に画面遷移させる方法

jsp内で画面遷移させる方法(画面のredirectとforward)」にて書いた方法は、そのjspが表示された時、処理が走り、別ページに自動的に遷移するものでした。
今回のものは、submitボタンが押下された場合です。
submitボタンが押下されると、その後はstrutsが用意しているアクションBeanに処理させるため、struts-config.xmlと遷移先の画面のjspだけ用意すればOKです。

今回用意したものは、以下のものです。遷移に、ForwardとIncludeが使えますので、それぞれの処理結果を表すため、結果画面を二つ(result_include.jspとresult_forward.jsp)用意しています。

index.jsp
トップ画面です。二種類の遷移を見るため、Includeで画面が遷移するものと、Forwardで画面が遷移するもの、それぞれのボタンが用意されています。
result_forward.jsp
forwardで画面遷移した際、表示される画面です。
result_include.jsp
includeで画面遷移した際、表示される内容です。
struts-config.xml
画面の画面遷移先をここで指定しています。

struts-config.xmlにて、どうやらフォームBeanを指定しなければいけないらしく(指定してやらないと動作しない)、そのため、とりあえずということで、tmpという名前でDynaFormBeanを定義して、それを使ってます。これ、なしで実行する方法はあるのかしら・・・?


一つのフォームに複数のsubmitボタンがある場合(DispatchAction)

一つのフォームに複数のsubmitボタンがある場合(LookupDispatchAction)」にて書いた方法以外に、DispatchActionを使用する方法もあります。
しかし、この方法は、メソッド名が外部へ公開されてしまうため、使用するのは好ましくないと思い触れない予定でしたが、とりあえず書いておきます。メソッド名を外部に出さず、struts-config.xmlに直接指定可能な「MappingDispatchAction」がありますが、基本的にLookupDispatchActionを使えば万事解決ですので、省略しています。

サンプルには、POSTでやる方法、GETでやる方法、ふたつ一緒に例を挙げています。

InputAction.java
通常なら、ActionBeanにはsubmitボタンが押下された際の処理を、executeメソッドにて記述しますが、今回はexecuteメソッドではない名前にします。struts-config.xmlでparameterで定義した名前で渡ってくる値が、そのままメソッド名になります。
struts-config.xml
actionのところへ、parameterという要素を加えます。そして、そこには、ActionBeanで実行するメソッド名を渡す際のキー名をここで指定してやります(例の場合はbuttonと設定している)。
index.jsp
トップ画面です。面白い点として、ボタンのラベルの文字列になる箇所が、メソッド名として使われる様子です。日本語を指定する方法があるのか、私は知りませんw
result1.jsp
submit1ボタンが押下された際、遷移する画面です。
result2.jsp
submit2ボタンが押下された際、遷移する画面です。

■トップ画面(index.jsp)

■submit1ボタンを押下した際の結果画面(result1.jsp)


struts上でのメッセージの扱い方

strutsでは、MessageResources.propertiesに、メッセージに対する名前、そしてメッセージ本文を記述し、ソースからはメッセージに対する名前でを指定し、それに紐づいているメッセージが画面に表示される・・・、というような仕組みを提供しています(このMessageResources.propertiesの名前は変更できるんだろうけど、変更したことがないw)

アクションBean内でのメッセージの設定方法、jspからメッセージの呼び出し方法をサンプルに載せています。
今回作成したのは以下のファイルです。

MessageAction.java
index.jspからresult.jspに遷移する際のアクションBeanです。この中でメッセージをセットしています。
MessageResources.properties
メッセージ文言が格納されています。このファイルは/WEB-INF/classesの下に起きます。プログラム中、文字コードを指定して読み込むなど、特殊なことを行っていないため、このファイルのフォーマットはUnicodeの16進表記でなければなりませ。プロパティエディタなどのプラグインにて編集します。
index.jsp
トップ画面です。
result.jsp
結果画面です。この画面に、メッセージが表示されます。

■トップ画面(index.jsp)

■結果画面(result.jsp)


struts上での例外の処理方法

例外が発生した場合の、struts的に、それを拾い上げ、画面遷移が突然例外画面にならないように制御することが可能です。
例外の拾わせ方の設定として、指定のアクションBeanに対するものの、設定と、グローバル設定があります。特性のアクションBeanで処理中に例外が発生した場合、struts-config.xml内の、actionタグ内に設定してあるexceptionをまず検索し、一致する例外クラスがあるか調べ、その次に、global-exceptionで定義していあるexception内に一致する例外クラスがあるか・・・を探しに行く様子です。

また、exceptionの並び順も意味があり、上から順に評価され、一致するものが選ばれる様子です。

アクションBeanに対し、例外が発生した場合に、呼ばれる処理も指定が可能らしい(exception の中に、handlerdeで設定を行う)。しかし、あまり使わないであろうという個人的な理由からサンプルより割愛しています。
サンプル中、例外が起きる条件がそれぞれ異なるため、目的の例外を発生させる以外の、そのたの例外を発生させるソースはコメントアウトしてあります。なので、詳しくはソースを参照してください。コメントを書いてあります。

今回作成したのは以下のものです。

InputAction.java
トップ画面からsubmitボタンを押下した際、呼ばれるアクションBeanです。この中で例外を発生させています。
MessageResources.properties
エラーメッセージの本文をここに記述しています。
error.jsp
エラー画面です。この画面に最終的に遷移します。
index.jsp
トップ画面です。
result.jsp
例外が発生しない場合は、この画面へ遷移する予定でしたが、例外が発生するため、この画面へは遷移しません。

■トップ画面(index.jsp)

■エラー画面[代表例として、NullPointerExceptionが発生し、action内のexceptionで設定した例外設定にフックされた状態](error.jsp)


strutsによる入力チェック方法

strutsが提供しているユーザ入力値のチェックはいくらかあります。とりあえず、(1)〜(3)にて基本的な方法を説明し、その後、実際のソースをおいておきます。
正直なところ、validator関連のことはよくわかってません。理解不足です。
が・・・、まぁ、実際動かしてみて動いたので良しとします(笑)
validatorは結構やることが多く、面倒です。正直なところ、使いたくないというのが個人的感想です。

また、今回のテーマとは関係ありませんが、エラーメッセージを画面へ表示する際(html:errorsタグで表示させているところ)、今回は、errors.header、errors.prefix、errors.suffix、errors.footerを使用しています。動作はサンプルを見てみてください。こういうこともできるんだーという例です

(1)validateメソッドによる入力チェック
入力チェックをすべて自分でやるタイプの方法です。

■実装方法
 ActionFormやDynaActionFormなどのクラスを継承し、フォームBeanを作成する際、validateメソッドをオーバーライドし実装します。
 このメソッドの戻り値はActionErrorsクラスとなっており、入力エラーがあった場合は、ActionErrorsクラスにメッセージをaddしたものを戻り値とします(ない場合は一個もaddされていないActionErrorsのインスタンスを返す)。詳細はInputForm1.javaを参照して下さい。

 struts内で、ActionErrorsの中にメッセージが有る・無いを判断し、有る場合はエラー有り、無い場合はエラー無しと判断し、エラーありの場合は、struts-config.xmlのaction内で指定したinputの画面へ遷移します。
(2)Struts Validatorによる入力チェック
 Strutsの入力チェック機能を使用する方法です。

■実装方法
 Struts Validatorを使用する際、struts-config.xml内にて、プラグインのロードをしなければいけません(サンプルのstruts-config.xmlではL57〜L61がその該当箇所)。
 また、フォームBeanを記述する際、継承するクラスはActionFormではなく、ValidatorFormを継承し、アクションFormクラスを作成しますが、継承するクラスが異なる以外、通常のActionFormを作成する方法と変わり有りません。

 Struts Validatorの仕様でチェック不可能な入力チェックについては、フォームBeanにて、validateメソッドを実装し、自分でチェックを行います。
この時、validateメソッド内にて、親のvalidateメソッドを呼んでやらねば、validation.xmlのチェックルールに従ったチェックは実施されませんので、注意して下さい(サンプルのInputForm2.javaでは、L93が該当)。
 Struts Validatorがチェックできるものとして、validator-rules.xmlで定義されているものです。また、indexedListPropertyというものを使えば、配列に対してデータのチェックができるらしいですが、使いどころを私はよくわかってないので、サンプルにのせてません。知りたい場合はググってください。

また、StrutsValidatorのチェックルールはvalidation-rules.xmlに定義されています。ここにて、独自のルールを定義し、使用することも可能らしいです(私はやったことないです)。

■出力するエラーメッセージの指定方法について
 validation.xmlにて、InputForm2のvalidate方法についてL10〜L57に記述しています。
varタグにて、maskやintRangeなどチェックする際、値の範囲などの指定が必要な場合は、varタグの中にて指定してやります。
msgタグにて、エラーメッセージの指定を行います。nameにてdependsにて指定したどのチェックルールに対するエラーメッセージなのか指定します。そしてkeyにて表示するメッセージを指定します
arg0タグでは、エラーメッセージ中の{0}をどの文字列に置換するか指定しています(arg1タグならば{1}の置換対象を指定します。arg2なら{2}を・・・という感じ)。

msgタグやarg0(arg1以降も同じく)はresource="false"をつけると、message-resourceにて指定した文字列ではなく、keyにて指定した文字列そのものが対象となります。
(3)Struts Validatorによる入力チェック(JavaScriptによるチェック)
(2)の方法に、ちょろっとおまけで記述してやると、JavaScriptによる入力チェックも追加できます。ただし、おまけ程度に認識しておいたほうがよいかと思います・・・。

■実装方法
(2)に対し、以下の追加作業を行えば完了です。
・ html:javascriptタグを使い、検証用JavasScriptをjspページに生成する(input3.jspにて、該当箇所はL12です)。
(これにて生成されるJavaScriptの関数名は「 validate<フォーム名> 」という名前になるらしい。これ以外の名前を指定したい場合は、method="<好きな名前>"で指定可能)
・ html:formタグにて、onsubmitに上記で定義したJavaScriptを呼び出す処理を追記する(input3.havaにて、該当箇所はL33です)

この検証方法については、サンプルにあります、validwhenを使用したものについては、JavaScriptは生成してくれないらしいです。なので、なんでもかんでもJavaScriptでチェックできるわけではないらしい。

今回作成したのは、以下のものです。〜1となっているものが(1)に該当し〜2となっているものが(2)の説明に該当します。

index1.jsp
InputForm1.java
result1.jsp
(1)の例のトップ画面、フォームBean、結果画面です。
InputForm1にてvalidateメソッドをオーバーライドし、入力チェックを行っています。入力エラーが有る場合、index1.jsp画面に再度遷移し、エラーメッセージを出力しています。
index2.jsp
InputForm2.java
result2.jsp
(2)の例のトップ画面、フォームBean、結果画面です。
StrutsValidatorを使用し、チェックできていない部分についてのみ、InputForm2のvalidateメソッドにてチェックを行っています。入力エラーが有る場合、index2.jsp画面に再度遷移し、エラーメッセージを出力しています。
index3.jsp
InputForm3.java
result3.jsp
(3)の例のトップ画面、フォームBean、結果画面です。
(2)の方法に加え、JavsScriptによるチェックも加えています。ブラウザにてJavaScriptが無効設定であった場合、JavaScriptによる入力チェックは行われませんが、submit後、(2)と同じ入力チェックが行われます。その入力チェックにて、エラーが有る場合、index3.jsp画面に再度遷移し、エラーメッセージを出力しています。
InputAction.java
index1.jsp、index2.jsp、index3.jsp共に、共通して使用しているアクションBeanです。今回は入力の検証がテーマなので、特に内部で何も行いません。
MessageResources.properties (SJISに文字コード変換したもの
メッセージを定義しています。今回はメッセージの文字列をちゃんとみれるようにするため、文字コードを変換したものもアップしました(上記「SJISに文字コード変換したもの」)。
struts-config.xml
Struts Validatorを使用する場合、actionタグにて、validate="true"を設定し、inputにて入力エラーが有った場合の遷移先画面を指定しています。
また、Struts Validatorを使用する場合、プラグインの読み込みが必要なため、plug-inタグにて読み込みを行ってます。
validation.xml
Struts Validatorにて、それぞれのフォーム毎の入力チェック方法を指定しています。
 ※ checkboxに対する入力チェックの定義方法がこれでよいのか、正直悩んでいます・・・が、とりあえず想定どおりの動作をするので、今回はこのようになってます。

代表例として(2)のケースの画面遷移(画面の表示的には、(1)〜(3)同じです。ただし(3)の場合は、JavaScriptのダイアログでエラーメッセージが表示されますが・・・)

■トップ画面(index2.jsp)

■トップ画面[エラーメッセージ有り](index2.jsp)

■結果画面(result2.jsp)


strutsによる入力チェック方法(DynaValidatorFormの使用)

DynaActionFormを使用するところで、Struts Validatorを使用したい場合は、DynaValidatorFormクラスをsturts-config.xmlで指定します。
上のやつの補足でよく使いそうな入力チェックの、入力文字列の制限の例もはいっています(上のだと、数値の範囲のチェックになってる)。

基本的にform-beanの定義のところにて、使用するフォームのクラスがDynaActionFormだったものを、DynaValidatorFormに指定するだけです。

今回作成したのは以下のファイルです。
入力制限として、10文字以上、20文字以下、入力可能な文字は[0-9a-zA-Z]で、未入力は不可とする・・・です。

InputAction.java
特に何も行いません。result.jspへ画面遷移をさせているだけです。
validation.xml
入力チェック方法を設定しています。今回使用しているのは、required、mask、minlength、maxlengthです。
index.jsp
トップ画面です。入力エラーの際、この画面にエラーメッセージが表示されます。
result.jsp
結果画面です。入力された文字列をそのまま表示しています。
struts-config.xml
validateを行うようにこのファイルで設定を行う必要があります。

■トップ画面(index.jsp)

■入力エラーがあった場合のトップ画面(index.jsp)

■(正しい入力をした場合の)結果画面(result.jsp)


tileタグの基本的な使い方

 tileタグは、普通にjspの中に以下のようにすることで、やりたいことはできるのですが・・・。

jsp内にてタグライブラリを読み込み・・・
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>

指定のページをincludeしたい場所に、insertタグを記述・・・・
<tiles:insert page="/footer.jsp"/>

以下のやりかたで、読み込むページ(「/footer.jsp」と指定している箇所)をxmlファイルに記述し、外部化することが可能です。サンプルでは設定の継承を行ったものを示します(ただ、extendsと書いて修正が必要なところだけ再定義しただけ)。

footer.jsp
「結果画面」の下部に表示されている内容はこのファイルの内容です。
index.jsp
トップ画面です。この画面にてsubmitボタンを押下し、tileを使用した画面へ繊維します。
index2.jsp
「結果画面」のベースとなるjspです。このjspにて、どのファイルをどこへ読み込むが記述しています。
main.jsp
「結果画面」にて、表示のメイン部分を占める部分は、このファイルの内容です。
struts-config.xml
tileプラグインのロードを行っています(L24〜L28)。また、画面の遷移先を、jspファイルのパスではなく、tiles-defs.xmlで定義した名前にしています。
tiles-defs.xml
mainLayoutというタイルを定義し、それを継承し、mainLayoutExというタイルを定義しています。index2.jspではmalnLayoutExが使用されています。

■トップ画面(index.jsp)

■mainLayoutEx(tileタグを使用し構成された画面)


基本的な各種タグの使い方のサンプル

 私が思いついた、各種タグの基本的な使い方のサンプルです。以下のものを扱っています。

内容 サンプルソースの対応する箇所
(1)メッセージリソースの文字列を画面へ表示 index.jsp L24〜L39
(2)自分のページのところへリンクを張る result.jsp L105
(3)フォームBean外にセットしたデータを使用する方法 InputAction.java L21〜L26, result.jsp L18〜L26
(4)値が未入力かどうかチェック result.jsp L29〜L47
(5)Iteratorの使い方 result.jsp L50〜L63
(6)エラーメッセージの表示方法 index.jsp L16〜L22
(7)bean:parameterの使い方 result.jsp L66〜L74
(8)bean:defineの使い方 result.jsp L76〜L86
(9)nested:rootの使い方 result.jsp L88〜L99

今回作成したのは以下のファイルです。

InputForm.java
InputActionで使用されるフォームBeanです。
DataBacket.java
サンプルで使用される、独自のデータ保持用のクラスです。
InputAction.java
トップ画面(index.jsp)から、結果画面(result.jsp)へ遷移する際使用されるアクションBeanです。
MessageResources.properties
今回使用するメッセージリソースファイルです。
struts-config.xml
validateがtrueになっている点以外は、特に変わった点はありません。
index.jsp
トップ画面です。
result.jsp
結果画面です。基本的にこの画面で、各種タグの使い方が説明されています。

■トップ画面(index.jsp)

■結果画面(result.jsp)


strutsのモジュール分割機能の利用方法(サブアプリケーション)

 そもそも、どういう意味かといいますと、いつも、http://アドレス/コンテキストルート/index.jsp なんてアクセスしていますが、これに・・・ http://アドレス/コンテキストルート/モジュール名/index.jsp という構成にし、この「モジュール名」ごとに、1アプリ的な扱いをし、本当は1つのwarなんだけど、モジュール名でアドレスを変えることで複数のアプリが共存しているようにみえるよーって話らしい。
 まぁ、とりあえず、分けれるらしい。それぞれのモジュール毎に、struts-config.xmlファイルを作成することになります。

今回、サンプルとして、このモジュール分割機能を使用せず、いつもどおりのサーブレット呼び出し方法と、モジュール分割機能を使って分けた「module1」というモジュールのページを呼び出す・・・という処理をサンプルとして記述しました。

今回作成したファイルは以下のものです。

module1/index.jsp
「module1」にモジュール分割したもののトップ画面です。
module1/result2.jsp
「module1」にモジュール分割したものの結果画面です。
index.jsp
トップ画面です。
InputAction.java
非常に単純なアクションBeanです。今回は、いろんな場所で使用しています。今回作成した各種動作へそれぞれActionBeanを記述するのが面倒なため、とりあえずこれを使用しています。
InputForm.java
InputActionにて使用するフォームBeanです。InputAction同様、とりあえず、このフォームBeanを共通で使用しています。
result.jsp
結果画面です。index.jspからModule1のほうではない「送信!」ボタンを押下すると、この画面へ遷移します。
struts-config.xml
デフォルトのstruts-configです。
struts-config-module1.xml
モジュール分割したモジュール用のstruts-configです。
web.xml
サーブレットが使用するweb.xmlです。このファイルの中で上記の、struts-config.xmlやstruts-config-module.xmlを読み込みしています。また、ここでモジュール分割について設定を施します。
param-nameにて、「 config/module1 」と指定している箇所がありますが、このconfig/の後ろの文字列(module1)がモジュール名となります。

サンプルを記述していて、注意しなければなぁと思ったのは以下の点です。
(1) actionタグを記述しているところで、別モジュールへ画面を遷移させる際は、「 contextRelative="true" 」を記述せねばならないらしい(今回のサンプルでは、struts-config.xmlのL31〜L41あたり)。
(2) モジュール分割する・・・というのはstruts側の制御なので、サーブレットを介してページ遷移を行わなければ(今回の例で言うと「index.jsp画面からボタンを押してmodule1のトップ画面に遷移する・・・など」)正常に動作しない。そのまま、サーブレットやjspをアクセスしにいっても、だめ。

画面遷移は今回はボタンが多いので、代表例として、トップ画面から、一番したの「module1へ」ボタンを押下したパターンを乗せます。

■トップ画面(index.jsp)

↓ (一番下の「module1」ボタンを押下)

■module1のトップ画面(module1/index.jsp)

↓(送信!ボタンを押下)

■module1の結果画面(module1/result2.jsp)

↓(module1へボタンを押下)

↓(TOPへリンクを押下)


(最初の画面に戻ります)


ActionMappingの拡張方法

ActionMappingクラスを独自に拡張し、使用するサンプルです。
やりかたとしては、ActionMappingクラスを継承し、拡張します。そして、そのクラスを使用するように、struts-config.xml内にて指定します(action-mappingsタグの属性としてtype="<ActionMappingクラスを継承したクラス>"で、指定します)。

今回作成したのは、以下のファイルです。

ActionMappingEx.java
ActionMappingクラスを拡張して作成したクラスです。
index.jsp
トップ画面です。
InputAction.java
index.jspからresult.jspへ遷移する際使用するアクションBeanです。
executeメソッドの引数である、ActionMappingのデータは、これは、struts-configにて指定したアクションマッピングクラスです。サンプルでは、ActionMappingExクラスにキャストし、フィールドの値を取得しています。
InputForm.java
InputActionにて使用するフォームBeanです。
result.jsp
結果画面です。
struts-config.xml
このaction-mappingタグにて、使用するActionMappingクラスを指定することができます。
また、actionタグの中に、set-propertyタグにて、ActionMappingクラスに対し、フィールドの値を設定しています(この値のセット対象はActionMappingExクラスのため、独自のフィールド名をpropertyに指定し、セットしています)。

■トップ画面(index.jsp)

■結果画面(result.jsp)

この結果画面に表示されている文字列は、拡張したActionMappingExクラスから取得したものです。この文字列はどこで指定しているかというと、actionタグ内の、set-propertyタグにて行っています。

※備考
 今回、action-mappingタグにtypeという属性にて使用するアクションマッピングクラスを指定すると、すべてのactionに対して、適応されることになります。
指定のactionタグのところだけ、別のアクションマッピングを使用したい場合、それぞれのactionタグごとに個別に指定する方法があるらしい。

以下のような感じで指定します。

 <action-mappings>
        <action
                path="/Input"
                type="InputAction"
                name="Input"
                scope="request"
                className="ActionMappingEx">
                
                        <forward name="success" path="/result.jsp"/>
                        <set-property property="originalMessage" value="nyannnyannnyannnyann"/>
                        </action>
 </action-mappings>

acitonタグのclassNameにて使用するアクションマッピングクラスを指定しています。


struts-config.xmlをファイル分割する方法

struts-config.xmlは、画面制御のすべてを保持するデータなので、すぐに肥大化してしまいます。これを、〜の部分は〜.xmlに記述し、〜の部分は〜.xmlに記述する・・・というような運用が可能です。
ただし、フォーム名や、アクション名が重複していると予期せぬ動きをしますので、名前の管理だけは開発者の責任で管理しなければなりません(重複していても、エラーにならず普通に動いてしまいます)。

web.xmlのstruts-config.xmlをロードしている箇所に、以下のようにカンマでファイル名を区切るだけです。

  <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, /WEB-INF/struts-config2.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

それぞれ、struts-config.xmlとstruts-config2.xmlは以下のように普通に記述します。

struts-config.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

<struts-config>
    <form-beans>
        <form-bean 
                name="Input"
                type="InputForm"/>
    </form-beans>

    <action-mappings>
        <action
                path="/Input"
                type="InputAction"
                name="Input"
                scope="request">
                
                <forward name="success" path="/result.jsp"/>
        </action>
    </action-mappings>
</struts-config>


struts-config2.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

<struts-config>
    <action-mappings>
        <action
                path="/Input2"
                type="InputAction"
                name="Input"
                scope="request">
                
                <forward name="success" path="/result.jsp"/>
        </action>
    </action-mappings>
</struts-config>

このサンプルでは、Inputのフォームがすでに、struts-config.xmlに記述してあるため、struts-config2.xmlでは記述していませんが、実行可能です。