Apache Velocityの紹介

Apache Velocityの概要

1. 概要

Velocityは、Javaベースのテンプレートエンジンです。

これは、MVCアーキテクチャのビューコンポーネントとして使用するように設計されたオープンソースのWebフレームワークであり、JSPなどの既存のテクノロジーに代わるものを提供します。

Velocityを使用して、XMLファイル、SQL、PostScript、および他のほとんどのテキストベースのフォーマットを生成できます。

この記事では、それを使用して動的なWebページを作成する方法を検討します。

2. 速度のしくみ

VelocityのコアクラスはVelocityEngineです。

データモデルと速度テンプレートを使用して、コンテンツの読み取り、解析、生成のプロセス全体を調整します。

簡単に言えば、一般的な速度アプリケーションで必要な手順を次に示します。

  • 速度エンジンを初期化する

  • テンプレートを読む

  • データモデルをコンテキストオブジェクトに配置する

  • テンプレートをコンテキストデータとマージし、ビューをレンダリングします

次の簡単な手順に従うLet’s go through an example

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プロジェクトに次の依存関係を追加する必要があります。


    org.apache.velocity
    velocity
    1.7
    

     org.apache.velocity
     velocity-tools
     2.0

これら両方の依存関係の最新バージョンは、velocityおよびvelocity-toolsにあります。

4. Velocityテンプレート言語

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

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

4.1. 参考文献

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

  • variables – Javaオブジェクトのフィールドから返された#setディレクティブまたは値を使用してページ内で定義されます。

    #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")
  • conditionals#if, #elseifおよび#elseディレクティブは、条件付きチェックに基づいてコンテンツを生成する方法を提供します。

    #if($employee.designation == "Manager")
        

    Manager

    #elseif($employee.designation == "Senior Developer")

    Senior Software Engineer

    #else

    Trainee

    #end
  • loops#foreachディレクティブを使用すると、オブジェクトのコレクションをループできます。

      #foreach($product in $productList)
    • $product
    • #end
  • include#include要素は、ファイルをテンプレートにインポートする機能を提供します。

    #include("one.gif","two.txt","three.html"...)
  • parse#parseステートメントを使用すると、テンプレート設計者はVTLを含む別のローカルファイルをインポートできます。次に、Velocityはコンテンツを解析し、レンダリングします。

    #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)
        
            
            
        
    #end

    このマクロは、テンプレートの任意の場所に#tablerows():として配置できるようになりました。

    #macro(tablerows $color $productList)
        #foreach($product in $productList)
            
                $product.name
            
        #end
    #end

4.3. その他の機能

  • math –テンプレートで使用できるいくつかの組み込み数学関数:

    #set($percent = $number / 100)
    #set($remainder = $dividend % $divisor)
  • range operator#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 products = service.getProducts();
        context.put("products", products);

        return getTemplate("index.vm");
    }
}

6. 設定

6.1. Web設定

次に、web.xmlVelocityViewServletを構成する方法を見てみましょう。

velocity.propertiestoolbox.xmlを含むオプションの初期化パラメーターを指定する必要があります。


    apache-velocity
      //...

    
        velocity
        org.apache.velocity.tools.view.VelocityViewServlet

        
            org.apache.velocity.properties
            /WEB-INF/velocity.properties
        
    
        //...

このサーブレットのマッピングも指定する必要があります。 速度テンプレート(*.vm)に対するすべての要求は、速度サーブレットによって処理される必要があります。


    velocityLayout
    *.vm

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テンプレートは、すべてのビュー生成ロジックが記述される場所です。 これらのページは、Velocity Template Language(VTL)を使用して記述されています。


    ...
    
        
...

$products.size() Products on Sale!


We are proud to offer these fine products at these amazing prices. ... #set( $count = 1 ) #foreach( $product in $products ) #set( $count = $count + 1 ) #end
Serial # Product Name Price
$count) $product.getName() $product.getPrice()

8. ページレイアウトの管理

Velocityは、Velocity Toolベースのアプリケーション用のシンプルなレイアウトコントロールとカスタマイズ可能なエラー画面を提供します。

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

8.1. Web設定

VelocityLayoutServlet.を構成する方法を見てみましょう。サーブレットは速度テンプレートページのリクエストをインターセプトするように定義されており、レイアウト固有のプロパティはvelocity.propertiesファイルで定義されています。


    // ...
    
        velocityLayout
        org.apache.velocity.tools.view.VelocityLayoutServlet

        
            org.apache.velocity.properties
            /WEB-INF/velocity.properties
        
    
    // ...
    
        velocityLayout
        *.vm
    
    // ...

8.2. レイアウトテンプレート

レイアウトテンプレートは、速度ページの一般的な構造を定義します。 デフォルトでは、VelocityLayoutServletはレイアウトフォルダの下でDefault.vmを検索します。 いくつかのプロパティをオーバーライドすると、この場所を変更できます。

tools.view.servlet.layout.directory = layout/
tools.view.servlet.layout.default.template = Default.vm

レイアウトファイルは、ヘッダーテンプレート、フッターテンプレート、および要求された速度ページのコンテンツをレンダリングする速度変数$screen_contentで構成されます。


    
        Velocity
    
    
        
#parse("/fragments/header.vm")
$screen_content
#parse("/fragments/footer.vm")

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ページをレンダリングするための便利なツールであることを学びました。 また、Velocity提供のサーブレットを使用するさまざまな方法を見てきました。

Spring MVChere at exampleを使用したVelocity構成に焦点を当てた記事もあります。

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