Apache Velocityの紹介
1概要
Velocity
は、Javaベースのテンプレートエンジンです。
これは、MVCアーキテクチャのビューコンポーネントとして使用するように設計されたオープンソースのWebフレームワークであり、JSPなどの既存のテクノロジの代替手段となります。
VelocityはXMLファイル、SQL、PostScriptそして他のほとんどのテキストベースのフォーマットを生成するために使うことができます。
この記事では、動的Webページを作成するためにそれをどのように使用できるかを探ります。
2ベロシティの仕組み
-
Velocityのコアクラスは
VelocityEngine
です。
データモデルとベロシティテンプレートを使用してコンテンツの読み取り、解析、生成の全プロセスを調整します。
簡単に言えば、ここに私達があらゆる典型的な速度の適用のために従う必要があるステップがあります:
-
ベロシティエンジンを初期化する
-
テンプレートを読む
-
データモデルをコンテキストオブジェクトに入れる
-
テンプレートとコンテキストデータをマージしてビューをレンダリングする
-
これらの簡単な手順に従って、例を見てみましょう。
VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.init();
Template t = velocityEngine.getTemplate("index.vm");
VelocityContext context = new VelocityContext();
context.put("name", "World");
StringWriter writer = new StringWriter();
t.merge( context, writer );
3 Mavenの依存関係
Velocityを使用するには、Mavenプロジェクトに次の依存関係を追加する必要があります。
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-tools</artifactId>
<version>2.0</version>
</dependency>
これら両方の依存関係の最新バージョンは、ここにあります。
velocity
およびhttps://検索。 maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.apache.velocity%22%20AND%20a%3A%22velocity-tools%22[velocity-tools]。
4速度テンプレート言語
Velocity Template Language(VTL)は、VTL参照を使用して動的コンテンツをWebページに組み込む最も簡単でわかりやすい方法です。
ベロシティテンプレート内のVTL参照は
$
で始まり、その参照に関連付けられている値を取得するために使用されます。 VTLは、Javaコードの出力を操作するために使用できる一連のディレクティブも提供します。これらの指令は
#.
で始まります。
4.1. 参考文献
Velocityには、変数、プロパティ、メソッドの3種類の参照があります。
-
変数
–
#set
ディレクティブまたは値を使用してページ内で定義
Javaオブジェクトのフィールドから返されます。
#set ($message="Hello World")
-
properties
– オブジェクト内のフィールドを参照します。彼らはまた参照することができます
プロパティの
getter
メソッドに:
$customer.name
-
methods
– Javaオブジェクトのメソッドを参照してください。
$customer.getName()
すべての参照から得られる最終値は、最終出力にレンダリングされるときに文字列に変換されます。
4.2. 指令
VTLは豊富なディレクティブを提供します。
-
set
– 参照の値を設定するために使用できます。この
値は変数またはプロパティ参照に代入できます。
#set ($message = "Hello World") #set ($customer.name = "Brian Mcdonald")
-
条件
–
#if、#elseif
および
#else
ディレクティブは方法を提供
条件付きチェックに基づいてコンテンツを生成します。
#if($employee.designation == "Manager") <h3> Manager </h3> #elseif($employee.designation == "Senior Developer") <h3> Senior Software Engineer </h3> #else <h3> Trainee </h3> #end
-
loops
–
#foreach
ディレクティブを使用すると、一連の
オブジェクト:
<ul> #foreach($product in $productList) <li> $product </li> #end </ul>
-
include
–
#include
要素はファイルをインポートする機能を提供します
テンプレートに:
+[ソース、テキスト、溝:、true]
#include("one.gif","two.txt","three.html"...)
-
parse
–
#parse
ステートメントを使用すると、テンプレートデザイナーはインポートできます
VTLを含む別のローカルファイル。そしてVelocityはコンテンツを解析してレンダリングします。
+[ソース、テキスト、溝:、true]
#parse (Template)
-
evaluate
–
#evaluate
ディレクティブを使用してVTLを評価できます
動的に。これにより、テンプレートはレンダリング時に
String
を評価できます。たとえば、テンプレートを国際化します。
#set($firstName = "David") #set($lastName = "Johnson") #set($dynamicsource = "$firstName$lastName") #evaluate($dynamicsource)
-
break
–
#break
ディレクティブは現在のそれ以上のレンダリングを停止します
実行範囲(例:
#foreach
、
#parse
)
stop ** –
#stop
ディレクティブはそれ以上のレンダリングと実行を停止します
テンプレートの
-
velocimacros
–
#macro
命令はテンプレートデザイナーに許可します
VTLの繰り返しセグメントを定義します。
#macro(tablerows) <tr> <td> </td> </tr> #end
このマクロは、テンプレート内の任意の場所に配置できます。
#
tablerows():
[ソース、HTML、ガター:、true]
#macro(tablerows $color $productList) #foreach($product in $productList) <tr> <td bgcolor=$color>$product.name</td> </tr> #end #end
4.3. その他の機能
-
数学
– 使用可能な一握りの組み込み数学関数
テンプレート内:
#set($percent = $number/100) #set($remainder = $dividend % $divisor)
-
範囲演算子
–
#set
と組み合わせて使用できます
#foreach:
[ソース、テキスト、溝:、true]
#set($array =[0..10]) #foreach($elem in $arr) $elem #end
5速度サーブレット
Velocity Engineの主な仕事はテンプレートに基づいてコンテンツを生成することです。
エンジン自体には、Web関連の機能は含まれていません。 Webアプリケーションを実装するには、サーブレットまたはサーブレットベースのフレームワークを使用する必要があります。
Velocityはすぐに使える実装
VelocityViewServlet
を提供します。これはvelocity-toolsサブプロジェクトの一部です。
VelocityViewServletが提供する組み込み機能を利用するために、
VelocityViewServlet
からサーブレットを拡張し、
handleRequest()__メソッドをオーバーライドすることができます。
public class ProductServlet extends VelocityViewServlet {
ProductService service = new ProductService();
@Override
public Template handleRequest(
HttpServletRequest request,
HttpServletResponse response,
Context context) throws Exception {
List<Product> products = service.getProducts();
context.put("products", products);
return getTemplate("index.vm");
}
}
6. 構成
6.1. Web設定
web.xml
で
VelocityViewServlet
を設定する方法を見てみましょう。
velocity.properties
と
toolbox.xml
を含むオプションの初期化パラメータを指定する必要があります。
<web-app>
<display-name>apache-velocity</display-name>
//...
<servlet>
<servlet-name>velocity</servlet-name>
<servlet-class>org.apache.velocity.tools.view.VelocityViewServlet</servlet-class>
<init-param>
<param-name>org.apache.velocity.properties</param-name>
<param-value>/WEB-INF/velocity.properties</param-value>
</init-param>
</servlet>
//...
</web-app>
このサーブレットのマッピングも指定する必要があります。速度テンプレート(
** 。vm
)に対するすべての要求は、速度サーブレットによって処理される必要があります。
<servlet-mapping>
<servlet-name>velocityLayout</servlet-name>
<url-pattern>** .vm</url-pattern>
</servlet-mapping>
6.2. リソースローダ
Velocityは柔軟なリソースローダーシステムを提供します。これにより、1つ以上のリソースローダーを同時に動作させることができます。
-
FileResourceLoader
-
JarResourceLoader
-
ClassPathResourceLoader
-
URLResourceLoader
-
DataSourceResourceLoader
-
WebappResourceLoader
これらのリソースローダーは
velocity.properties:
に設定されています。
resource.loader=webapp
webapp.resource.loader.class=org.apache.velocity.tools.view.WebappResourceLoader
webapp.resource.loader.path =
webapp.resource.loader.cache = true
7. 速度テンプレート
速度テンプレートは、すべてのビュー生成ロジックが書かれている場所です。これらのページはVelocity Template Language(VTL)を使って書かれています。
<html>
...
<body>
<center>
...
<h2>$products.size() Products on Sale!</h2>
<br/>
We are proud to offer these fine products
at these amazing prices.
...
#set( $count = 1 )
<table class="gridtable">
<tr>
<th>Serial #</th>
<th>Product Name</th>
<th>Price</th>
</tr>
#foreach( $product in $products )
<tr>
<td>$count)</td>
<td>$product.getName()</td>
<td>$product.getPrice()</td>
</tr>
#set( $count = $count + 1 )
#end
</table>
<br/>
</center>
</body>
</html>
8ページレイアウトの管理
VelocityはVelocityツールベースのアプリケーションのためのシンプルなレイアウトコントロールとカスタマイズ可能なエラースクリーンを提供します。
VelocityLayoutServlet
はこの機能をカプセル化して、指定されたレイアウトをレンダリングします。
VelocityLayoutServlet
は、__VelocityViewServletの拡張です。
8.1. Web設定
VelocityLayoutServletの設定方法を見てみましょう。サーブレットはベロシティテンプレートページのリクエストをインターセプトするために定義され、レイアウト固有のプロパティは
velocity.properties__ファイルで定義されます。
<web-app>
//...
<servlet>
<servlet-name>velocityLayout</servlet-name>
<servlet-class>org.apache.velocity.tools.view.VelocityLayoutServlet</servlet-class>
<init-param>
<param-name>org.apache.velocity.properties</param-name>
<param-value>/WEB-INF/velocity.properties</param-value>
</init-param>
</servlet>
//...
<servlet-mapping>
<servlet-name>velocityLayout</servlet-name>
<url-pattern>** .vm</url-pattern>
</servlet-mapping>
//...
</web-app>
8.2. レイアウトテンプレート
レイアウトテンプレートは、ベロシティページの一般的な構造を定義します。デフォルトでは、
VelocityLayoutServlet
はレイアウトフォルダの下で
Default.vm
を検索します。いくつかのプロパティを上書きすると、この場所が変更される可能性があります。
tools.view.servlet.layout.directory = layout/tools.view.servlet.layout.default.template = Default.vm
レイアウトファイルは、ヘッダーテンプレート、フッターテンプレート、および速度変数
$ screen
content__で構成され、要求された速度ページの内容をレンダリングします。
<html>
<head>
<title>Velocity</title>
</head>
<body>
<div>
#parse("/fragments/header.vm")
</div>
<div>
<!-- View index.vm is inserted here -->
$screen__content
</div>
<div>
#parse("/fragments/footer.vm")
</div>
</body>
</html>
8.3. 依頼画面でのレイアウト指定
特定の画面のレイアウトは、ページの先頭にある速度変数として定義できます。これは、この行をページに入れることによって行われます。
#set($layout = "MyOtherLayout.vm")
8.4. リクエストパラメータでのレイアウト指定
クエリ文字列
layout = MyOtherLayout.vm
にリクエストパラメータを追加すると、VLSがそれを見つけてデフォルトレイアウトを検索する代わりにそのレイアウト内に画面をレンダリングします。
8.5. エラー画面
カスタマイズされたエラー画面はベロシティレイアウトを使用して実装することができます。
VelocityLayoutServlet
は、例外の詳細を表すために2つの変数
$ error
cause
と
$ stack
trace
を提供します。
エラーページはvelocity.propertiesファイルで設定できます。
tools.view.servlet.error.template = Error.vm
9結論
この記事では、Velocityが動的Webページをレンダリングするための便利なツールであることを学びました。また、速度指定サーブレットの使用方法もさまざまです。
-
Spring MVCリンクを使ったVelocity設定に焦点を当てた記事もあります:/spring-mvc-with-velocity[ここではBaeldung]。
このチュートリアルの完全なコードはhttps://github.com/eugenp/tutorials/tree/master/apache-velocity[GitHubで利用可能]です。