JDeveloper 10gによるVelocity-Strutsアプリ開発

satonaoki2004-12-22


Oarcle JDeveloper 10gは、特にVelocityに対応した機能は持っていませんが、既存の機能だけでもVelocity開発を効率化することができます。今回は、Oarcle JDeveloper 10gを使ってVelocity-Strutsアプリケーションを開発する手順を、簡単にご紹介していきます。

まず、Oracle JDeveloper 10g 9.0.5をインストールします。

プロパティ・ファイルのUnicodeエスケープ変換を自動化するためのJDeveloper拡張機能も、合わせてインストールします。

VelocityとVelocity Toolsをダウンロードし、任意のディレクトリに展開します。本稿執筆時点の最新版は、Velocity 1.4 / Velocity Tools 1.1でした。

JDeveloperの基本操作やVelocityに関する説明は、本稿では行いません。これらについては別途、Velocityのドキュメントや、OTN JapanにあるJDeveloperの資料を参照してください。

まず、Velocity開発のための下準備をしましょう。JDeveloperを起動し、[ツール]>[ライブラリの管理]を選択します。[ライブラリの管理]ダイアログの[ライブラリ]タブで[ユーザー・ライブラリ]を選択し、[新規]ボタンをクリックします。新規ライブラリには、Velocity 1.4のvelocity-dep-1.4.jarとVelocity Tools 1.1のvelocity-tools-1.1.jarを登録します。

[ツール] > [設定]を選択します。[設定]ダイアログの[ファイル・タイプ]で、ファイル・タイプ[HTM[ソース]に対応する拡張子として、Velocityのテンプレート・ファイルの拡張子[.vm]を追加します。

ここまでの手順は1度だけ行えば十分で、毎回行う必要はありません。

続いて、(アプリケーション)ワークスペースとプロジェクトを作成します。右上の(アプリケーションまたはシステム)ナビゲータでプロジェクトを右クリックし、[プロジェクト・プロパティ]を選択します。[プロジェクト・プロパティ]ダイアログの[ライブラリ]で、Velocityのライブラリを追加します。

次に、Strutsのページ・フロー・ダイアグラムをオープンします。[ファイル]>[新規]を選択し、[新規ギャラリ]の[Web Tier]>[Struts]>[Strtus Controllerページ・フロー]を選択します。これによって、Webアプリケーションのデプロイメント・ディスクリプタ web.xmlStruts構成ファイル struts-config.xmlStrutsのメッセージ・リソース用プロパティ・ファイル ApplicationResources.propertiesなどが生成されます。また、プロジェクトのライブラリにも必要となるJSPStrutsのライブラリが自動的に追加されます。

続いて、Velocityの設定ファイルを追加します。[ファイル]>[新規]を選択し、[新規ギャラリ]の[General]>[Simple Files]>[ファイル]を選択します。[ファイルの作成]ダイアログで、[ディレクトリ名]に[<プロジェクト・ディレクトリ>/public_html/WEB-INF/]、ファイル名に[velocity.properties]を指定します。

velocity.propertiesには、適宜必要な設定を追加しましょう。ここでは、エンコーディングに関連する次の設定を追加しました。

input.encoding=Windows-31J
output.encoding=Windows-31J
default.contentType=text/html;charset=Windows-31J

再度[ファイル]>[新規]を選択し、[新規ギャラリ]の[General]>[XML]>[XML文書]を選択します。[XMLファイルの作成]ダイアログで、[ディレクトリ名]に前回と同じ[<プロジェクト・ディレクトリ>/public_html/WEB-INF/]、ファイル名に[velocity-toolbox.xml]を指定します。

velocity-toolbox.xmlには、適宜必要な設定を追加しましょう。ここでは、VelocityとStrutsの連携に関連する次の設定を追加しました。

<?xml version='1.0' encoding='windows-31j'?>
<toolbox>
  <tool>
    <key>link</key>
    <scope>request</scope>
    <class>org.apache.velocity.tools.struts.StrutsLinkTool</class>
  </tool>
  <tool>
    <key>msg</key>
    <scope>request</scope>
    <class>org.apache.velocity.tools.struts.MessageTool</class>
  </tool>
  <tool>
    <key>errors</key>
    <scope>request</scope>
    <class>org.apache.velocity.tools.struts.ErrorsTool</class>
  </tool>
  <tool>
    <key>form</key>
    <scope>request</scope>
    <class>org.apache.velocity.tools.struts.FormTool</class>
  </tool>
  <tool>
    <key>tiles</key>
    <scope>request</scope>
    <class>org.apache.velocity.tools.struts.TilesTool</class>
  </tool>
  <tool>
    <key>validator</key>
    <scope>request</scope>
    <class>org.apache.velocity.tools.struts.ValidatorTool</class>
  </tool>
</toolbox>

Webアプリケーションのデプロイメント・ディスクリプタ web.xmlにも、Velocity関連の設定を追加する必要があります。自動生成されたweb.xmlでは、すでにStrutsに関連する設定は済んでいるので、次の要素と要素をweb.xmlに追加しましょう。見ての通り、VelocityViewServletを拡張子 .vmに関連付け、また、Velocityの設定ファイルの位置も指定していますね。

.....
<servlet>
  <servlet-name>velocity</servlet-name>
  <servlet-class>org.apache.velocity.tools.view.servlet.VelocityViewServlet</servlet-class>
  <init-param>
    <param-name>org.apache.velocity.toolbox</param-name>
    <param-value>/WEB-INF/velocity-toolbox.xml</param-value>
  </init-param>
  <init-param>
    <param-name>org.apache.velocity.properties</param-name>
    <param-value>/WEB-INF/velocity.properties</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
.....
<servlet-mapping>
  <servlet-name>velocity</servlet-name>
  <url-pattern>*.vm</url-pattern>
</servlet-mapping>
.....

ここまでの手順で、下準備は完了しました。これらの手順を毎回実行するのが面倒な場合は、現状のWebアプリケーションをWARファイルとして保存しておき、次回以降は、そのWARファイルをインポートすることもできます。

[ナビゲータ]で[web.xml]を右クリックし、[WARデプロイメント・プロファイルの作成]を選択します。[デプロイメント・プロファイルの作成 - WARファイル]ダイアログで、[デプロイメント・プロファイル名]に適切な名前を設定します。ここでは、[velocity_sample]という名前にしました。

[WARデプロイメント・プロファイルのプロパティ]ダイアログでは、WARファイルに関連する様々な設定を行うことができます。今回は、デフォルトのままにしておきました。

生成されたvelocity_sample.deployを右クリックし[WARファイルへデプロイ]を選択すると、ここまで設定してきたWebアプリケーションのWARファイルが自動生成されます。次回以降は、[ファイル]>[インポート]を選択し、[インポート]で[WARファイル]を選択することで、WARファイルをもとにプロジェクトを作成できます。

では、本題に戻りましょう、作成中のプロジェクトに戻り、Velocityのテンプレート・ファイルを作成していきます。今回は、2つのVelocityテンプレート・ファイルと一組のStrutsアクション/アクション・フォームからなる、簡単なログイン・アプリケーションを作ってみましょう。

struts-conifg.xmlをダブル・クリックし、下部のタブで[ページ・フロー図]を選択します。右上に[コンポーネント・パレット]が表示されていない場合は、まず[表示]>[コンポーネント・パレット]を選択し、[コンポーネント・パレット]を表示しておきます。[コンポーネント・パレット]の[Struts Page Flow]>[Action]をページ・フロー・ダイアグラムにドラッグ&ドロップします。Srtutsアクションのアイコンの名前の部分をダブル・クリックし、名前を適宜変更しましょう。ここでは、[/LoginAction]に変更しました。

続いて、Strutsのアクションと・アクション・フォームのクラスを作成します。[/LoginAction]のアイコンをダブル・クリックし、[Strutsアクションの作成]ダイアログはデフォルトのまま進みます。

これによって、org.apache.struts.action.Actionクラスをextendsしたmypackage.LoginActionクラスが作成され、そのソース・コードが表示されます。後ほど、LoginActionクラスのexecute()メソッドを実装していきます。

その前に、execute()メソッドで使うアクション・フォームのクラスを作成します。再度、Strutsページ・フロー・ダイアグラムに戻ります。Strutsアクションが指定されていないことを示す黄色い[!]の標識が消えていることに注意しましょう。[/LoginAction]のアイコンを右クリックし、[フォームBeanに移動]を選択します。

[StrutsフォームBeanの作成]ダイアログで、適宜名前を変更しましょう。ここでは、[名前]に[LoginForm]、[フォームBean名]に[login-form]を指定しました。

これによって、org.apache.struts.action.ActionFormクラスをextendsしたmypackage.LoginFormクラスが作成され、そのソース・コードが表示されます。下部の[クラス]タブ>上部の[フィールド]タブを選択し、[追加]ボタンをクリックします。次のように設定することで、String型でprivateスコープの[username]フィールドを、そのgetter/setterメソッドとともに作成します。

同様にして、[password]フィールドとそのgetter/setterメソッドも作成します。

下部の[ソース]タブを選択し、ソースコードに戻ります。ここでは、アクション・フォームのバリデーションを実装してみましょう。左下の[構造]ペインでvalidate()メソッドをダブル・クリックし、validate()メソッドに移動します。パスワードは8文字以上でなければならない、ということにしましょう。validate()メソッドの実装を次のようにします。

  public ActionErrors validate(ActionMapping mapping, HttpServletRequest request)
  {
    ActionErrors errors = new ActionErrors();
    if (password.length() < 8) {
      errors.add("password", new ActionError("errors.password"));
    }
    return errors;
  }

アクション・エラーに対応するエラー・メッセージも定義しましょう。Strutsのメッセージ・リソース用プロパティ・ファイル ApplicationResources.propertiesに、キー"errors.password"に対応するメッセージを設定します。

errors.password=パスワード・エラーです

メッセージに日本語を使っているので、プロパティ・ファイルをUnicodeエスケープ変換する必要があります。冒頭でご紹介した拡張機能Unicodeエスケープ変換」をインストールしてあれば、[ApplicationResources.properties]を右クリックし、[Native2Ascii]>[変換]を選択します。次のように、Unicodeエスケープ変換されるはずです。

errors.password=\u30d1\u30b9\u30ef\u30fc\u30c9\u30fb\u30a8\u30e9\u30fc\u3067\u3059

続いて、LoginActionクラスのexecute()メソッドを実装していきます。今回は、何も認証処理を実装せず、単にユーザ名をHTTPセッションの属性に設定するだけにします。LoginActionクラスのソースコードを表示し、そのexecute()メソッドを次のように実装します。

  public ActionForward execute(ActionMapping mapping, ActionForm form, 
    HttpServletRequest request, HttpServletResponse response) 
    throws IOException, ServletException
  {
    request.getSession().setAttribute("username", 
      ((LoginForm)form).getUsername());
    return mapping.findForward("success");
  }

再度、Strutsページ・フロー・ダイアグラムに戻ります。先ほどアクションにアクション・フォームを設定したので、[/LoginAction]のアイコンにアクション・フォームを意味する豆 (Bean) のイラストが追加されていることに注意しましょう。

ここから、Velocityのテンプレート・ファイルを追加していきます。右上の[コンポーネント・パレット]の[Struts Page Flow]>[Page Forward]をページ・フロー・ダイアグラムにドラッグ&ドロップします。ページ・フォワードのアイコンの名前の部分をダブルクリックして、名前を適宜変更します。ここでは、[/top]に変更しました。

[/top]のアイコンをダブル・クリックし、[ページの選択または作成]ダイアログで[ページ名]を適切なVMファイル名に指定します。ここでは、[ページ名]を[/top.vm]に変更しました。

JDeveloperは[ページ名]に自動的に拡張子 [.jsp]を追加してしまうので、[top.vm.jsp]というファイルがオープンするはずです。左上の[ナビゲータ]ペインで[top.vm.jsp]を選択し、[ファイル]>[名前の変更]を選択して、[top.vm]という名前を指定します。([ナビゲータ]ペインに[top.vm.jsp]がない場合は、[ファイル]>[<プロジェクト名>.jprに追加]を選択し、[<プロジェクト・ディレクトリ>/public_html/top.vm.jsp]を選択します。)

struts-config.xmlにも、修正が必要です。ページ・フロー・ダイアグラムでページ・フォワード[/top]を選択し、右下の[プロパティ・インスペクタ]を確認すると、[forward]プロパティの値が[/top.vm.jsp]になっているはずです。拡張子 [.jsp]を削除して、[/top.vm]に修正します。下部の[ソース]タブを選択し、struts-config.xmlを直接編集しても構いません。この場合、action要素のforward属性を修正することになります。

アクション[/LoginAction]でバリデーション・エラーが発生したときに、再度[/top.vm]が表示されるよう設定しておきましょう。ページ・フロー・ダイアグラムで、アクション[/LoginAction]にを選択し、右下の[プロパティ・インスペクタ]で、inputプロパティの値を[/top.vm]に設定します。struts-config.xmlを直接編集する場合は、action要素のinput属性を追加することになります。

続いて、Velocityテンプレート・ファイルを編集していきます。[top.vm]の[設計]タブを選択し、右上の[コンポーネント・パレット]の[HTML]以下にあるHTMLコンポーネントなどもうまく使って、HTMLを作成していきます。

今回は、簡単のため[top.vm]の[ソース]タブを選択し、次のテンプレートをコピー&ペーストします。form要素のaction属性、input要素のvalue属性、ページ下部にある#で始まる一連のVTL (Velocity Template Language)に注意しましょう。Velocityの詳細についてはここでは解説しませんので、別途Velocityのドキュメントなどを参照してください。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<title>トップページ</title>
</head>
<body>

<form action="$link.setAction('/LoginAction')">
<table>
<tr>
 <td>ユーザ名</td>
 <td><input type="text" name="username" value="$!form.bean.username"/></td>
</tr>
<tr>
 <td>パスワード</td>
 <td>
  <input type="password" name="password" value="$!form.bean.password"/>
 </td>
</tr>
<tr>
 <td></td>
 <td>
  <input type="submit" value="ログイン"/>
 </td>
</tr>
</table>
</form>

#if($errors.exist())
 #foreach ($e in $errors.getAll())
  <br/>$e 
 #end
#end

</body>
</html>

続いて、LoginAction実行後にフォワードされるVMファイルも作成します。[top.vm]の際の同様に、ページ・フォワード[/result]を作成し、[/result.vm]に関連付け、拡張子[.jsp]を削除する手順を実行します。

[result.vm]を作成していきましょう。今回は、簡単のため次のテンプレートをコピー&ペーストします。ユーザ名を表示するために、VTLの変数 $usernameを使っていることに注意しましょう。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<title>ログイン成功</title>
</head>
<body>
$username さん、こんにちは
</body>
</html>

アクションからのフォワードも追加しましょう。Strutsページ・フロー・ダイアグラムで、右上の[コンポーネント・パレット]の[Struts Page Flow]>[Forward]をクリックし、アクション[/LoginAction]とページ・フォワード[/result]を順次クリックします。フォワード名は、LoginActionクラスのexecute()メソッドに合わせ、デフォルトの[success]のままにします。

この時点で、ページ・フロー・ダイアグラムは次のようになっているはずです。

対応するstruts-config.xmlの内容は、次の通りです。

<?xml version = '1.0' encoding = 'windows-31j'?>
<!DOCTYPE struts-config PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" 
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
  <form-beans>
    <form-bean name="login-form" type="mypackage.LoginForm"/>
  </form-beans>
  <action-mappings>
    <action path="/LoginAction" type="mypackage.LoginAction" name="login-form">
      <forward name="success" path="/result.do"/>
    </action>
    <action path="/top" forward="/top.vm"/>
    <action path="/result" forward="/result.vm"/>
  </action-mappings>
  <message-resources parameter="mypackage.ApplicationResources"/>
</struts-config>

Strutsページ・フロー・ダイアグラムでページ・フォワード[/top]を右クリックし、[実行]を選択します。これにより、軽量なJ2EEコンテナ OC4Jが起動し、WebアプリケーションがOC4Jにデプロイされ、Webブラウザで[/top]のURLがオープンされます。パスワードが8文字未満の場合はエラー・メッセージが表示され、パスワードが8文字以上の場合はログインに成功することを確認しましょう。

JDeveloperであればこのようにWebアプリケーションでも簡単にテストできます。デバッガやここまでご紹介してきたIDEの各種機能 (ページ・フロー・ダイアグラム、HTMLビジュアル・エディタ、プロパティ・インスペクタ、構造ペイン、Unicodeエスケープ変換など)をうまく使えば、Webアプリケーションの開発を効率的に進めていくことができます。

Oarcle JDeveloper 10gによるVelocity-Strutsアプリ開発を簡単にご紹介してきましたが、いかがだったでしょうか? 本稿がJDeveloperを活用した快適なWebアプリ開発を実現できる助けになれば幸いです。