No Struts

Struts1.3によるWebアプリケーションの作り方 (構築編)

2011年1月17日Apache Struts

本連載の内容は記事執筆当時のまま再公開しており、現在では古い、あるいは適切ではない内容を含んでいます。

ソリューション開発部の黒住です。

本稿ではStrutsバージョン1.3によるWebアプリケーションの作り方を解説します。Strutsは2000年の登場以来、急速に広まりいまやJ2EE開発におけるデファクトのWebアプリケーションフレームワークとなりました。しかし、登場以来5年以上が経過し、アーキテクチャや思想の古さが目立つようになってきました。そこで、Struts開発チームはStrutsの内部構造を大幅にリファクタリングし、新しいStrutsをリリースしようとしています。本稿ではこの新しいStrutsを取り上げ、「構築編」としてWebアプリケーションの作り方を解説します。前編の「概要編」ではStrutsの簡単な紹介を行っていますのでそちらも参考にしてください。対象としてはStrutsを初めて学ぶ方を想定しています。

Webアプリケーション構築の準備

Strutsの入手

では、早速実際のアプリケーションを作成しながら、Strutsの利用方法を紹介しましょう。今回は、簡単なログオンアプリケーションを作成し、動作までを順を追って解説していきます。まずはなにはともあれ、Strutsを入手する必要があります。Struts1.3はコントローラー、ビュー、拡張、レイアウトなどに細分化されたチーム開発の形態をとっていますが、入手の簡単化のためにそれらをまとめ、Action Libraryという1つのパッケージとして配布しています。StrutsのダウンロードサイトはStruts Action FrameworkのDownloadリンクから辿れるので、そこから入手してください。ただし、執筆時点では、Struts1.3は正式リリースが行われていないため、ダウンロードページのDevelopment Releasesから辿れる開発者用のリリースを入手してください。執筆時時点では Struts Action Framework 1.3.0 が配布されています。この配布パッケージ内は下図のような構造となっており、Struts1.3に必要なすべての jar ファイルが含まれています。

説明図:action-library 1.3.00 パッケージ構造
図:action-library 1.3.00 パッケージ構造

サンプルWebアプリケーションの構造

今回、サンプルアプリケーションを作成するにあたり、下記のようなWebアプリケーションの標準的なディレクトリ構造を想定します。ソースコードの配置場所は便宜上WEB-INFディレクトリ内に配置することとしました。WEB-INF/lib ディレクトリには先ほど入手したStruts1.3に必要なjarファイルすべてを配置します。このようにしておくことで、J2EEの仕様として実行時に自動的にjarファイルが参照されるようになります。

説明図:サンプルディレクトリ構造
図:サンプルディレクトリ構造

ログオンアプリケーションの仕様

今回作成するログオンアプリケーションは、以下のようなページ遷移をもつ非常にシンプルなアプリケーションです。ログオンのためのユーザーIDとパスワードを入力するためのトップページと、ログオン成功時のページの2ページから構成されています。

説明図:サンプルアプリケーションページ遷移
図:サンプルアプリケーションページ遷移

このアプリケーションにアクションやアクションフォームBeanのイメージを追加したものが下図となります。

説明図:サンプルアプリケーション内部構造
図:サンプルアプリケーション内部構造

ここで、前述の「Strutsの動作」で説明した動作順序を思い出してください。Webブラウザからのリクエストを受け取ったコントローラー (ActionServletとリクエストプロセッサ) は、ActionConfigの情報を元に適切なアクションフォームBeanに入力フォームの情報 (ユーザーIDとパスワード) をセットし、アクション (今回はログオン判定アクション) を呼び出します。呼び出されたアクションでは、ログオン判定を行い、成功であればログオン成功のページを表示し、失敗の場合は元のページを表示するようにします。

開発者が準備すべきものの概要

StrutsでWebアプリケーションを作るには、開発者は以下のものを作成する必要があります。

  1. JSPファイル
    Webブラウザに返却するプレゼンテーションを生成するためのJSPファイルです。Strutsが提供するカスタムタグライブラリや別のカスタムタグライブラリを利用して記述します。
  2. メッセージリソース
    アプリケーションで表示するメッセージをリソースとしてまとめたファイルです。
  3. アクションフォームBean
    HTMLフォームの内容を保持するBeanです。Strutsが提供するクラスを継承して作成します。
  4. アクションクラス
    Webブラウザからのリクエストに対応した処理を行うクラスです。Strutsが提供するクラスを継承して作成します。
  5. struts-config.xml
    Webアプリケーションの振る舞い (遷移、リクエストに対応するアクションクラス、HTMLフォームに対応するアクションフォームBeanなどの情報) を定義したXMLフォーマットのファイルです。

以降ではこれらの作成方法を順に紹介していきます。

Webアプリケーションの作り方 (1) JSPファイル

ビューの構築方法

Struts1.3ではさまざまな方法でビューを生成できるようになっています。Strutsが提供するカスタムタグを用いてJSPにてビューを生成する方法が基本となりますが、その他にも JSTL を用いる方法や Velocity を用いる方法などがあります。今回は一番基本的なStrutsカスタムタグを用いてJSPで生成する方法を用いることとします。そのJSPを作成する場合、内部にスクリプトレット (Javaプログラム) は極力記述しないほうがよいです。不用意なスクリプトレットの使用はJSPのメンテナンス性と可読性、ビューの独立性を低下させてしまうからです。とはいえ、アプリケーションの表示内容によっては、標準で用意されているカスタムタグだけでは構築できない場合もあるでしょう。このような場合、アプリケーション特有のカスタムタグを用意してスクリプトレットを極力JSP内に記述しないようにするという方法もあるので、ケースバイケースで検討してください。

StrutsアプリケーションにおけるJSPは、前述のようにカスタムタグを用いて記述してゆくことになります。Strutsが提供しているカスタムタグライブラリを利用することで、たいていのビューの操作は行うことができます。むろん機能不足の際には、これ以外のカスタムタグライブラリを同時に利用することも可能です。Strutsが用意しているカスタムタグライブラリは、ロジック用、表示用、Bean操作用などがあり、さらにEL (式言語) 対応のもの (struts-el-1.3.0.jar) なども拡張ライブラリとして用意されています。Strutsを使ったWebアプリケーションでは、これらカスタムタグライブラリと、表示情報を保持したBeanを利用してビューを生成するのです。表にStrutsの標準カスタムタグライブラリ (struts-taglib-1.3.0.jar) が内包しているタグを示します。

Beanタグライブラリ

cookieリクエストクッキーを取り出し、ページスコープに属性として定義する
defineBeanプロパティの値を取り出し、ページスコープに属性として定義する
headerリクエストヘッダの値を取り出し、ページスコープに属性として定義する
include<jsp:include> のような機能を果たす
messageリクエスト言語にあわせたメッセージ文字列をメッセージリソースから生成する
page指定したアイテムをbeanとしてページコンテキストから取り出す
parameter指定したリクエストパラメーターの値に基づき、変数を定義する
resourceWeb アプリケーションのリソースをロードし、beanとして利用可能とする
sizeCollection または Map の要素数を含む bean を定義する
struts指定したStrutsコンフィグレーションオブジェクトを bean として取り出す
write指定した bean プロパティの値を現在の JspWriterに出力する

HTMLタグライブラリ

baseHTMLの <base> 要素を表現する
buttonボタンフィールドを表現する
cancelキャンセルボタンを表現する
checkboxチェックボックスフィールドを表現する
errors登録されているエラーメッセージを出力する
fileファイル選択フィールドを表現する
form入力 フォームを表現する
frameHTMLのフレームを表現する
hiddenHIDDENフィールドを表現する
htmlHTMLの <html> 要素を表現する
image“image" 形式の入力タグを画像ボタンを表現する
imgHTMLのimgタグを表現する
javascript入力値検証用のJavaScriptを出力する
linkHTML の アンカ または ハイパーリンクを表現する
messages登録されているメッセージを出力する
multiboxチェックボックスフィールドを表現する
optionセレクトオプションを表現する
optionsセレクトオプションのコレクションを表現する
optionsCollectionセレクトオプションのコレクションを表現する
passwordパスワードフィールドを表現する
radioラジオボタンを表現する
resetリセットボタンを表現する
rewriteURIを表現する
selectセレクト要素を表現する
submitサブミットボタンを表現する
textテキストフィールドを表現する
textarea<textarea> 要素を表現する
html<xhtml> 要素を表現する

Logicタグライブラリ

empty指定の変数がNULLまたは空の場合、このタグ内の内容を有効とする
equal要求された変数が指定した値と等しい場合、このタグ内の内容を有効とする
forwardActionForward エントリによって指定したページへのフォワード制御を行う
greaterEqual要求された変数が指定した値より大きいか等しい場合、このタグ内の内容を有効とする
greaterThan要求された変数が指定した値より大きい場合、このタグ内の内容を有効とする
iterate指定したコレクションで、このタグ内の内容を繰り返し実行する
lessEqual要求された変数が指定した値より小さいか等しい場合、このタグ内の内容を有効とする
lessThan要求された変数が指定した値より小さい場合、このタグ内の内容を有効とする
match指定した値が要求した変数の部分文字列に一致する場合、このタグ内の内容を有効とする
messagesNotPresentメッセージが登録されていない場合、このタグ内の内容を有効とする
messagesPresentメッセージが登録されている場合、このタグ内の内容を有効とする
notEmpty指定の変数がNULLまたは空でない場合、このタグ内の内容を有効とする
notEqual要求された変数が指定した値と等しくない場合、このタグ内の内容を有効とする
notMatch指定した値が要求した変数の部分文字列に一致しない場合、このタグ内の内容を有効とする
notPresent指定した値がこのリクエストの中にない場合、このタグ内の内容を有効とする
present指定した値がこのリクエストの中にある場合、このタグ内の内容を有効とする
redirectHTTP Redirectを表現する

Nestedタグライブラリ

nestネストレベルを設定する
writeNestingネストレベルを出力または変数として定義する
rootルートとなるBean名を指定する
define同名のタグと同等の機能を果たす
message同名のタグと同等の機能を果たす
size同名のタグと同等の機能を果たす
write同名のタグと同等の機能を果たす
checkbox同名のタグと同等の機能を果たす
errors同名のタグと同等の機能を果たす
file同名のタグと同等の機能を果たす
form同名のタグと同等の機能を果たす
hidden同名のタグと同等の機能を果たす
image同名のタグと同等の機能を果たす
img同名のタグと同等の機能を果たす
link同名のタグと同等の機能を果たす
messages同名のタグと同等の機能を果たす
multibox同名のタグと同等の機能を果たす
options同名のタグと同等の機能を果たす
optionsCollection同名のタグと同等の機能を果たす
password同名のタグと同等の機能を果たす
radio同名のタグと同等の機能を果たす
select同名のタグと同等の機能を果たす
submit同名のタグと同等の機能を果たす
text同名のタグと同等の機能を果たす
textarea同名のタグと同等の機能を果たす
empty同名のタグと同等の機能を果たす
equal同名のタグと同等の機能を果たす
greaterEqual同名のタグと同等の機能を果たす
greaterThan同名のタグと同等の機能を果たす
iterate同名のタグと同等の機能を果たす
lessEqual同名のタグと同等の機能を果たす
lessThan同名のタグと同等の機能を果たす
match同名のタグと同等の機能を果たす
messagesNotPresent同名のタグと同等の機能を果たす
messagesPresent同名のタグと同等の機能を果たす
notEmpty同名のタグと同等の機能を果たす
notEqual同名のタグと同等の機能を果たす
notMatch同名のタグと同等の機能を果たす
notPresent同名のタグと同等の機能を果たす
present同名のタグと同等の機能を果たす

JSPファイルの作成

ログオンのための入力ページと、ログオン後に表示されるページのJSPはそれぞれ、「リスト:index.jsp」と、「リスト:Welcome.jsp」のように記述します。JSP内部には、スクリプトレットが記述されておらず、Strutsカスタムタグライブラリが利用されているのがおわかりいただけると思います。

リスト:index.jsp
リスト:index.jsp
リスト:Welcome.jsp
リスト:Welcome.jsp

さらには、JSP内には、表示用の文字列すらないのが、お気づきになったでしょうか。これは、ビューのためのすべての文字情報を<bean:message>タグを用いて、メッセージリソースから得ているからです。メッセージリソースの作成方法は後述しますが、<bean:message>タグはメッセージリソースのキーを指定すればそのメッセージを表示する機能を提供しています。HTMLフォームの生成には、前述の表にもありますように <html:form>タグを用います (「リスト:index.jsp」の 1 )。このとき、フォームのサブミット先は action 属性にて指定することになります。ここで指定したURLでHTTPリクエストが送信されることになります。

Webアプリケーションの作り方 (2) メッセージリソース

メッセージリソース・ファイルの作成

メッセージリソースはStrutsが提供している表示文字列用のリソースで、プロパティファイル形式 (キー=値) で定義し、Strutsの設定ファイル (struts-config.xml) に登録することでそのメッセージをアプリケーション内から利用可能となります。メッセージはアクションクラスやアクションフォームBeanからも利用することができます。メッセージリソースファイル名は 拡張子が.propertiesの任意の名前が利用可能となっています。今回は「リスト:MessageResources.properties」のようなファイルを用意しました。

リスト:MessageResources.properties
リスト:MessageResources.properties

前述のJSPで利用している<bean:message>タグは、メッセージリソースから、key属性で指定されたメッセージキーのメッセージを取り出します。メッセージリソースは、javaのリソースバンドルの機能を利用しているため、その仕様に則ったフォーマット「キー=メッセージ」で、ファイルを用意します。ファイルはクラスパス上に配置することになります。今回は WEB-INF/classes/conf に配置することとします。ファイルの登録はStruts設定ファイルに定義を行いますがその記述方法は後述します。

Strutsの国際化機能

アプリケーションによっては、英語・日本語・中国語といった複数の言語に対応させ、リクエストするユーザーの環境を判断し、自動的にレスポンス内容を変化させるような場合もあるでしょう。Strutsにはこのような多言語対応機能を実装するためのしくみが用意されています。Strutsアプリケーションを多言語対応させるのであれば、対応する言語分のメッセージリソースファイルを用意するだけでよいのです。メッセージリソースファイル名にISO言語コードを追加したリソースファイルを、言語ごとに複数用意します。リソースファイルの命名規則は、「メッセージリソースファイル名+[_+ISO言語コード+].properties」となり、例えば日本語の場合ISO言語コードはja (表:ISO言語コード抜粋) であるため先のメッセージリソースファイルの場合、MessageResources_ja.propertiesとなります。ここで1つ注意するのは、このメッセージリソースのしくみは、javaのリソースバンドルの機能を利用しているため、メッセージリソースファイルの記述はUTF-8のアスキー表現でエンコーディングされている必要があります。よって、マルチバイト言語用のファイルは、通常はエディタなどで作成した後にJ2SDKに付属のnative2asciiコマンドにて変換することになります。

ISO言語コード言語名
jaJapanese
enEnglish
koKorean
frFrench
zhChinese
リスト:日本語用メッセージリソース
リスト:日本語用メッセージリソース

前述のメッセージリソースファイルの日本語用を「リスト:日本語用メッセージリソース」のように用意した場合、native2ascii コマンドを下記のように実行した結果の MessageResources_ja.properties ファイルを前述と同様にアプリケーションに配置すればよいわけです。

コマンド:native2ascii

Webアプリケーションの作り方 (3) アクションフォームBean

アクションフォームBeanの用意

アクションフォームBeanはHTMLフォームから送信される情報を保持するためのBeanであり、基本的にHTMLフォームごとに用意します。このアクションフォームBeanを用意するだけで、Strutsがリクエストと共に送信されてくるHTMLフォーム内の情報をBeanの属性値として自動的にセットしてくれます。よって、アクション内で、getParameterなどによってリクエストから値をわざわざ取り出す必要がないのです。実際の作成方法は、Strutsが提供するActionFormクラスを継承したクラスを下記のように作成します。クラスの属性は、対応したHTMLフォーム内の情報ごとに定義し、それぞれへのアクセッサメソッド (セッタとゲッタ) を用意します。ログオンページのHTMLフォームに対応したアクションフォームBeanを「リスト:LogonForm.java」に示します。

リスト:Logonform.java
リスト:Logonform.java

userId、passwordといったアクションフォームBeanの属性名は、「リスト:index.jsp」で利用している <html:text>および <html:password>タグのproperty属性に指定した名前 (「リスト:index.jsp」の 2 ) と同じである必要があります。Strutsは両者の名前のマッチングを行い、HTTPリクエスト内のパラメーター値をアクションフォームBeanの属性としてセットします。このとき利用されるのが、アクションフォームBeanに用意する属性のアクセッサメソッドです。この属性のアクセッサメソッド名はJavaBeansの命名規則によって、set+属性名およびget+属性名となり属性の最初の文字を大文字にします。よってuserIdとpassword属性に対するアクセッサメソッドはそれぞれ、setUserIdとgetUserId、setPasswordとgetPasswordとなります。アクションフォームBeanは、HTMLフォームに入力された値の受け皿としての役目の他に、オプションですが、値の正当性チェックの機能を持たせることができます。以降ではこの機能について紹介します。

アクションフォームBeanの入力値検証機能

前述したように、アクションフォームBeanには、HTMLフォームに入力された値を検証する機能があります。この機能は、ブラウザからのHTTPリクエストを受信し、アクションを呼び出すまでの間に実行されるため、入力値が正しくなければアクションを実行しないようにできます。この機能を利用すれば、必須入力や、文字チェックなどの簡単な入力検証機能をアクションフォームに持たせることが可能となり、アクションやビジネスロジックでは、入力値の検証ずみデータが渡ってくることを前提にロジックを作成することが可能となります。この検証機能の実装は、アクションフォームBeanにvalidateメソッドを用意し、その内部に検証用のコードを記述することで行います (「リスト:LogonForm.java」の 1 )。検証の結果はActionErrorsオブジェクトに保存して呼び出し元へ返却します。ActionErrorsオブジェクトはエラーメッセージを複数保持するオブジェクトとなっており、NULLまたは、中身が空のActionErrorsオブジェクト返却した場合、すなわちエラーメッセージなしの場合には、検証成功とみなされます。空でないActionErrorsオブジェクトを返却した場合、検証失敗とみなされアクションを呼ばすに指定のページ (通常は入力ページ) へ遷移します。エラーメッセージを登録する場合、まずは ActionErrorsオブジェクトを生成します (「リスト:LogonForm.java」の 2 )。このオブジェクトは前述したようにエラーメッセージを複数保持するものです。このオブジェクトへのエラーメッセージの登録は、「リスト:LogonForm.java」の 3 のように add メソッドを用いて行います。addメソッドの第二引数には、1つのメッセージを表す ActionMessageオブジェクトを指定し、第一引数には ActionMessages.GLOBAL_MESSAGE を指定します。ActionMessageオブジェクトの生成時には、そのオブジェクトが表すメッセージのメッセージリソースのキーを指定することになります。このメッセージリソースは、前述のJSPの表示用の文字列で用いたものと同じです。よって、今回生成する3つのメッセージもメッセージリソースに下記のように追加することになります。その後、「リスト:LogonForm.java」の 4 のようにメッセージを登録したActionMessagesオブジェクトを返却すれば入力検証が失敗ということになります。

リスト:MessageResources.properties
リスト:MessageResources.properties

※説明上、ログオン時のエラーの詳細を表示していますが、セキュリティの観点ではログオン失敗の原因が特定できないメッセージをおすすめします。

アクションフォームBeanの検証メソッドにて検証失敗となった場合、Struts設定ファイルに定義されているページ (通常は入力ページ) へ遷移します。登録されたメッセージは、<html:errors>タグにて自動的に表示されます。サンプルでは、「リスト:index.jsp」の 3 のように定義しており、この部分にメッセージが表示されます。

Webアプリケーションの作り方 (4) アクションクラス

アクションクラスの作成

入力値検証 (オプション) に成功した場合、Struts設定ファイルに定義されたリクエストURLに対応するアクションクラスが呼び出されます。呼び出されたアクションクラス内部では、主にビジネスロジックを呼び出すための処理と、その結果を表示するための準備を行うことになります。よって、アクションクラス内で行う主な処理は以下のようになります。

  • アクションフォームBeanから入力情報の取り出し
    HTMLフォームの情報がセットされているアクションフォームBeanは引数としてexecuteメソッドに渡されるので、必要な情報はそのBeanからアクセッサメソッドを用いて取り出します。
  • 適切なビジネスロジックの呼び出し
    取り出した入力情報をビジネスロジックに渡せるように加工し、ビジネスロジックのクラスを呼び出します。
  • ステートBeanの生成
    ビジネスロジックの結果と、ビューの生成に必要な情報をステートBeanとしてHttpSessionやHttpServletRequestなどのコンテキストに保存します。このBeanは、ビューが参照し実行結果を表示するのに利用します。
  • ActionForwardオブジェクトを返却
    ビジネスロジック実行の結果を表示するためのページを表すActionForwardオブジェクトを、呼び出し元へ返却します。

アクションクラスは、Strutsが提供するActionクラスを継承して下記のように実装します。ログオン処理を行うアクションクラスを「リスト:LogonAction.java」に示します。

リスト:LogonAction.java
リスト:LogonAction.java

例では、はじめにアクションフォームBeanより入力フォームのデータを取り出す処理を行っています (「リスト:LogonAction.java」の 1 )。その後、ユーザー認証処理を行い成功した場合にはユーザーの情報を取り出しています (「リスト:LogonAction.java」の 2 3 )。取り出したユーザーの情報はセッションコンテキスト (HttpSession) に保存しています (「リスト:LogonAction.java」の 4 )。アクションで行う処理が成功した場合、次に表示するページへ遷移する必要があります。例では、ログオン成功のページとなります。このページを次に表示するページとしてStrutsに指定し、アクションの処理は終了することになります。具体的には、次のページを示す ActionForwardオブジェクトを生成し、それをアクションの戻り値として返却することになります。ActionForwardオブジェクトは「リスト:LogonAction.java」の 5 のように、ActionMappingオブジェクトのfindForwadメソッドから入手可能です。このメソッドは、このアクションを定義しているアクションマッピングの情報内から遷移先の情報 (ActionForwardオブジェクト) を取り出す処理を行います。アクションマッピングはStruts設定ファイルにて定義するものです。Strutsでは遷移先を実際のURLではなく、successやfailuerといった論理名で管理するため、例でも success という論理名の遷移先を示す ActionForwardオブジェクトを入手するように記述されています。ここで入手した ActionForwardオブジェクトを返却すれば、指定のページのJSPが実行され結果をHTTPレスポンスとして返却するようになります。

「リスト:LogonAction.java」の 2 の認証に失敗した場合、例ではExceptionがThrowされるようになっています。そのため、catch節にてそれぞれに適したエラーメッセージをActionErrorsオブジェクトに登録しています (「リスト:LogonAction.java」の 6 )。このメッセージの処理はアクションフォームBeanでエラーメッセージを生成する場合と同じです。ただし、アクションでエラーメッセージを生成した場合には、そのメッセージ群をStrutsに伝える方法が異なります。アクションでは、戻り値として返却するのではなく、Actionクラスが提供している saveErrorsメソッドを用いて Struts にエラーメッセージを登録します (「リスト:LogonAction.java」の 7 )。そして、もう1点異なるのが、エラーメッセージを登録してもアクションクラスが処理に失敗したという認識にはならない点です。処理に失敗した場合、アプリケーションとしてそれを示すなんらかのページを表示させる必要がありますが、この遷移先をアプリケーションが明示的に指定する必要があるのです。指定方法は、前述した認証成功時と同様にActionForwardオブジェクトを用います。アクションマッピングに失敗時の遷移先を論理名 failure として指定して成功時と同様に findForwardメソッドを用いてActionForwardオブジェクトを入手してもよいのですが、例ではActionMappingオブジェクトのgetInputForwardメソッドを用いています。getInputForwardメソッドは、このアクションを呼び出したページ (入力ページ) を表す ActionForwardを返却します。ただし、アクションマッピングに定義されている場合に限ります。

ログオン成功ページのJSP生成

ログオン処理に成功した場合、ActionForwardオブジェクトに指定されたログオン成功のJSPページが実行されることになります。ログオン成功ページのJSPは、下記のようになります。

リスト:Welcome.jsp
リスト:Welcome.jsp

このJSPも、前述したJSPと同様に表示するメッセージは <bean:message>タグを用いています。さきほどのアクションで登録した、ユーザーの情報はページにユーザー名を表示する際に用いています。具体的には「リスト:Welcome.java」の 1 のように <bean:write>タグを用いて、コンテキストに保存されているBeanを取り出し、そのBeanが保持している属性を出力するように指定しています。この処理は <bean:write>タグの機能を利用しているだけです。

Webアプリケーションの作り方 (5) struts-config.xml

7.1 Strutsコンフィグレーションファイル (struts-config.xml) の設定

最後はStruts設定ファイルの記述方法です。このファイルはStrutsの動作を定義する非常に重要なファイルであり、さまざまな定義が行えますが、今回は下記のような必要最低限の定義を行うこととします。

  • アクションフォームBeanのクラス定義
  • リクエストURLと、それに対応するアクションクラスの定義
  • HTML入力フォームに対応するアクションフォームBeanの定義
  • アクション終了時の遷移先情報の定義
  • メッセージリソースファイル名の定義

すなわち、これまで作成してきたさまざまなファイルをアプリケーションとして組み立てるための定義を行います。例としてアプリケーション用のStruts設定ファイルは以下のようになります。

リスト:Struts-config.xml
リスト:Struts-config.xml

「リスト:Struts-config.xml」中の各設定記述をそれぞれ下記に説明します。

  1. LogonFormクラス型のlogonFormBeanという論理名のアクションフォームBeanを定義
  2. /logon.doというリクエストが来た場合に呼び出されるアクションに関する定義
  3. /logon.doへのリクエストを処理するアクションを実装したアクションクラスを定義
  4. HTTPリクエストパラメーター (HTMLフォームの入力情報) を保持するアクションフォームBeanの論理名を定義
  5. アクションフォームBeanのライフサイクル (有効期間) をリクエストスコープ (※) にすることを定義
  6. アクションフォームBeanの入力検証機能 (オプション) をON
  7. このアクションの入力ページを定義 (この値がActionMappingオブジェクトのinputForwardメソッドで返却される)
  8. 遷移先の論理名と実際のパスの定義 (この値がActionMappingオブジェクトのfindForwardメソッドで検索される)
  9. メッセージリソースファイルへのパスを定義 (例では confディレクトリに配置したため、conf. を先頭に付与している)

※1回のHTTPリクエストが処理される間

上記からもわかるようにStrutsコンフィグレーションファイルは、Strutsアプリケーションのページ遷移に関するすべての情報が集約しています。すべての遷移情報を集約させることによって、アプリケーションの遷移情報を集中管理できるようになり、アプリケーション全体が把握しやすくなるだけでなく、メンテナンス性の向上、遷移変更時の設定の集約がはかれるようになっています。また、遷移に関連する実装名 (JSPファイル名や遷移先名、クラス名) にはすべて論理名が付き、プログラム中からはこれまで説明してきたように、この論理名で指定することができます。実装名を隠蔽することで、実ファイル名を意識せずにプログラミングが行えるだけでなく、ファイル名変更やクラス名変更時には、Strutsコンフィグレーションファイルのみ変更すればよく、再コンパイルを必要としないというメリットもあります。「リスト:struts-config.xml」の 8 で指定している遷移先は例では、successの1つのみを定義していますが、実際のアプリケーションでは業務ロジックの結果によって複数のページから1つへ遷移する場合もあるでしょう。そのような場合、<forward>エレメントを複数個定義することで対応できます。具体的には下記のように記述することになります。

リスト : エレメントを複数個定義する場合
リスト : エレメントを複数個定義する場合

最終確認とコンパイル

Deployment Descriptorファイル (web.xml) の確認

ログオンアプリケーション用のWeb Deployment Descriptorファイルは「リスト:web.xml」のようになります。

リスト:web.xml
リスト:web.xml

このファイルで注目していただきたいのは、 Strutsのサーブレットクラスの定義 (「リスト:web.xml」の 1 ) と、そのクラスへマッピングするURLパターンの定義 (「リスト:web-xml」の 2 ) です。MVCモデル2を構成するコントローラーであるサーブレットは、Strutsが提供するActionServletを今回はそのまま利用します。このサーブレットクラスの定義が「リスト:web-xml」の 1 です。また、ログオンアプリケーションへのすべてのリクエストがコントローラーに集約されるようにマッピングを指定しているのが「リスト:web-xml」 2 の部分です。この指定により、リクエストURLの最後が.doのものはすべてActionServletに渡されることになり、MVCモデル2のコントローラーとして機能することができるのです。

ファイルの配置とコンパイル

あとは、各ファイルを配置し、javaファイルのコンパイルを行い、Webアプリケーションのwarファイルを生成するだけです。前述のそれぞれのリソースを、冒頭で説明したディレクトリ階層に図のように配置します。

説明図:ディレクトリ階層
図:ディレクトリ階層

javaファイルをコンパイルし、WEB-INF/classes にclassファイルを配置し、WEB-INF/src/confディレクトリ内のpropertiesファイルを WEB-INF/classes/conf にコピーすればアプリケーションの準備は完了です。あとは、Logonディレクトリをカレントディレクトリとして WAR ファイルを生成すればWebアプリケーションが完成します。完成した WARファイルをJ2EEアプリケーションサーバーにデプロイし、アプリケーションにアクセスすれば図のようなログオン画面が表示されるはずです。本文で紹介していないビジネスロジックのクラスなどは、文末に提示してあるので、参考にしてください。例では、ユーザーID guest、パスワード guest のみがログオンに成功するようにビジネスロジックのクラスがつくられています。

スクリーンショット:ログオン画面
図:ログオン画面

Struts1.3によるWebアプリケーションの作り方 (構築編) ~おわりに

今回は、Strutsの基本機能の概要について簡単に紹介しました。Struts1.3では、今回紹介した基本的な機能のほかに、より強力な機能を数多く追加しているので、興味のあるかたはStrutsのサイトなどを参照してください。

付録

リスト:AlreadyUsedUserException.java
リスト:AlreadyUsedUserException.java
リスト:InvalidatePasswordException.java
リスト:InvalidatePasswordException.java
リスト:UnknownUserException.java
リスト:UnknownUserException.java
リスト:LogonManager.java
リスト:LogonManager.java
リスト:UserInfo.java
リスト:UserInfo.java

次回の記事はこちら。

※本稿は月刊JavaWorld (株式会社IDGジャパン発行) 2003年9月号および2003年11月号に掲載した連載「Jakarta活用指南」記事の元原稿に加筆修正したものです。

  • 株式会社アークシステムの予約・来訪管理システム BRoomHubs
  • 低コスト・短納期で提供するまるごとおまかせZabbix