Eclipse用Easy Strutsを使用したStruts開発

Easy Strutsプラグインの使用法

Easy Strutsプラグインからの助けを借りてEclipse IDE内でStrutsアプリケーションを開発する方法をこの記事で紹介します。Easy Strutsへの入門、インストールと構成のステップ、そして基本的なStrutsアプリケーション構築のインストラクションの順番で、例を踏まえて説明します。(データベースへの接続、アプリケーションのモジュラー化、コンテントの国際化とローカリゼーション、例外の処理、そしてカスタム・プラグインの作成等の)Strutsアプリケーションの展開方法も網羅します。最後には、Tomcat WebサーバーにてStrutsアプリケーションをどのようにデプロイするかを紹介します。

Nancy Junhua (nancy_chenjunhua@yahoo.com), Software Consultant and Developer

Nancy JunhuaNancy Chen Junhuaは、数年に渡る経験を積んで来たフリーランスのソフトウェア・コンサルタントそして開発者です。シンガポールの南洋工科大学(Nanyang Technological University)にてエージェント・ラーニングを研究中。Nancy Chen Junhuaへのコンタクトは、nancy_chenjunhua@yahoo.comでどうぞ。



2004年 4月 08日

Easy Strutsプラグインは全ての複雑な構成ファイルを管理しますので、ロジックの発展に専念できます。完全なアプリケーション構築を援助するEasy Strutsの10種の機能に注目してください。

  1. Add Easy Struts support はプロジェクトのクラスパスに全ての必要なStrutsライブラリーを追加し、構成ファイルとデフォルトのリソース・プロパティー・ファイルを作成します。
  2. Easy Form は、(フォーム・プロパティーのgetterそしてsetterメソッドの付属する)Form Beanクラスのみならずフォーム・プロパティーの付属するJSPファイルを作成し、form Beanの定義を構成ファイルに追加します。
  3. Easy Action は、Actionクラスを作成し、アクション・マッピングの定義を構成ファイルに追加します。
  4. Easy Action associated with a form は、フォーム・プロパティーの付属するJSPファイル、(フォーム・プロパティーのgetterそしてsetterメソッドの付属する)Form BeanクラスそしてActionクラスを作成します。それから、それはform Beanの定義そしてアクション・マッピングの定義を構成ファイルに追加します。
  5. Easy Forward は、制御がどこにフォワードされるかを定義するローカル・フォワードとグローバル・フォワードを作成します。
  6. Easy Exception は、例外を処理します。
  7. Easy Message resources は、コンテンツの国際化そしてローカリゼーションにて特に重要なリソース・プロパティー・ファイルを作成します。
  8. Easy Plug-in は、プラグインを作成します。
  9. Easy Datasource は、データ・ソースにアプリケーションを接続します。
  10. Easy Module は、アプリケーションをモジュラー化します。

この記事では、上記の10種類の機能のうち8種類(2. Easy Form と 3. Easy Actionを除く)を網羅します。Strutsアプリケーション開発を始める前に、必要なプログラムとプラグインをインストールし、XMLとXSLTはもちろんJavaプログラム、HTML、JSPのスクリプトの基本を知っておくとよいでしょう。

下準備としてのインストールそして構成

Eclipse用Sysdeo Tomcatプラグイン、MySQLデータベース・サーバー、そしてMySQL用のJDBCドライバーに加えて、Eclipse 2.1、Struts 1.1、Tomcat Webサーバー、そしてEasy Strutsをインストールします。EclipseはIDEです。Strutsアプリケーション実行用ライブラリーをStruts 1.1は提供します。TomcatはアプリケーションをホスティングするWebコンテナーです。Sysdeo Tomcatプラグインを使って、開発者はEclipse環境内にてTomcat Webサーバーを起動そして終了できます。MySQL用のJDBCドライバーは、JDBC呼び出しを(MySQLデータベースに使われる)ネットワーク・プロトコルに変換します。インストール後には、2つのEclipse用プラグインを構成する必要があります。

インストール

以下の項目のダウンロード用リンクは、 参考文献 に記されています。

  1. Eclipse Webサイトから、Eclipse v2.1をダウンロードします。フォルダーを適当に選び、(この記事で eclipse_home として参照する)そのフォルダーに解凍してインストールします。
  2. Apache WebサイトからStruts 1.1をダウンロードします。フォルダーを適当に選び、(この記事で struts_home として参照する)そのフォルダーに解凍してインストールします。
  3. Apache WebサイトからTomcat Webサーバーをダウンロードします。フォルダーを適当に選び、(この記事で tomcat_home として参照する)そのフォルダーに解凍してインストールします。この記事ではバージョンv4.1.18を想定します。
  4. Sysdeo Webサイトから最新のEclipse用Tomcatプラグインをダウンロードします。eclipse_home/eclipse/pluginsに解凍してインストールします。この記事ではバージョンv2.2を想定します。
  5. SourceForgeから最新のEasy Struts for Eclipse plug-in v0.6.4をダウンロードします。eclipse_home/eclipse/pluginsに解凍してインストールします。
  6. Sun WebサイトからJ2SE SDKをダウンロードします。(この記事では java_home として参照する)フォルダーを適当に選び、インストールします。この記事ではバージョンv1.4.2を想定します。
  7. MySQL Webサイトから、MySQLデータベース・サーバーをダウンロードします。フォルダーを適当に選び、インストールします。
  8. MySQL Webサイトから、MySQL のJDBCドライバーをダウンロードします。それを解凍し、プロジェクト用のワークスペースにmysql-connector-java-x.x.xx-stable/mysql-connector-java-x.x.xx-stable-bin.jarをコピーそしてペーストします。これには後に触れます。この記事ではバージョンv3.0を想定します。

構成

Sysdeo Tomcatプラグインの構成

以下の手順でSysdeo Tomcatプラグインを構成してください。

  1. Eclipse を起動します。
  2. Tomcatプラグインを構成するには、「Window」メニューに移動し、「Preferences」項目を選択し、ポップアップ表示の「Tomcat」オプションを選んでください。それから、以下の項目を実行してください。
    • 「Tomcat version」を、Tomcatのバージョンに合わせる。
    • 「Tomcat home」をtomcat_home/jakarta-tomcat-4.1.18に設定する。
    • 「Perspective to switch when Tomcat is started」をJavaに設定する。
    • オプション「Tomcat」内のサブオプション「JVM Settings」内の「Classpath」で、java_home/lib/フォルダー内にあるtools.jarのJar/Zipを追加してください。これはJSPをコンパイルするためです。
  3. プロジェクトのクラスパス参照用に、クラスパス変数TOMCAT_HOMEを設定します。そうするには、ステップ2にて使用したのと同じポップアップ表示にて「Java」オプションを選び、「Classpath Variables」サブオプションを選択し、新たな変数「TOMCAT_HOME」(そのパスはtomcat_home/jakarta-tomcat-4.1.18)を追加してください。
  4. 「Tomcat」メニューと3つのツールバーのボタンが使用可能であることを確認してください。その時点では、「Tomcat」メニューと( 図1 で示されるように)3つのTomcatツールバーのボタンをJavaパースペクティブで確認できるはずです。それがうまく行かなければ、Windowメニューへ移動し、「Customize Perspective...」を選び、「Other」と記されたオプション・ツリーを開き、「Tomcat」サブオプションを選択してください。
  5. Sysdeo Tomcatプラグインが機能することを確認します。検証するには、メニューまたはツールバーでTomcatをStart/ Stop(開始・終了)します。
図1. Tomcatツールバーのボタン
図1. Tomcatツールバーのボタン

Easy Strutsプラグインの構成

Easy Strutsプラグインを構成するには、 図2 を参照し、次の手順を踏まえましょう。

  1. Strutsのバージョンを選択してください。そうするには、「Window」メニューに移動し、「Preferences」の項目を選択し、「Easy Struts」オプションを選択、それから「Struts 1.1」のタブを選択してください。
  2. 「Add JARs」でJARを追加してください。struts_home\jakarta-struts-1.1\lib内の全ての.jarファイルに「Add JARs」を使用するのが望ましいでしょう。
  3. 次に、「Add TLDs」でTLDを追加してください。struts_home\jakarta-struts-1.1\lib内の全ての.tldファイルに「Add TLDs」を使用するのが望ましいでしょう。
図2. Easy Strutsプラグインの構成
図2. Easy Strutsプラグインの構成

Strutsアプリケーションを作成する

この章では、Easy Strutsプラグインを使用したStrutsアプリケーションの構築に伴う基本的な手順を説明します。最初に、Tomcatプロジェクトを作成します。次に、TomcatプロジェクトにEasy Strutsサポートを追加します。この時点で「Easy Action associated with a form」機能を使えるようになります。その後、前段階で自動的に生成されたソース・コードに必要な修正を加えます。その次に、Tomcat Webサーバー上でアプリケーションを実行しテストできます。最後に、「Easy Forward」機能を考察できます。

Tomcatプロジェクトを作成する

Tomcatプロジェクトを作成するには、「File」メニューに移動し、「New」の項目を選択し、サブメニューから「Project」を選んでください。それから、以下の項目を実行してください。

  1. 「Java」オプションに移動し、「Tomcat Project」を選択し、「Next」をクリックしてください( 図3 も参照してください)。
  2. 「Project name」にプロジェクト名を入れて、「Next」をクリックしてください( 図4 も参照してください)。
  3. 「Can update server.xml file」にチェックを入れてください。システムはTomcat Webサーバーのserver.xmlファイルを自動的にアップデートします。「Finish」をクリックしてタスクを終了してください( 図5 も参照してください)。

Tomcatプロジェクト作成結果は、 図6 にて示されています。

図3. Tomcatプロジェクト作成・ステップ1
図3. Tomcatプロジェクト作成・ステップ1
図4. Tomcatプロジェクト作成・ステップ2
図4. Tomcatプロジェクト作成・ステップ2
図5. Tomcatプロジェクト作成・ステップ3
図5. Tomcatプロジェクト作成・ステップ3
図6. Tomcatプロジェクト作成・最終結果
図6. Tomcatプロジェクト作成・最終結果

Adding Easy Struts support(Easy Strutsサポートの追加)

TomcatプロジェクトにEasy Strutsサポートを追加するには、以下の手順を踏まえましょう。

  1. ツールバー・ボタン上の「New」をクリックし、「Java」オプションから「Easy Struts」サブオプションを選択し、「Add Easy Struts support」を選び、「Next」をクリックして次に進みます。(以降 Easy Struts機能表示 として参照する 図7 の表示も参照してください。)
  2. 図8 に示される構成を実行してください。「Copy Struts binary」そして「Copy Struts TLD」のチェックボックスにチェックが入っていることを確認してください。

図9 はAdd Easy Struts support(Easy Strutsサポートの追加)の結果です。

図7. Easy Struts機能表示
図7. Easy Struts機能表示

図8の注意:

「URL pattern」の入力部分は、(アクション・サーブレットにフォワードするようにコンテナーに命令することにより)「*.do」のパターンにはまるファイル・リクエストを扱うようにStrutsに指示します。Strutsは他のパターンの要求を処理しません。 デフォルトのアプリケーション・リソース(Default application resource)は、WEB-INF/classes/base package/にて作成されます。

図8. Add Easy Struts support(Easy Strutsサポートの追加)
図8. Add Easy Struts support(Easy Strutsサポートの追加)
図9. Add Easy Struts support (Easy Strutsサポートの追加)・最終結果
図9. Add Easy Struts support (Easy Strutsサポートの追加)・最終結果

Easy Strutsに供給される10の機能を、 図7 で示します。「Add Easy Struts Support」は既に考察済みです。以降、この記事では残された10の機能のうち(「Add Easy Struts Support」、「Easy Action」、「Easy Form」を除く)7種を説明します。この章では、「Easy Action associated with a form」と「Easy Forward」を使用して(シンプルでありながら完全な)Strutsアプリケーションを構築します。「Easy Message resources」、「Easy Plug In」、「Easy Datasource」、「Easy Exception」、そして「Easy Module」は、次の項で説明します。

「Easy Action Associated with a Form」を使用する

Easy Struts機能表示に移動し、「Easy Action associated with a form」を選択し、そして以下の手順を踏まえてフォームを構成してください。

  1. 「Use case」に入力。「Use case」を基に「Form name」と「Form type」がシステムにより生成されます。「Form name」と「Form type」の内容を手入力して変更できます( 図10 参照)。
  2. 「Form properties」ブロックにて「Add」をクリックしてください。 図11 にて示される表示を使用してform properties(フォーム・プロパティー)を追加しましょう。例として図に示されるとおり、名前「tel」がテキスト入力フィールドに追加され、「tel」の値のタイプはintにします。「tel」の初期値を0に設定します。「Type」には、直に入力または「Browse」ボタンを使用できます。「JSP input type」には、手入力またはプルダウン選択が可能です。form Beanクラス内のそれぞれのタイプ・プロパティーにgetterメソッドとsetterメソッドの組み合わせをStrutsシステムは生成します。それゆえに、選択リストには、(全ての<html:option>では無く)<html:select>を1つ作成するだけです。
  3. Webアプリケーションを作成しているので、最初の2つのチェック・ボックスにチェックを入れましょう。
  4. 「Next」をクリックして、次に進みます。
図10. フォームの構成
図10. フォームの構成

注意

  • フォーム・プロパティーの名前は大文字で始められません。大文字で始めれば、アクションが呼び出される時に「getterメソッドが見付からない」と言う警告を下します。
  • フォーム・プロパティーの名前は重複してはなりません。重複する2つの名前を使用したければ、接頭部または接尾部のスペースで問題を解決できます。
図11. Form properties Add 画面成
図11. Form properties Add 画面成

この時点で、 図12 に類似するものを見つけるはずです。デフォルトとして、入力値は「/form/owner.jsp」であり、JSPファイルが「easyStruts/form」フォルダーにあることをそれは意味します。手入力または設定の変更でJSPファイルの場所を変更できます。設定を変更するには、「Window」メニューに移動し、「Preferences」を選択し、「Easy Struts」オプションをクリックし、「Style」タブを選び、そして「JSP form location」を空白にします。例えばこの記事では、easyStruts(プロジェクトの名前)フォルダーに直接JSPファイルが保管されている方をおすすめします。 図12 にて示されるように、それを「/owner.jsp」に変更してください。

図12 にて示されるアクション・マッピングの属性は、以下のとおりです。

  • Path はサブミットされた要求のcontext-relativeパスです。パスには接頭部「/」があり、ユニークでなくてはなりません。
  • Type は、このActionMappingに説明されるActionクラスの名前です。
  • Attribute はリクエスト・スコープまたはセッション・スコープの属性です。Beanの指定された名前と重複しなければ、フォームBeanがその属性の基でアクセスされます。
  • Scope はフォームBeanの値がどれだけの間保存されるかを指定します。
  • input は入力フォームのcontext-relativeパスを指定します。検証エラーに遭遇した時に、制御がその入力フォームに戻されます。
  • Validate にチェックが入っていたら、ActionForm.validate()メソッドがこのマッピングに関わるフォームBeanへと呼び出されます。
  • Parameter このマッピングに選択されたActionへ追加情報を受け渡す時に、Parameterを使用します。
図12. アクションの構成成
図12. アクションの構成成

「Next」をクリックすれば、 図13 のような表示を拝見できます。 図13 にて示されるプロパティーは、以下に示すとおり、アクション・マッピングのプロパティーです。

  • Forward は、この要求を処理するJSPリソースまたはサーブレットのcontext-relativeパスを指定します。サーブレットまたはJSPリソースへ制御をフォワードするために、ActionMappingはfindForward()を使用できます。
  • Exception は、このマッピングと関連するExceptionHandlersです。

ここでのフォワード(forward)と例外(exception)は両方ともローカルです。グローバルなフォワードと例外については後ほどに説明します。

図13. フォワードの構成
図13. フォワードの構成

ローカルのフォワード属性:

  • 「name」は固有の識別子で、パスを返すアクション・マッピングのfindForward()メソッドで使用されます。
  • 「ContextRelative」タグは以下の項目をStrutsに伝えます。
    • 「ContextRelative」にチェックが入れられた場合、全体のWebアプリケーションに対してパスが相対的であるとみなされます。
    • 「ContextRelative」にチェックが入れられない場合、モジュラー・アプリケーションのモジュールに対してパスが相対的であるとみなされます。
  • 「Redirect」にチェックが入るならば、制御はフォワードとしてでは無くリダイレクトとしてページに転送されます。それは新たな要求が作成されたことを意味します。

「Finish」( 図14 参照)をクリックした後に、システムはcom.asprise.struts.form.OwnerForm.javaそしてcom.asprise.struts.action.OwnerAction.javaをeasyStruts/WEB-INF/src/にて生成します。easyStruts/owner.jspと言う別のファイルも同時に生成されます。フォーム入力を完了し、ユーザー入力検証メソッドを追加し、検証エラーを処理するために、次の章にて3つのファイルに変更を加えます。

図14. フォワードの追加
図14. フォワードの追加

ActionFormクラスを修正する タイプ「java.lang.Integer」のフォーム・プロパティー「tel」を既に作成していますので、ActionForm.javaの「Integer」を「int」に変更します。それから、フォーム・プロパティーのユーザー入力を検証するために、validate()メソッドをコーディングします。 リスト1 にて、完全なvalidate()メソッドが示されています。

ActionError("error.noEmail")内の「error.noEmail」は、「<li><font color=red>Enter your email</font>」と同等のリソース・プロパティー・ファイルにて定義されるキーです。<html>コードはリソース・プロパティー・ファイルにて使用できます。ActionErrorクラス内の「add (java.lang.Stringプロパティー, ActionErrorエラー)」メソッドにある引数プロパティーは、フォーム・プロパティーの名前です。このActionErrorは指定のフォーム・プロパティーとしか関連しません。例えば、E-mail アドレスがNULLか空白しか含まない場合、フォームが検証される時に「Enter your email」が表示されます。「@」がE-mail アドレスに含まれていない場合、リソース・プロパティー・ファイル内で「error.wrongEmail」キーで定義される「Correct your email」が表示されます。どちらのエラーもフォーム・プロパティー「email」と関連しているだけです( リスト1 参照)。これには後に触れます。

リスト1. OwnerForm.java
package com.asprise.struts.form; import
javax.servlet.http.HttpServletRequest; import
org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionForm; import
org.apache.struts.action.ActionMapping; public class
OwnerForm extends ActionForm { private String email;
private String greet = "Mr."; private String
address;
private int tel = 0;
private String name;

public ActionErrors validate( ActionMapping mapping,
HttpServletRequest request) { ActionErrors errors =
new ActionErrors(); if (greet == null ||
greet.trim().equals("")) {
errors.add("greet", new
ActionError("error.greet")); } if (name ==
null || name.trim().equals("")) {
errors.add("name", new
ActionError("error.name")); } if (address
== null || address.trim().equals("")) {
errors.add("address", new
ActionError("error.address")); } if (email
== null || email.trim().equals("")) {
errors.add("email", new
ActionError("error.noEmail")); } else if
(email.indexOf("@")==-1) {
errors.add("email", new
ActionError("error.wrongEmail")); } if
(tel==0) { errors.add("tel", new
ActionError("error.tel")); } return
errors; }

... public String getEmail() { return email; } public
void setEmail(String email) { this.email = email; } ...
}

<html>コードはリソース・プロパティー・ファイルにて使用可能です。リソース・プロパティー・ファイルのコンテントは、キーと値の組み合わせです( リスト2 参照)。キーはソース・コード・ファイルにて呼び出せます。システムは2つのキー(errors.headerとerrors.footer)を全てのリソース・プロパティー・ファイルで必要とします。

リスト2. ApplicationResources.properties
errors.header=<h4>Validation
Error(s)</h4><ul>
errors.footer=</ul><hr>
error.greet=<li>Choose your greet
error.name=<li>Enter your name
error.address=<li>Enter your address
error.tel=<li>Enter your contact number
error.wrongEmail=<li>Correct your email
error.noEmail=<li>Enter your email

Actionクラスの修正 OwnerActionクラスは単に「Thank you, Miss Nancy Chen」のようなメッセージをローカル・フォワード(local forward)の「success」と言う名のパスで表示します。ロジックをコーディングするために、OwnerActionのexecute()メソッドを修正してください(全てのアクション・クラスはexecute() メソッドを実装すべきです)。 リスト3 を参照してください。それは制御をsuccess.jspにフォワードします。

リスト3. OwnerAction.java
public class OwnerAction extends Action { public
ActionForward execute( ActionMapping mapping, ActionForm
form, HttpServletRequest request, HttpServletResponse
response) throws Exception { OwnerForm ownerForm =
(OwnerForm) form;

String greet = ownerForm.getGreet(); String name =
ownerForm.getName();
request.setAttribute("name", name);
request.setAttribute("greet", greet); //
Forward control to the specified success target
return (mapping.findForward("success"));

} }

JSPファイルを修正する <html:select>の<html:option>を追加することにより、フォームを完成させてください( リスト4 参照)。それから、(「property」属性付きの<html:error>タグとは異なることを示すために)そのフォームの後に<html:errors />を追加しましょう。例えば、<html:errors property="name">はフォーム・プロパティー「name」と関連するユーザー入力検証エラーのみを反映します。ActionErrorsクラスの「add (Stringプロパティー, ActionErrorエラー)」を使い、フォーム・プロパティーをエラーと関連付けることが可能です。<html:errors />はこのフォームの全ての検証エラーを反映します。<html:error>の呼び出しのある位置にてエラーが表示されます。

リスト4. owner.jsp
<%@ taglib uri="/WEB-INF/struts-bean.tld"
prefix="bean"%> <%@ taglib
uri="/WEB-INF/struts-html.tld"
prefix="html"%> <html> <head>
<met "Generator" content =
"Easy Struts Xslt generator for Eclipse
(http://easystruts.sf.net).">
<title>Struts Form for ownerForm</title>
</head> <body> <html:form
action="/owner">

greet : <html:select
property="greet"> <html:option
value=""></html:option>
<html:option
value="Mr.">Mr.</html:option>
<html:option
value="Miss">Miss</html:option>
<html:option
value="Mrs.">Mrs.</html:option>
</html:select><html:errors
property="greet"/>

name : <html:text
property="name"/><html:errors
property="name"/></br> address :
<html:text
property="address"/><html:errors
property="address"/></br> email :
<html:text
property="email"/><html:errors
property="email"/></br> tel :
<html:text
property="tel"/><html:errors
property="tel"/></br>
<html:submit/><html:cancel/>
</html:form>
<html:errors />
<body> </html>

「Thank you, Miss Nancy Chen」のようなメッセージを表示させるために、success.jspをコーディングしましょう。「Miss」はオーナーの「称号」で、「Nancy Chen」はオーナーの名前です。出来上がるファイルを リスト5 に示します。

リスト5. success.jsp
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%> 
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<logic:present name="name" scope="request">
Thank you,
<logic:present name="greet" scope="request">
<bean:write name="greet" scope="request"/>
</logic:present>
<bean:write name="name" scope="request"/>
</logic:present>

<logic:present>はStrutsロジック・タグの1つです。ロジック・タグに「name」属性が付属している場合、それはスコープ内の指定された名前(name)の付けられたJSP Beanの存在を確かめます。<logic:present>属性の完全リストそしてStrutsロジック・タグの完全リストでしたら、 Struts User Guide を参照してください。

<bean:write>はStruts Beanタグの1つです。現行のJspWriterに指定されたBean特性の値をレンダリングするのに使われます。Beanタグが「name」属性そして「property」属性を抱く場合、「property」に指定された値を回収するためにそのBeanのプロパティーがアクセスされ、そのBeanの属性名をそれは指定します。「property」属性が指定されなければ、そのBeanそのものの値をレンダリングします。<logic:present>属性の完全リストそしてStrutsロジック・タグの完全リストでしたら、 Struts User Guide を参照してください。

struts-config.xmlを検査する Eclipse環境内で「struts-config.xml」をダブルクリックすると、 図15 で示されるとおり、struts-config.xmlがGUIで表示されます。これにより開発者は容易にEasy Struts機能を編集できます。「source」タブをクリックすれば、struts-config.xmlのソース・コードをも見られます。

図15. struts-config.xml
図15. struts-config.xml

アプリケーションのテスト ツールバーのTomcatボタンをクリックして、Tomcatサーバーを再起動してください。そして、URLアドレス・バーに「http://127.0.0.1:8080/easyStruts/owner.jsp」と入力しますと、 図16 が表示されます。検証の結果は 図17 にて示されています。「property」属性の有無による<html:errors>の動作の違いに注目してください。「property」があれば、このプロパティーと関連するエラーのみをシステムは返します。「property」が無ければ、システムは全てのエラーをそれぞれのフォームで返します。全ての入力が正しければ、システムは制御をsuccess.jspにフォワードし、success.jspはメッセージ「Thank you, Miss Nancy Chen」を表示します( 図18 参照)。

図16. owner.jsp
図16. owner.jsp
図17. フォーム検証エラー
図17. フォーム検証エラー
図18. 成功
図18. 成功

Easy Forwardを使用する

Struts構成に提供された2種類のActionForwardはグローバル・フォワードにローカル・フォワードです。Global ActionForwardはアプリケーションを通してどのActionオブジェクトからも見ることができます。Local ActionForwardと関連するActionMappingから呼び出された時のみ、ActionオブジェクトはLocal ActionForwardを入手可能です。「Easy Action associated with a form」の処理にてローカル・フォワードをどのようにして作成するかを、前回の章にて学んだことでしょう。この章では、ローカルまたはグローバル・フォワードを「Easy Forward」を使用していかにして作成するかを説明します。

Easy Struts機能表示へ移動し、「Easy Forward」をクリックすれば、 図19 のような表示が出ます。「Visibility」を空白のままにすれば、グローバル・フォワードを得られます。「Browse」ボタンをクリックし( 図20 にて示されるとおりに)「/owner」を選択すれば、結果としてローカル・フォワードを得られます。フォワードがグローバルかローカルかに関係無く、それらはActionクラスにて「mapping.findForward("failure");」とみなされます。

図19 にて示される「name」、「Redirect」、「Context relative」属性については、「Easy Action associated with a form」の章で既に説明済みです。

図19. グローバルEasy Forward
図19. グローバルEasy Forward
図20. ローカルEasy Forward
図20. ローカルEasy Forward

アプリケーションを拡張する

前章では、3つのEasy Struts機能を説明しました。この章では、JSPファイルをスタイル化するために独自のXSLTファイルをコーディングします。あと、コンテントの国際化・ローカリゼーション、データ・ソースへの接続、カスタムの例外の処理、アプリケーションのモジュラー化、そしてカスタム・プラグインの作成に残りの機能を使用します。

XSLTファイルでJSPファイルをスタイル化する

独自の.xslファイルのコーディングそしてEasy Struts設定の構成により、希望するフォーマットで生成されたJSPファイルを入手できます。独自の.xslファイルを追加するためにこの設定構成を行なうには、「Window」メニューに移動し、「Preferences」項目を選び、「Easy Struts」オプションを選択し、「XSLT stylesheet」タブをクリックし、そして「Jsp file stylesheet」の「Browse」をクリックしてください。

例えば、 リスト6 に示されたコードは.xslファイルです。それぞれのフォーム・プロパティーにおいて、それは「property」属性と「value」属性を生成します。例えば、初期値「nancy」の入った「name」と名付けられたテキスト入力を指定すれば、JSPファイル内にて生成される行は「 <html:text property="name" value="nancy"></html:text> 」です。

リスト6. myJsp.xsl
リスト6. myJsp.xsl

Easy Message Resourceでのコンテントのローカリゼーション

ローカライズされたリソース・プロパティー・ファイルを作成すれば、アプリケーションをローカライズできます。新規のリソース・プロパティー・ファイルを作成するには、Easy Struts機能表示へ移動し、「Easy Message Resource」を選択してください。 図21 のとおりに中国語のメッセージ・リソース作成を構成してください。リソース・プロパティー・ファイルの名前がApplicationResources_xx_XX.propertiesの形でなくてはならないことに注目してください。小文字のxxは2文字のISO-639言語コードに示されるローカル言語を指し、大文字のXXは2文字のISO-3166国コードに示されるローカルの国家名を指します。

注意: 2文字のISO-639言語コードの完全なリストは、Unicode.orgの languages page へどうぞ。2文字のISO-3166国コードの完全なリストは、Unicode.orgの countries page へどうぞ。

Easy messageリソース属性:

  • NULL属性がtrueに設定されれば、NULLストリングが不明のメッセージ・キーのために返される事態を招きます。
  • メッセージ・リソース・バンドルが作成されれば、パラメータはファクトリー(factory)に手渡されます。「parameter」の値は、プロパティー・ファイルを基にしたファクトリーのプロパティ・ファイルへのパスです。
  • このメッセージ・リソース・バンドルを束ねるServletContext属性のキーを、キー属性は定義します。
図21. 中国語メッセージ・リソースを作成する
図21. 中国語メッセージ・リソースを作成する

リソース・プロパティー・ファイルは容易に編集可能です。中国語リソース・プロパティー・ファイルにNotepadを使えます。ApplicationResources_zh_CN.propertiesをUnicode (UTF-8)のエンコード方式で保存してください。次に、ローカル言語を中国語、そしてローカル国家を中国に設定しましょう(Windowsの場合、Control Panel内の地域と言語のオプションを使用すれば可能です)。変更を反映させるためにTomcatを再起動し、http://127.0.0.1:8080/easyStruts/owner.jspへ移動してください。 図22 にて示されるとおり、検証エラーは中国語で表示されます。

図22. 検証エラーの中国語表示
図22. 検証エラーの中国語表示

Easy Datasourceでデータベースと接続する

この章ではWebアプリケーションをMySQLデータベースに接続します。そうするには、Easy Struts機能表示へ移動し、「Easy Datasource」を選択し、 図23 に示されるとおりに構成を実行してください。eclipse_home\eclipse\workspace\easyStruts\WEB-INF\libにJDBCドライバーを設置するべきであることに注目してください。

図23. MySQLデータベースの構成
図23. MySQLデータベースの構成

次に、MySQLサーバーを起動し、「crm」データベースそして( リスト7 にて示されるとおりに)「owner」テーブルを作成してください。

リスト7. owner テーブル
# Database : 'crm'
# Table structure for table 'owner'
#
CREATE TABLE 'owner' (
'id' int(6) NOT NULL default '0',
'greet' varchar(5) NOT NULL default '',
'name' varchar(50) NOT NULL default '',
'email' varchar(50) NOT NULL default '',
'address' varchar(100) NOT NULL default '',
'tel' int(10) NOT NULL default '0',
PRIMARY KEY  ('id')
) TYPE=MyISAM;

次に、データベースに接続するためにOwnerActionクラス内のexecute()メソッドを修正してください( リスト8 参照)。ご覧のとおり、Easy Datasourceにて使用されたキーのプロパティーがここで役に立ちます。「org.apache.struts.action.DATA_SOURCE」が「datasource」のキーです。SQLExceptionをcatchして再度throwすることに着目してください。次の章では、SQLExceptionを扱うために独自の例外ハンドラーをコーディングします。

リスト8. OwnerAction.java - database間の接続
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
OwnerForm ownerForm = (OwnerForm) form;
String greet = ownerForm.getGreet();
String name = ownerForm.getName();  request.setAttribute("name", name);
request.setAttribute("greet", greet);
String address = ownerForm.getAddress();
String email = ownerForm.getEmail();
int tel = ownerForm.getTel();
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
DataSource dataSource = (DataSource)servlet.getServletContext().getAttribute(
"org.apache.struts.action.DATA_SOURCE");
try {
conn = dataSource.getConnection();
stmt = conn.createStatement();
int id = 0;
rs = stmt.executeQuery("select max(id) as counter from owner");
while(rs.next()){
id = rs.getInt("counter");
}
id += 1;
stmt.executeUpdate("insert into owner values(
"+id+", '"+greet+"', '"+name+"', '"+email+"', '"+address+"', "+tel+")");
rs.close();
stmt.close();
conn.close();
}
catch(SQLException e){
throw new SQLException("database error");
}
// Forward control to the specified success target
return (mapping.findForward("success"));
}

スタートアップ時にデータ・ソースへ接続するためにTomcatサーバーを再起動し、http://127.0.0.1:8080/easyStruts/owner.jspへ移動しましょう。全ての入力が正しければ、記録は「owner」テーブルに挿入され制御はsuccess.jspにフォワードされます。データベースを調べれば、「owner」テーブルにある新規記録の有無を確認できます。

Easy Exceptionで例外を処理する

前章で触れたとおり、SQLExceptionを処理するために独自の例外ハンドラーをコーディングできます。先ず、Easy Struts機能表示へ移動し、例外を宣言するためにEasy Exceptionを選択します。 図24 に示される構成を使用してください。この例外のためにメッセージ・リソースを抑えるリソース・バンドルの名前はバンドル属性にて指定されます。例外発生時に例外を処理することを要求されるクラスを、そのハンドラー属性は指定します。キーはメッセージ・リソース・バンドルにて定義されます。例外が発生すれば、パス属性にて与えられたファイルへと制御は再送信されます。スコープ属性は、例外を処理することにより発生したActionErrorsがどれだけの時間保存されるか(セッションまたはリクエスト)をStrutsに連絡します。タイプ属性は、このハンドラーにインターセプトされる例外のタイプを指定します。

図24. 例外の構成
図24. 例外の構成

「Finish」をクリックした後、例外が宣言されます。それからMyExceptionHandler.javaをコーディングしましょう( リスト9 参照)。それはExceptionHandlerクラスを拡張し、(Actionクラスのように)ActionForwardを返すためにそれはexecute()メソッドを実装します。ご覧のとおり、Easy Exceptionの「path」プロパティーは、ExceptionConfigクラスのgetPath()メソッドを使用すれば回収できます。ExceptionConfigクラスのgetKey()メソッドを使用すれば、キー・プロパティーを得られます。

リスト9. MyExceptionHandler.java
package com.asprise.struts.exception;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.apache.struts.config.*;
public class MyExceptionHandler extends ExceptionHandler {
public ActionForward execute(
Exception ex,
ExceptionConfig ae,
ActionMapping mapping,
ActionForm formInstance,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException {
request.setAttribute("myException",ex);
request.setAttribute("myForm",formInstance);
request.setAttribute("myKey",ae.getKey());
return new ActionForward(ae.getPath());
}
}

例外宣言にてSQLExceptionが発生すれば、制御はexception.jspにリダイレクトされます。exception.jspは「error.database」キーでデフォルトのリソース・プロパティー・ファイルに定義されたメッセージを表示し、例外がスローされれば例外タイプと例外メッセージが表示されます。そして、MyExceptionHandler内の例外キーを回収できます。 リスト10 のとおり、<bean:message>タグに回収されたキーを供給します。

リスト10. exception.jsp
<%@ page import="java.sql.SQLException"
%> <%@ page
import="com.asprise.struts.form.*" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld"
prefix="bean"%> <% OwnerForm myForm =
(OwnerForm)request.getAttribute("myForm"); if
(myForm != null) { out.println("<font
color=red>Sorry, "+myForm.getGreet());
out.println("
"+myForm.getName()+"</font>"); }
%>

<ul><bean:message
key="<%=request.getAttribute(\"myKey\").toString()%>"
/>

<% Object obj =
request.getAttribute("myException"); if (obj
!= null) { Throwable ex = (Throwable)obj;
out.println("<li><b>Type:</b>"+ex.toString());
out.println("<li><b>Message:</b>"+ex.getMessage());
} %>

「error.database=<h3>An Exception Handled by MyExceptionHandler:</h3>".」を定義してください。SQLExceptionが発生すれば、 図25 のような表示を確認できます。

図25. 例外処理 ― テスト結果
図25. 例外処理 ― テスト結果

Easy Moduleでアプリケーションをモジュラー化

この章では、新規モジュール「newModule」を作成します。そうするには、Easy Struts機能表示へ移動し、「Easy Module」を選択し、 図26 で示されるとおりモジュールの名前「newModule」を「Module name」に入力します。

図26. モジュールの構成
図26. モジュールの構成

新規モジュールを反映させるには、Eclipseを再起動してください。Webアプリケーション起動時に以下のようなエラーが発生した場合、

リスティングを見るにはここをクリック

org.xml.sax.SAXParseException: The content of
element type "servlet" must match
"(icon?,servlet-name,display-name?,description?,(servlet-class|jsp-file),init-param*,load-on-startup?,run-as?,security-role-ref*)"

web.xml内のデフォルトのモジュールの直接下に新規モジュールの構成部分を移動すれば解決します。

新規モジュールに変更するには2種類の方法があります。最初に、struts-config.xml内に新規フォワード「success」をグローバルまたはローカルとして作成します( リスト11 参照)。mapping.findForward("success")を使用すれば、新規モジュールに切り換えられます。

リスト11. forward
<forward name="success"
contextRelative="true"
path="/newModule/index.do"
redirect="true"/>

次に、アクション(そのタイプは構築されたアクションSwitchAction)を以下のとおりに作成します。

<action path="/switchTo"
type="org.apache.struts.actions.SwitchAction"
validate="false" />

struts-config-newModule.xmlにて、 リスト12 にて示されるとおりにアクション・マッピングを作成します。

リスト12. アクション・マッピング
<action-mappings> <action
path="/index"
type="com.asprise.struts.newmodule.action.IndexAction">
<forward name="success"
path="/index.jsp"/> </action>
</action-mappings>

その次に、easyStruts/newModule/index.jspをコーディングします。index.jspはメッセージ「<h1>You are in module: newModule</h1>」のみを表示します。

Tomcatサーバーを起動し、http://127.0.0.1:8080/easyStruts/switchTo.do?prefix=/newModule&page=/index.doと記入します。結果は 図27 に示されるとおりです。デフォルトのモジュールに戻したければ、http://127.0.0.1:8080/easyStruts/switchTo.do?prefix=&page=/owner.jspと記入してください。

図27. モジュール間の切り換え
図27. モジュール間の切り換え

注意: 「Add Easy Struts support」を除く全てのEasy Strutsの機能でモジュール名を指定できます。

Easy Plug-inでカスタム・プラグインを作成する

この章では、最後のEasy Struts機能(Easy Plug-in)について説明します。最も一般的なプラグイン・アクション(Plug-in Action)の使用法は、Webアプリケーション起動時にアプリケーションに特化したデータを構成またはロードすることです。カスタム・プラグインはプラグイン・インターフェースを実装します。適切なプラグイン作成を保証するために、ActionServletに使用されるzero-argument constructor をこのインターフェースの実装は必要とします。(アプリケーションのそれぞれ起動時と終了時に呼び出される)init()メソッドとdestroy()メソッドを、このインターフェースで定義し、実装してください。

プラグインを作成するには、Easy Struts機能表示へ移動し、Easy Pluginを選択し、PluginクラスをPlugin classに入力し、そして「Add」をクリックしてプロパティーを追加しましょう。 図28 に示されるとおり、プロキシーとポートを追加してください。

図28. プラグインの構成
図28. プラグインの構成

それから、 リスト13 に示されるとおりに、(Plugin クラスを実装する)MyPluginクラスをコーディングしてください。Webアプリケーションが起動する時、「MyPlugin starting」と言うメッセージが表示され、システムのプロキシーとポートをセットします。Webアプリケーションが終了すれば、「MyPlugin Stopping」メッセージが表示されます。

リスト13. MyPlugin.java
package com.asprise.struts.plugin;
import org.apache.struts.action.PlugIn;
import org.apache.struts.config.ModuleConfig;
import org.apache.struts.action.ActionServlet;
public class MyPlugin implements PlugIn{
public String proxy;
public String port;
public MyPlugin(){
}
public void init(ActionServlet servlet, ModuleConfig config){
System.err.print("********* MyPlugin Starting *******");
System.setProperty("https.proxyHost", getProxy());
System.setProperty("https.proxyPort", getPort());
servlet.getServletContext().setAttribute("proxy", getProxy());
servlet.getServletContext().setAttribute("port", getPort());
}
public void destroy(){
System.err.print("********* MyPlugin Stopping *******");
}
public void setProxy(String prox){
proxy = prox;
}
public String getProxy(){
return this.proxy;
}
public void setPort(String por){
port = por;
}
public String getPort(){
return this.port;
}
}

JSPまたは別のJavaファイルのソース・コードにて、getServletContext().getAttribute("proxy")を使用してプロキシー値を得られます。


アプリケーションのデプロイ

Strutsアプリケーションをクライアントにデプロイするには、WARファイルとしてアプリケーションを単にエクスポートし、クライアントにそれをディストリビュートし、クライアントのWebサーバーの「webapps」フォルダーにWARファイルを入れるようにクライアントに要求します。アプリケーションをWARファイルとしてエクスポートする方法をここに紹介します。

  1. 「Project」メニューに移動し、「Properties」メニューを選び、「Tomcat」オプションを選択し、「Export to WAR settings」タブをクリックします。
  2. 「WAR file for export」の「Browse」をクリックし、folder-of-your-choice/easyStruts.warに値を設定し、設定を保存します。
  3. それから、project popupmenuに移動し、「Tomcat project」を選択し、サブメニューの「Export to the WAR file sets in project properties」をクリックします。
  4. メッセージ「Operation successful」が表示されれば、手順2で指定された場所に移動しWARファイルを取得できます。

まとめ

この記事では、Tomcat Webサーバー上で動作するStrutsアプリケーションを開発するためのEasy Struts機能に触れました。例外の処理、そしてクライアントへのアプリケーション配置に加え、フォーム・プロパティー検証の処理、ローカルとグローバルのフォワードと例外の作成、データ・ソースへの接続、コンテントの国際化・ローカリゼーション、アプリケーションのモジュラー化、そしてカスタム・プラグインの作成の方法を習いました。

参考文献

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source, Java technology
ArticleID=237192
ArticleTitle=Eclipse用Easy Strutsを使用したStruts開発
publish-date=04082004