連載
» 2004年11月29日 10時00分 UPDATE

JavaTips 〜Apache/Jakarta編:Strutsでプレゼンテーション部分にVelocityを使う

[佐藤匡剛,@IT]

 Strutsフレームワークを導入する利点の1つに、Webアプリケーションのプレゼンテーション部分(JSPなど)とコントローラ部分(Actionクラス)とが、自然と疎結合になる、ということがあります。すなわち、プレゼンテーション部分もコントローラ部分も、互いに依存することなく、独立したコンポーネントとしてそれぞれ実装することができるのです。これによって例えば、システムのほかの部分を一切いじらずに、プレゼンテーション部分だけを丸ごと入れ替える、といったことが可能になります。

 さて、Strutsのプレゼンテーション部分を実装するには、JSPを用いるのが一般的ですが、それ以外の技術を利用することもできます。ここでは、JSPの代替案として利用されることの多い、Apache Jakartaのテンプレート・エンジンVelocityをプレゼンテーション部分に利用するための手順を紹介します。

 Velocityは、Javaベースの汎用テンプレート・エンジンです。テンプレート・エンジンとは、あらかじめ作っておいたテンプレートに、実行時にパラメータへ値を割り当てて、データを生成してくれるコンポーネントのことです。用途はHTMLに限らず、XMLやCSV、テキストなどさまざまなデータ形式の生成に利用できます。

 Velocityを採用する利点としては、シンプルで習得の容易なテンプレート記述言語VTL(Velocity Template Language)によって、簡単に動的ページを記述できることがあります。開発環境にEclipseをお使いであれば、Velocityプラグインを使って、テンプレートのアウトライン表示や入力補完ができるので便利でしょう。

注:本稿では、Strutsがすでに動作していることを前提に説明します。Strutsのインストールと動作設定については、「サーバサイド技術の学び舎 - WINGS」にある「サーバサイド環境構築設定」を参照してください。

Velocityの導入方法

 Struts上でVelocityを動かすには、Velocityのサブ・プロジェクトであるVelocity Toolsを利用します。導入のステップは、以下のとおりです。

  1. velocity-tools-x.x.jar、velocity-dep-x.x.x.jarを、Webアプリケーションのルート配下の「WEB-INF\lib」フォルダに入れる(xはバージョン番号)
  2. web.xmlにVelocityViewServletを配備し、「.vm」拡張子のリクエストとの関連付けを行う(注)
  3. Velocity設定ファイルvelocity.propertiesを用意する
  4. Velocity道具箱設定ファイルvelocity-toolbox.xmlを用意する

注:Velocityテンプレートの拡張子は、通常「.vm」になります。

 まずは、以下のURLより、Velocity Toolsのバイナリ(velocity-tools-x.x.jarまたはvelocity-tools-x.x.tar.gz)をダウンロードしてください。

(1)必要なjarファイルをクラスパスへ追加

 上記バイナリを解凍してできたフォルダvelocity-tools-x.xを、以降「%VELOCITY%」と呼ぶことにします。まずは、必要なjarファイルをクラスパスへ通します。「%VELOCITY%\lib」フォルダ配下にある、velcity-tools-x.x.jarとvelocity-dep-x.x.x.jarとを、Webアプリケーション・ルート配下の「WEB-INF\lib」フォルダにコピーしてください。

(2)web.xmlへVelocityViewServletを配備

 続いて、Webアプリケーションのweb.xmlへVelocityViewServletサーブレットを配備します。このサーブレットは、VelocityテンプレートへのリクエストをVelocityエンジンに処理させるためのものです。web.xmlへ、以下の記述を追記します。

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/
j2ee/web-app_2_4.xsd" version="2.4">
……中略……
<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>10</load-on-startup>
</servlet>
……中略……
<servlet-mapping>
<servlet-name>velocity</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
……中略……
</web-app>

 初期化パラメータについてですが、「org.apache.velocity.toolbox」パラメータには、Velocity道具箱(後述)の設定ファイルの場所を指定します。「org.apache.velocity.properties」パラメータには、Velocity設定ファイルの場所(後述)を指定します。

(3)Velocity設定ファイルの用意

 次に、Velocity設定ファイルvelocity.propertiesを用意します。これは、Velocityエンジンの動作を制御するための設定ファイルですが、これを用意しなくても、Velocityエンジンはデフォルトの設定で動作します。ファイルの設置場所は、上のweb.xmlで指定した場所(「/WEB-INF/velocity.properties」)です。

velocity.properties
runtime.log=velocity.log
runtime.log.logsystem.class=org.apache.velocity.runtime.
log.AvalonLogSystem
input.encoding=Windows-31J
output.encoding=Windows-31J

 Velocityで設定可能なプロパティは多岐にわたるので、ここですべてを紹介することはできません。また、設定されていないプロパティについては、デフォルト値が採用されるので、必要なプロパティを設定するだけで大丈夫です。ここでは、ログの出力ファイル名(runtime.logプロパティ)、ログ・システムの実装クラス(runtime.log.logsystem.classプロパティ)、入力されるテンプレートの文字エンコード(input.encodingプロパティ)、出力される結果の文字コード(output.encodingプロパティ)を設定しておきます。

 設定可能なすべてのプロパティを知りたければ、公式サイトにある「Developer's Guide」の「10. Velocity Configuration Keys and Values」を参照してください。

(4)Velocity道具箱設定ファイルの用意

 最後に、Velocity道具箱設定ファイルvelocity-toolbox.xml(注)を用意し、web.xmlで指定した場所(「/WEB-INF/velocity-toolbox.xml」)へ設置します。この設定ファイルは、すべてのテンプレートで暗黙に利用できる、プリミティブ値やオブジェクトの入った変数を、登録しておくためのものです。そのため、この設定ファイルは「道具箱」と呼ばれるのです。

注:公式サイトでは、toolbox.xmlというファイル名で扱われています。しかし、WEB-INFフォルダ以下に置かれる各種の設定ファイルは、フレームワークやコンポーネントを利用することで増えていく傾向にあり、メンテナンスが難しくなります。そのため、どの設定ファイルがどのフレームワークやコンポーネントに属するものかを、分かりやすくしておくことは重要です。本稿では、Velocity道具箱設定ファイルを、velocity-toolbox.xmlと命名することを推奨します。

velocity-toolbox.xml
<?xml version="1.0"?>
<toolbox>
<data type="number">
<key>version</key>
<value>1.1</value>
</data>
<tool>
<key>date</key>
<scope>application</scope>
<class>org.apache.velocity.tools.generic.DateTool</class>
</tool>
</toolbox>

 上のサンプルでは、数値型のプリミティブ値versionと、日付ツールDateToolのオブジェクトdateとを登録しています。これらは、テンプレート中で「$version」「$date」などと書くことで、アクセスできるようになります。

 velocity-toolbox.xmlで記述される要素とその説明を以下の表にまとめます。

要素 親要素 説明
<toolbox> - 文書ルート
<data> <toolbox> 数値/真偽値/文字列などのデータの登録。type属性に、number/boolean/stringのいずれかを指定
<tool> <toolbox> オブジェクトの登録
<key> <data>、<tool> テンプレートで参照するための変数名
<value> <data> データの値
<class> <tool> オブジェクトのクラス
<scope> <tool> オブジェクトの生存期間。application/session/requestのいずれかを指定可能

 以上で設定は完了です。

サンプル実行

 以下のサンプル・テンプレートをWebアプリケーション・ルート直下に置き、ブラウザからアクセスしてみましょう。

sample.vm
<html>
<body>
#set($message = "Velocityが動作しています。")
$message<br>
Velocityのバージョン: $version<br>
$date
</body>
</html>

 以下のような表示が得られれば、Velocityは正常に動作しています。

サンプル実行結果

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。