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で利用可能]です。