The Jakarta Project < Tools - View >

Velocity Tools

VelocityView

VelocityView Tools

その他のサブプロジェクト

概要
       

VelocityView は Velocity テンプレートをビューレイヤとして使用する Web アプリケーションを迅速かつ簡潔に構築するためのサポートを提供します。 このプロジェクトは Pull-MVC Model を念頭において設計され、 コントローラとして振舞う Web アプリケーションフレームワーク (例: Struts) と連携して動作します。 また、単独でも動作しますので、シンプルなアプリケーションの作成にも使うことができます。

主な機能:

  • VelocityViewServlet クラス - Velocity テンプレートをレンダリングするスタンドアロンのサーブレットです。 これは Web クライアントからの直接リクエストがあったとき、 または他のサーブレットからフォワードされたときに、 JSP ファイルが JSPServlet によってレンダリングされるのと同じように起動されます。
  • HttpServletRequest、HttpSession、ServletContext とそれらの属性は自動的にテンプレートから利用可能となります。
  • ツールも toolbox 設定ファイルにより、 テンプレートから利用可能です。
  • Web アプリケーションの開発に役立つ拡張可能なツールがいくつか提供されています。
  • Web アプリケーションのログ基盤へロギングすることができます。 (デフォルトはサーブレット API で提供されているロギング機構)。

VelocityViewServlet を使用することで、 特定のビューテクノロジに依存しない Web アプリケーションを作成することが可能になります。 Web アプリケーションでのビューレイヤテクノロジとして JSP ページ、 Velocity テンプレート間のストレートな移行を可能にします。

一般的なアプリケーションの適用ケースとしては、 サーブレットベースの Web アプリケーションフレームワークの、 ビュー表示のためのレイヤを提供することです。 VelocityStruts サブプロジェクトは Velocity テンプレートを Struts アプリケーションフレームワーク上で利用するアプローチを使用しています

インストール
       

*.vm (Velocity テンプレート) ファイルのリクエストをすべて拾うように、 VelocityViewServlet をサーブレットコンテナへインストールする必要があります。 追加しなければならない設定ファイルは2つだけです。 詳細は以下を参照してください。


サーブレットのセットアップ
       

サーブレットの設定 (web.xml) には、表示処理を実行する Velocity ベースのサーブレットへの参照を含めるよう変更しなければなりません。 全ての *.vm ファイルはこのサーブレットへマッピングされます。 このサーブレットにより、Request, Session, Application スコープ、 さらに toolbox.xml ファイルで指定されているツール群が 'context' へ設定されます。 このサーブレットはテンプレートを表示するためにこのコンテキストのデータと、 Velocity エンジンを使用します。


注: 機能追加はこのサーブレットをサブクラス化することで実現でき、 このことについては VelocityLayoutServlet でさらに言及します。

web.xml

<!-- 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/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>

<!-- *.vm ファイルを Velocity にマッピングする -->
<servlet-mapping>
  <servlet-name>velocity</servlet-name>
  <url-pattern>*.vm</url-pattern>
</servlet-mapping>
Velocityの設定
       

Velocity の設定は 任意 であり、 多くのアプリケーションではデフォルト設定で動作します。 velocity.properties ファイルはロギング、 エンコーディング、マクロの設定を含みます。

デフォルトの設定では、 'グローバル' な Velocimacro テンプレートの配置情報が指定されています。 このファイルには全てのテンプレートから利用できるマクロが含まれます。

この設定ファイルの場所は web.xml で指定します。 また、このファイルは WEB-INF ディレクトリの中に配置するのが良いでしょう。 サンプルの設定ファイルは配布物に含まれています。

Velocity の設定についての詳細は Velocity ユーザガイド を参照してください。

  velocimacro.library = /WEB-INF/VM_global_library.vm
  velocimacro.permissions.allow.inline = true
  velocimacro.permissions.allow.inline.to.replace.global = false
  velocimacro.permissions.allow.inline.local.scope = false  
  velocimacro.context.localscope = false

Toolboxの設定
       

サンプルのツールボックスファイル、 WEB-INF/toolbox.xml では、 使用するクラスを好きな名前にマップしています。 これは言うほど難しいものではありません。

友達のジョンに道具箱(toolbox)から 'レンチ' を取り出してもらうことについて考えてみます。 ジョンはどの種類のレンチ (メトリック、パイプ、三日月) が必要なのか、ということだけを知っている必要があります。 レンチをどのように使うかどうかは、彼は知る必要はありません。

Velocity のツールボックスも同じです。 ツールが割り当てられてる名前を指定するだけで、 Velocity エンジンが全ての public メソッドをテンプレートから利用可能にしてくれます。 例えばこのような定義を行うことで、テンプレートで $wrench.getSize() または $wrench.size という呼び出しが可能となります。

PipeWrench.java

public class PipeWrench {
  public String getSize() {
	return "でかいパイプレンチ!";
  }
} 

toolbox.xml

<?xml version="1.0"?>
<toolbox>
  <tool>
     <key>wrench</key>
     <class>PipeWrench</class>
  </tool>
</toolbox>

Tool のスコープ

ツールボックスのサポートは VelocityViewServlet に組み込まれており、 さらにサーブレット環境でのスコープの指定もサポートされています。 ツールは リクエスト, セッション, アプリケーション スコープに配置されます。

ツールに設定したスコープにより、ツールのライフサイクルと、ツールが ViewTool を実装している場合に init(Object) メソッドにどのデータが渡されるかが決定されます:

  • アプリケーション スコープのツールは、 一回のみインスタンス化され、全てのリクエストに対し再利用されます。当然、 アプリケーションスコープのツールはスレッドセーフである必要があります。 GenericTools の MathTool がアプリケーションスコープのツールの良い例です。 アプリケーションスコープのツールが ViewTool を実装している場合、 インスタンス化された後に Web アプリケーションの javax.servlet.ServletContext が init(Object) メソッドへ渡されます。
  • セッション スコープのツールは一つのセッションにつき 一回インスタンス化され、 同一セッションを持つリクエストに対して再利用されます。 セッションスコープのツールが ViewTool を実装している場合、 セッション作成時にリクエストの ViewContextinit(Object) メソッドへ渡されます。
  • リクエスト はデフォルトのスコープとなります。 toolbox.xml の <tool> にスコープが指定されていない場合、 自動的に リクエスト スコープへセットされます。 このスコープのツールは VelocityViewServlet へリクエストが届くたびにインスタンス化されます。 リクエストスコープのツールが ViewTool を実装している場合、 現在のリクエストの ViewContext が init(Object) メソッドへ渡されます。

ツールのスコープは toolbox.xml にこのように <scope> 要素を追加することによって指定することができます:

<tool>
   <key>math</key>
   <scope>application</scope>
   <class>org.apache.velocity.tools.generic.MathTool</class>
</tool>

Java のクラスを ツールとして自動的にテンプレートへ提供することに加え、 ツールボックスでは任意の String や boolean 、 数値を指定しテンプレートへ提供することが可能です。 フォーマットを以下に示します:

<?xml version="1.0"?>
<toolbox>
  <data type="number">
     <key>app_version</key>
     <value>0.9</value>
  </data>
  <data type="string">
     <key>app_name</key>
     <value>ジョンのツールショップ</value>
  </data>
  <data type="boolean">
     <key>debug</key>
     <value>true</value>
  </data>
</toolbox>

テンプレートでは、ツールやデータは指定されたキー (例: $app_version, $app_name, $debug) によってアクセスすることができます。


VelocityLayoutServlet
       

Nathan Bubna 氏によって書かれた VelocityViewServlet の拡張実装が VelocityLayoutServlet です。 このサーブレットは共通のレイアウトをアプリケーションの Web ページに適用するため、2段階の表示処理を行います。

Struts の "template" タグライブラリは同じようなことを行いますが、 どのレイアウトファイルを使い、どの .jsp ファイルを表示するかを 別のファイルに定義する必要があります。 VelocityLayoutServlet はよりシンプルなアプローチです。 VelocityLayoutServlet は最初に呼び出されたメインのテンプレート (例: showDetails.vm) の表示内容を、専用の変数 (例: $screen_content) へ格納します。 そして次に、レイアウトファイルをロードするのです。 そして、メインテンプレートで変数が追加設定もしくは変更された、 既存のデータをレイアウトテンプレートの表示に使用します。

VelocityLayoutServletは更にテンプレート処理中に例外が発生した場合、 'エラー'テンプレートを表示するように指定することができます。 これにより、カスタマイズされたエラー画面を提供することができ、 よりユーザフレンドリーなアプリケーションを作成できます。

詳細なドキュメントはこちら: VelocityLayoutServlet


       

ビューツールの自動ロード、 VelocityViewServlet の使い方を説明する シンプルなサンプルアプリケーションが含まれています。

この例の実行には Tomcat 4.X (注: Tomcat 3.x でも恐らく動作します) またはそれに相当するサーブレットコンテナが必要です。

ビルドの段階で自動的にデプロイ可能な simple.war が examples サブディレクトリに生成されます。 この simple.war ファイルをサーブレットコンテナの Web アプリケーションディレクトリへデプロイ (コピー) し、 コンテナを再起動してください。 そして、次の URL を Web ブラウザで開きましょう:

http://<your_server>:<port>/simple/


既知の問題点
       

既知の問題点はありません!



[訳注: この文書は Shinobu Kawai 木村 貴由 が翻訳しました。 日本語訳に対するコメントがあれば、report@jajakarta.orgに送って下さい。]
Copyright © 1999-2003, Apache Software Foundation