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およびvelocity-toolsにあります。

4. 速度テンプレート言語

Velocity Template Language(VTL)は、VTL参照を使用して、動的コンテンツをWebページに組み込む最も簡単でクリーンな方法を提供します。

速度テンプレートのVTL参照は、 $ で始まり、その参照に関連付けられた値を取得するために使用されます。 VTLは、Javaコードの出力を操作するために使用できる一連のディレクティブも提供します。 それらのディレクティブはで始まります #。

4.1. 参考文献

Velocityには、変数、プロパティ、メソッドの3種類の参照があります。

  • 変数 #set ディレクティブまたはJavaオブジェクトのフィールドから返された値を使用してページ内で定義されます:
    #set ($message="Hello World")
  • プロパティ–オブジェクト内のフィールドを参照します。 また、プロパティの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 要素は、ファイルをテンプレートにインポートする機能を提供します。
    #include("one.gif","two.txt","three.html"...)
  • parse #parse ステートメントを使用すると、テンプレート設計者はVTLを含む別のローカルファイルをインポートできます。 次に、Velocityはコンテンツを解析し、レンダリングします。
    #parse (Template)
  • Evaluation #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():として配置できるようになりました。

    #macro(tablerows $color $productList)
        #foreach($product in $productList)
            <tr>
                <td bgcolor=$color>$product.name</td>
            </tr>
        #end
    #end

4.3. その他の機能

  • math –テンプレートで使用できるいくつかの組み込み数学関数:
    #set($percent = $number / 100)
    #set($remainder = $dividend % $divisor)
  • 範囲演算子 #setおよび#foreach:と組み合わせて使用できます
    #set($array = [0..10])
    
    #foreach($elem in $arr)
        $elem
    #end

5. Velocityサーブレット

Velocity Engineの主な仕事は、テンプレートに基づいてコンテンツを生成することです。

エンジン自体には、Web関連の機能は含まれていません。 Webアプリケーションを実装するには、サーブレットまたはサーブレットベースのフレームワークを使用する必要があります。

Velocityは、velocity-toolsサブプロジェクトの一部である、すぐに使用できる実装VelocityViewServletを提供します。

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.xmlVelocityViewServletを構成する方法を見てみましょう。

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テンプレートは、すべてのビュー生成ロジックが記述されている場所です。 これらのページは、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は、VelocityToolベースのアプリケーションにシンプルなレイアウトコントロールとカスタマイズ可能なエラー画面を提供します。

VelocityLayoutServlet は、この機能をカプセル化して、指定されたレイアウトをレンダリングします。 VelocityLayoutServlet の拡張機能です VelocityViewServlet。

8.1. Web構成

設定する方法を見てみましょう VelocityLayoutServlet。 サーブレットは、速度テンプレートページのリクエストをインターセプトするために定義されており、レイアウト固有のプロパティは次のように定義されています。 speed.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ページをレンダリングするための便利なツールである方法を学びました。 また、ベロシティが提供するサーブレットを使用するさまざまな方法を見てきました。

また、ここBaeldungにSpringMVCを使用したVelocity構成に焦点を当てた記事があります。

このチュートリアルの完全なコードは、GitHubから入手できます。