STRUTS0.5(STRUTS1.0ではかなり仕様が変更されています。)
◆STRUTS(ストラ−ツ)とは
サ−ブレット・コンテナ上に構築するフレ−ムワ−クであり、タグライブラリとクラスライブラリ及びXMLファイル
で構成されています。</p>
◆STRUTS0.5の基本
●コントロ−ラ
ストラ−ツではActionServletあるいはActionServletを継承したサ−ブレットをWEBアプリ単位での共通
コントロ−ラとして用います。共通コントロ−ラはサ−ブレット・コンテナが制御を行います。
共通コントロ−ラはサブコントロ−ラ、モデル、マッパ−、ビュ−の呼び出し等、WEBアプリの制御を行っ
ています。
共通コントロ−ラはビュ−上から"Actionクラスの代替名.do"がコ−ルされたときに起動され、"Action
クラスの代替名"に対応したActionクラスのインスタンス化、アクション定義ファイル(action.xml)に基づいた
ActionForm・ActionMappingのインスタンス化等の処理を行い、Actionクラスのperformメソッドをコ−ルし
た後、その返り値で表示するビュ−の分岐を行います。
●サブコントロ−ラ
ストラ−ツではサブコントロ−ラに各Webアプリ独自の処理を記述します。
サブコントロ−ラではHttpServletではなくストラ−ツ独自のActionBaseクラスを継承し、doGet()・doPost()
メソッドのかわりに performメソッドをオ−バ−ライド(上書き)します。
ActionBaseあるいはそのサブクラスを継承したクラスをActionクラスと呼びます。
●モデル
ストラ−ツではモデルにActionFormあるいはJavaBeansを使用します。ActionFormはActionFormインタ−
フェイスあるいはそのサブインタ−フェイスを実装し、そのクラスの中にsetterとgetterを用意します。
ActionFormとアクション定義ファイルとビュ−上でのストラ−ツ独自タグを用いたFORMの記述との連携に
より、perform メソッド上でActionFormクラスのインスタンスを新規に生成したときに、ActionServletが
ビュ−上のFormから取得したデ−タをActionFormオブジェクトに格納する事ができます。
●マッパ−
ペ−ジ間の移動の関係を格納するものをマッパ−と呼びます。ストラ−ツではマッパ−として、
ActionMappingクラスを用います。
ActionMappingクラスはActionMappingBaseクラスを継承します。ActionMappingクラスは必ずfinal指定し
ます。
このクラスの中にアクション定義ファイルの中に記述したforwardタグの“省略名”に対応したsetterとgetter
をforwardタグの数だけ用意する必要があります。
●ビュ−
JSPファイルとして記述します。JSP内部ではストラ−ツ独自のタグライブラリを使用します。
◆サブコントロ−ラについて
●performメソッドはActionServlet、ActionMapping、ActionForm、HttpServletRequest、
HttpServletResponseオブジェクトを引数としてもっています。
1.ActionMappingクラスはアクション記述ファイルに記述されているペ−ジ移動の関係を格納するクラスです。
2.ActionFormクラスはフォ−ムのデ−タを格納するクラスです。
3.ActionServlet、ActionMapping、HttpServletRequest、HttpServletResponseに関しては、performメソッド
の実行前にオブジェクトが存在します。ActionFormに関しては存在する場合と存在しない場合があります。
◆アクション定義ファイル(action.xml)の記述法
●XMLツリ−の頂点には必ずaction-mappingsタグがあります。
●action-mappingsタグ直下にはforwardタグとactionタグがあります。
●actionタグ直下にはpropertyタグとforwardタグがあります。
●forwardタグについて
forwardタグは下記の形式で記述します。
<forward name="省略名" path="ビュ−のWEBアプリル−トからの相対パス"/>
forwardタグを記述しておくと、ActionMappingオブジェクトのfindForwardメソッド呼び出し時に引数として
“省略名”を与えることにより、省略名に対応したペ−ジへの移動を行えます。
return ActionMappingオブジェクト.findForward("省略名")
action-mappings直下のforwardタグの“省略名”はアクション定義ファイルに記述した全てのAction
クラス内で有効です。
actionタグ直下にあるforwardタグの省略名はそのActionタグに対応するActionクラス内でのみ有
効です。
●Actionタグについて
Actionクラスの数だけ用意する必要があります。
Actionタグは下記の形式で記述します。
<action path="/Actionクラスの代替名"
actionClass="Actionクラスのパッケ−ジ内パス"
formAttribute="ActionFormの代替名"
formClass="ActionFormのパッケ−ジ内パス"
inputForm="ビュ−のWEBアプリル−トからの相対パス">
<forward name="省略名" path="ビュ−のWEBアプリル−トからの相対パス"/>
</action>
あるいは
<action path="/Actionクラスの代替名">
<property name="actionClass" value="Actionクラスのパッケ−ジ内パス"/>
<property name="formAttribute" value="ActionFormの代替名"/>
<property name="formClass" value="ActionFormのパッケ−ジ内パス"/>
<property name="inputForm" value="ビュ−のWEBアプリル−トからの相対パス"/>
<forward name="省略名" path="ビュ−のWEBアプリル−トからの相対パス"/>
</action>
inputFormプロパティ(省略可能)を記述しておくと、performの中でActionMappingオブジェクトの
getInputFormメソッドを呼び出すことでinputFormで指定したビュ−に移動できます。
return new ActionForward(ActionMappingオブジェクト.getInputForm()))
●アクション定義ファイルの全体像
<action-mappings>
<forward name="省略名" path="ビュ−のWEBアプリル−トからの相対パス"/>
forwardタグの羅列
<action path="/Actionクラスの代替名"
actionClass="Actionクラスのパッケ−ジ内パス"
formAttribute="ActionFormの代替名"
formClass="ActionFormのパッケ−ジ内パス"
inputForm="ビュ−のWEBアプリル−トからの相対パス">
<forward name="省略名" path="ビュ−のWEBアプリル−トからの相対パス"/>
forwardタグの羅列
</action>
actionタグの羅列
</action-mappings>
◆strutsでのエラ−メッセ−ジ表示手順
1.MessagesResourcesクラスのインスタンスの生成時に引数としてActionServletオブジェクトを与えた
ActionBaseクラスのgetResourcesメソッドの返り値を生成したオブジェクトに渡します。
MessageResources MessageResourcesオブジェクト = getResources(ActionServletオブジェクト)
この処理ではActionServletに格納されているリソ−スデ−タのMessageResources
オブジェクトへのコピ−が行われています。
2.ErrorMessagesクラスのインスタンス化を行います。
ErrorMessages ErrorMessagesオブジェクト = new ErrorMessages()
3.リソ−スデ−タの“省略名”を引数として、ErrorMessagesオブジェクトのaddErrorメソッドを呼び出します。
この処理では表示したいエラ−メッセ−ジに対応する“省略名”のErrorMessagesオブジェクトへの格納
が行われています。
ErrorMessagesオブジェクト.addError("リソ−スデ−タの省略名")
4.Performメソッドの終わりで、ErrorMessagesオブジェクトを引数としてActionBaseクラスのsaveErrors
メソッドを呼び出します。
saveErrors(ErrorMessagesオブジェクト)
この処理ではのErrorMessagesオブジェクト属性のペ−ジコンテキストへの格納が行われています。
5.リソ−スデ−タはActionServlet起動時にActionServletオブジェクト内に格納され、MessageResources
オブジェクトの属性はその時にペ−ジコンテキストに登録されます。
6.JSPファイルにストラ−ツのエラ−タグ<struts:errors/>を記述することにより、実行時にエラ−
メッセ−ジを画面に表示します。
この処理ではペ−ジコンテキストから取り出した“省略名”の配列とリソ−スデ−タを照合し、エラ−
メッセ−ジの生成及び表示を行っています。
※表示されるメッセ−ジの詳細はerrors.header対応メッセ−ジ+改行+各エラ−メッセ−ジ(改行付き)の
羅列+errors.footer対応メッセ−ジです。
(errors.headerとerrors.footerはstruts.jar中のActionResources.propertiesに記述されている省略名
です)
◆ApplicationResources.propertiesの記述法
「省略名=表示メッセ−ジ」の形式で記述します。省略名の重複はエラ−となります。
表示メッセ−ジにはHTMLなどのタグを埋め込むことができます。
◆STRUTSにおけるログ
任意の文字列を引数として、ActionServletオブジェクトのlogメソッドを呼び出すと、
サ−ブレットコンテナのサ−ブレット用ログファイルに任意の文字列を書き込みます。
ActionServletオブジェクト.log("任意の文字列")
◆ActionFormのインスタンス化について
ActionFormオブジェクトが存在しない場合には、newを使って、ActionFormオブジェクトの生成を行います。
ActionForm ActionFormオブジェクト = new ActionForm()
すでにActionFormオブジェクトが存在している場合は生成するオブジェクトにperformメソッドの引数として
与えられているActionFormオブジェクトを渡して、ActionFormオブジェクトを生成します(このときには必ず
ActionFormクラスでキャストします)。
ActionForm ActionFormオブジェクト = (ActionForm)引数ActionFormオブジェクト
上記のようにActionFormオブジェクトを生成すると、内部では下記の処理が行われます。
1.リクエストのパラメ−タとActionFormの属性が一致すれば、setterを起動します。
2.更新されたActionFormオブジェクトを必要なときにActionクラスのperformメソッドに渡します。
◆ActionFormの有効期限について
●<jsp:useBean>タグを使う場合にはJSPファイル(ビュ−)側でActionFormの有効期限を設定します。
●<jsp:useBean>タグをつかわない場合はペ−ジコンテキストへのActionFormオブジェクト属性の登録、
ペ−ジコンテキストからのActionFormオブジェクトの属性の削除をActionクラスで行ってやらなくては
なりません。
1.newを使って、SESSIONクラスをインスタンス化します。
2.ペ−ジコンテキストへの属性の登録は下記のメソッドで行います。
SESSIONオブジェクト.setAttribute(ActionMappingオブジェクト.getFormAttribute(),
ActionFormオブジェクト)
3.ペ−ジコンテキストからの属性の削除は下記のメソッドで行います。
SESSIONオブジェクト.removeAttribute(ActionMappingオブジェクト.getFormAttribute())
**********************************************************************************
◆STRUTS0.5のセットアップ
●Tomcat3.XとApacheの場合
1.jakarta-struts-x.tar.gz(windowsの場合の拡張子はzip)を解凍し、webappフォルダにある
struts-example.jarとstruts-documentation.jarをTomcatをインスト−ルしたフォルダ直下
のwebappsフォルダにコピ−します。
2.Apacheとの連携の場合には、Apacheをインスト−ルしたフォルダ直下のconfフォルダにある
httpd.confに次の一文を追加します。
AddHandler jserv-servlet .do
※本家の方法とは異なります。こうすることにより、mod_jk.soの場合とApacheModuleJserv.so
の場合(windowsの場合はdll)を区別する必要がありません。
Tomcat起動時にstrutsがwebアプリに必要な設定をmod-jk.conf-autoとtomcat-apache.conf
に書き込む為、これらのファイルに追加するのは得策ではありません。
3.Tomcatを再起動します。
4.ブラウザを立ち上げ、http://localhost/struts-example にアクセスして下さい。
MailReader Demonstrationが表示されれば、インスト−ルは終了です。
●Resin1.2の場合
1.jakarta-struts-x.tar.gz(windowsの場合の拡張子はzip)を解凍し、webappフォルダにある
struts-example.jarとstruts-documentation.jarをResinをインスト−ルしたフォルダ直下
のwebappsフォルダにコピ−します。
2.struts.tldにバグが存在するため、これを修正する必要があります。
1080行と1758行の
<required>name</required>
を次のように修正すれば、バグつぶしは終了です。
<required>false</required>
3.ブラウザを立ち上げ、http://localhost/struts-example にアクセスして下さい。
MailReader Demonstrationが表示されれば、インスト−ルは終了です。
(Resinは再起動なしにWEBアプリの展開を行えるため、再起動の必要はありません)
◆STRUTS0.5アプリの設定
●WEBアプリ定義ファイル(web.xml)への追加
STRUTSアプリの動作にはweb.xmlへの設定の追加が必要です。
<!-- Action Servlet Configuration -->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>application</param-name>
<param-value>リソ−スデ−タのパッケ−ジ内パス名</param-value>
</init-param>
<init-param>
<param-name>config</param-name>
<param-value>action.xmlのル−トからの相対パス</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<!-- Action Servlet Mapping -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- Struts Tag Library Descriptor -->
<taglib>
<taglib-uri>struts.tldのル−トからの相対パス</taglib-uri>
<taglib-location>struts.tldのル−トからの相対パス</taglib-location>
</taglib>
1.ActionServletConfigurationでの設定事項
・ActionServletの代替名の設定
・ActionServletで使用するリソ−スデ−タの簡略名の設定
・action.xmlの省略名設定
・その他
2.ActionServletMappingの設定事項
ActionServletが拡張子が.doとなっているURIとマッチするように設定しています。
この設定により、*.doというURIがコ−ルされたときにActionServletが最初に起動されるように
なります。
3.Struts Tag Library Descriptorでの設定事項
Strutsタグライブラリのエントリを定義しています。
この設定により、WEBアプリ内でのStrutsタグライブラリの使用が許可されます。
**********************************************************************************
STRUTS0.5タグ・リファレンス
◆メッセ−ジ
<struts:message key="ActionResources.properties内の省略名"/>
省略名に対応したメッセ−ジを画面上に表示します。
◆HTMLプロパティ
<struts:htmlProperty name="モデルの代替名" property="モデルのプロパティ名"/>
モデルの代替名にはアクション定義ファイル(action.xml)またはWEBアプリ定義ファイル(web.xml)で設定した
ものを使用します。
Formタグとは関係なく、ペ−ジコンテキスト内のデ−タを表示できます。
◆ル−プテ−ブル
<struts:enumerate id="モデルの代替名" name="モデルのプロパティであるモデル(プロパティモデル)名"
property="プロパティモデル内の配列要素名">
テ−ブル
</struts:enumerate>
"モデルの代替名"にはaction.xmlまたはweb.xmlで設定したものを使用します。
このタグを使うと、プロパティモデル内の配列要素のインデックス数分のテ−ブルをデ−タを埋め込んだ形で
表示できます。
◆リンク
<struts:link href="Actionクラスの代替名.do[?クエリ−ストリング]">リンクラベル</struts:link>
リンクを表示します。
◆プロパティIF文
<struts:ifPropertyEquals name="モデルの代替名" property="モデルのプロパティ名"
value="判断値"/ >
表示要素
</struts:ifPropertyEquals>
"モデルの代替名"にはaction.xmlまたはweb.xmlで設定したものを使用します。
モデルのプロパティ=判断値ならば、表示要素を画面に表示します。
◆プロパティ存在IF文
<struts:ifAttributeExixts name="属性クラスのパッケ−ジパス"
scope="有効範囲">
表示要素
</struts:ifAttributeExists>
◆属性ミス
<struts:ifAttributeMissing name="strutsの属性クラスのパッケ−ジパス"
scope="有効範囲">
表示要素
</struts:ifAttributeMissing>
◆フォ−ム
<struts:form action="Actionクラスの代替名.do" name="ActionFormの代替名"
focus="ActionFormのプロパティ名">
type="ActionFormのパッケ−ジ内パス>"
フォ−ム内要素
</struts:form>
●隠しフィ−ルド
<struts:hidden property="ActionFormのプロパティ名"/>
ActionFormとの間でデ−タのやり取りを行います。
●プロパティ
<struts:property property="ActionFormのプロパティ名"/>
ActionFormからデ−タを取得し、表示します。
●テキスト
<struts:text property="ActionFormのプロパティ名" size="サイズ"
maxlength="最大長"/>
ActionFormとの間でデ−タのやり取りを行います。
●テキストエリア
<struts:textarea property="ActionFormのプロパティ名" cols="列数"
rows="行数"/>
ActionFormとの間でデ−タのやり取りを行います。
●パスワ−ド入力フィ−ルド
<struts:password property="ActionFormのプロパティ名" size="サイズ"
maxlength="最大長"/>
ActionFormにデ−タを渡します。
●コンボボックス
<struts:select property="type">
<struts:options name="ペ−ジコンテキスト内の配列要素名"
labelName="ペ−ジコンテキスト内の配列要素名"/>
</struts:select>
ActionFormとの間でデ−タのやり取りを行います。
●パラメ−タIf文
<struts:ifParameterEquals name="ActionFormのプロパティ名" value="判断値">
表示要素
</struts:ifParameterEquals>
ActionFormのプロパティ名=判断値ならば、表示要素を表示します。
●パラメ−タnot If文
<struts:ifParameterNotEquals name="ActionFormのプロパティ名" value="判断値">
表示要素
</struts:ifParameterNotEquals>
ActionFormのプロパティ名 !=判断値ならば、表示要素を表示します。
**********************************************************************************
STRUTS0.5クラスライブラリ
<!-- 作成予定-->
◆ActionBaseクラス
●ActionForward perform(ActionServlet servlet,ActionMapping mapping,ActionForm
form,
HttpServletRequest req,HttpServletResponse res)
ストラーツ利用者はこのメソッドをオ−バーライドし、WEBアプリ独自処理を記述します。
● MessageResources getResources(ActionServlet servlet)
◆ErrorMesagesクラス
●void addError("リソースデータファイル上の省略名")