1. ホーム
  2. groovy

Groovyテンプレートエンジン

2022-02-07 22:02:23
<パス

この記事の参照元は テンプレートエンジン ほとんどのコードは、ドキュメントで直接参照されています。

テンプレートエンジン紹介

Groovy言語にはテンプレート・エンジンの機能があり、様々な形式のファイルを生成することができ、大変便利です。テンプレート・エンジンはいくつかあり、いずれもTemplateインタフェースを実装しているので、以下のようになります。

  • SimpleTemplateEngine - 基本テンプレート
  • StreamingTemplateEngine - SimpleTemplateEngineと同じ機能ですが、64k以上のテンプレートに対応しています。
  • GStringTemplateEngine - 書き込み可能なクロージャとしてテンプレートを保存し、ストリーミングシナリオで有用です。
  • XmlTemplateEngine - XMLファイル書き出し用テンプレートエンジン
  • MarkupTemplateEngine - HTMLなどのテンプレートを生成するために使用できる、完全で最適化されたテンプレートエンジン

SimpleTemplateEngine(シンプルテンプレートエンジン

これは最も安価なテンプレートエンジンで、非常に使いやすい。例として、Groovyのドキュメントを直接見てください。そのテンプレートの構文がJSPタグやEL式に似ていることがわかると思います。

def text = 'Dear "$firstname $lastname",\nSo nice to meet you in <% print city %>. \nSee you in ${
month},\n${signed}'

def binding = ["firstname":"Sam", "lastname":"Pullara", "city":"San Francisco& quot;, "month":"December", "signed":"Groovy-Dev"]

def engine = new groovy.text.SimpleTemplateEngine()
def template = engine.createTemplate(text).make(binding)

def result = 'Dear "Sam Pullara",\nSo nice to meet you in San Francisco.\nSee you in December,\nGroovy-Dev'

StreamingTemplateEngine(ストリーミングテンプレートエンジン

SimpleTemplateEngineと似ていますが、より大きなテキストを扱えることが特徴です。このエンジンは <% %> , <%= %> とGStringの構文があります。以下の例もGroovyのドキュメントから引用しています。

def text = '''\
Dear <% out.print firstname %> ${lastname},

We <% if (accepted) out.print 'are pleased' else out.print 'regret' %> \
to inform you that your paper entitled
'$title' was ${ accepted ? 'accepted' : 'rejected' }.

The conference committee.'''

def template = new groovy.text.StreamingTemplateEngine().createTemplate(text)

def binding = [
    firstname : "Grace",
    lastname : "Hopper",
    accepted : true,
    title : 'Groovy for COBOL programmers'
]

String response = template.make(binding)

assert response == '''Dear Grace Hopper,

We are pleased to inform you that your paper entitled
'Groovy for COBOL programmers' was accepted.

The conference committee.'''

GStringTemplateEngine

まず、テンプレートをファイルとして保存することから始めます。テンプレートの中でprintメソッドを使う代わりに、GStringの仕様に沿ったoutを使っていることに注意してください。

Dear "$firstname $lastname",
So nice to meet you in <% out << (city == "New York" ? "\\\"The Big Apple\\"" : city) %>.
See you in ${month},
${signed}

次に、テンプレートが読み込まれ、与えられた文字列に置き換えられます。

def f = new File('test.template')
def engine = new groovy.text.GStringTemplateEngine()
def template = engine.createTemplate(f).make(binding)
println template.toString()

XmlTemplateEngine

XmlTemplateEngineは、XMLテンプレートを生成するために使用されます。このエンジンは標準的な ${expression} $variable の構文でデータを挿入することができます。また <gsp:scriptlet> <gsp:expression> は、コードスニペットや式を挿入するために使用します。 <>"' これらの記号は、テンプレート処理時にエスケープされます。 gsp: tags 名前空間タグはテンプレート生成時に削除されますが、他の名前空間は削除されません。

以下は、Groovyのドキュメントの例です。

def binding = [firstname: 'Jochen', lastname: 'Theodorou', nickname: 'blackdrag', salutation: 'Dear']
def engine = new groovy.text.
def text = '''\
    http://groovy.codehaus.org/2005/gsp' xmlns:foo='baz' type='letter'>
        <gsp:scriptlet>def greeting = "${salutation}est"</gsp:scriptlet>
        <gsp:expression>greeting</gsp:expression>
        <foo:to>$firstname "$nickname" $lastname</foo:to>
        How are you today?
    </document>
'''
def template = engine.createTemplate(text).make(binding)
println template.toString()

生成結果は以下のようになります。

<document type='letter'>
  Dearest
  <foo:to xmlns:foo='baz'>
    Jochen "blackdrag" Theodorou
  </foo:to>
  How are you today?
</document>

マークアップテンプレートエンジン(MarkupTemplateEngine

はじめに

ようやく本題に入ります。それがこの記事の本当のポイントです。公式ドキュメントでは、これまでの内容はすべての4分の1程度に過ぎません。残りのコンテンツはここにあります。

Groovyマークアップテンプレートエンジンは非常に強力で、Webアプリケーションのビューレイヤーとして完璧に使用することができます。しかし、実際に使ってみてわかったのは、Intellij IDEAが......をサポートしていないことで、まるでメモ帳でコードを書いているような感じで、ちょっと面倒なんです。これが一番の欠点かもしれません。

このマークアップテンプレートエンジンは、主にHTMLなどのXML的なテンプレートを生成するために使用されます。しかし、あらゆるタイプのドキュメントを生成するのにも使えます。これまでのテンプレートはすべて文字列ベースでした。このテンプレートはGroovy DSLをベースにしています(Gradleを勉強した人なら、両者がよく似ていることが理解できると思います)。

まず、視覚的な例から見てみましょう。次のようなテンプレートがあるとします。

xmlDeclaration()
cars {
   cars.each {
       car(make: it.make, model: it.model)
   }
}

モデルデータはこのような感じです。

model = [cars: [new Car(make: 'Peugeot', model: '508'), new Car(make: 'Toyota', model: 'Prius')]]

最終的に生成されたファイルは次のようになります。


Groovyマークアップテンプレートエンジンは、強型化モデルチェック、コードスライスとインポート、国際化などの重要な機能を提供します。

コードの書式とメソッド

マークアップテンプレートは、実は正当なGroovyのコードです。このコードには、実はたくさんのメソッドやクロージャがあるので、いくつ見分けられるか見てみましょう。実際、これだけGroovyの記事を読んでいれば、どれがメソッドでどれがパラメータなのか、簡単に推測できるはずです。

yieldUnescaped ''                                                    
html(lang:'en') {                                                                   
    head {                                                                          
        meta('http-equiv':'"Content-Type" content="text/html; charset=utf-8"')      
        title('My page')                                                            
    }                                                                               
    body {                                                                          
        p('This is an example of HTML contents')                                    
    }                                                                               
}  

くだらない話はもういい。一般的な手法の話をしよう。

  • yieldUnescapedメソッドは、与えられたステートメントを、その中の文字をエスケープせずに直接出力します。
  • yieldメソッドは、上記とは逆に特殊文字をエスケープします。
  • は、その
  • head これらの HTML タグメソッドは、対応するタグを生成します。
  • xmlDeclaration() メソッドは、標準的な XML 文書のヘッダを生成する。
  • commentメソッドは、HTMLコメントを生成します。
  • その
  • newLineは新しい行を生成する。

を含んでいます。

テンプレートは、他のテンプレートを含むこともできます。ここでは3種類のインクルードを紹介します。それぞれ別のテンプレート、エスケープする必要のないテキスト、またはエスケープする必要のあるテキストを含んでいます。

include template: 'other_template.tpl'
include unescaped: 'raw.txt'
include escaped: 'to_be_escaped.txt'

また、同等のGroovyメソッドもいくつかあり、主にテンプレートファイルが動的である場合に便利です。

includeGroovy(
) 
includeEscaped(
)
includeUnescaped(
)

レイアウト

レイアウトファイルを書くことができます。レイアウトファイルやその他のGroovyテンプレートファイルには、接尾辞として tpl . 私も最初はそれを知らず、結局ビューファイルが見つからずに時間を費やしてしまいました。例えば、以下のようなファイルを書きます。

html {
    head {
        title(title)                
    }
    body {
        bodyContents()              
    }
}

Groovyテンプレートエンジンは、レイアウトファイルと実際のレイアウトを組み合わせて、最終的なレイアウトを作成します。

layout 'layout-main.tpl',                                   
    title: 'Layout example',                                
    bodyContents: contents { p('This is the body') }  

テンプレートエンジンの使用

使い方は、他のテンプレートエンジンと同様です。どちらもエンジンのインスタンスを作成し、テンプレートファイルとデータを渡します。マークアップ・テンプレート・エンジンでは、さらに設定オブジェクトが必要です。

TemplateConfiguration config = new TemplateConfiguration();         
MarkupTemplateEngine engine = new MarkupTemplateEngine(config);     
Template template = engine.createTemplate("p('test template')");    
Map<String, Object> model = new HashMap<>();                        
Writable output = template.make(model);                             
output.writeTo(writer);  

デフォルトでは、生成されたテンプレートは部分行で、制作環境には適していますが、人間が読むには適していません。結果をより読みやすくするために、設定を変更することができます。以下の設定は、インデントと改行をオンにします。他の設定については、適切なドキュメントを参照してください。

config.setAutoNewLine(true);
config.setAutoIndent(true);

国際化

プログラムを国際化するために、各テンプレートファイルの異なる地域バージョンを作成することができます。例えば、元のファイルが file.tpl とすると、フランス語版のファイルは file_fr_FR.tpl で、英語版は file_en_US.tpl . テンプレート設定オブジェクトの作成時に Locale オブジェクトを作成し、デフォルトのロケールとして使用します。

強い型宣言

Groovyのテンプレートの型は実行時に解決されますが、テンプレートの実行を速くするために、手動でデータ型を宣言することもできます。例えば modelTypes を使用して、使用するモデルを宣言します。

modelTypes = {                          
    List<Page> pages                    
pages }

pages.each { page ->
    p("Page title: $page.title")
    p(page.text)
}

Springとの統合

SpringはGroovyのマークアップテンプレートをサポートしています。クラスパスにGroovy関連のクラスが存在する限り、Groovyマークアップテンプレートを使用するように設定することができる。

まず、Groovyの依存関係を追加します。以下は、Gradleの依存関係の設定です。

compile 'org.codehaus.groovy:groovy-all:2.4.9'

次に、Springの設定ファイルに以下の設定を追加します。

After that, write the configured template path under
*.tpl
formatted template file, it will be ready for Spring to parse properly.
*.tpl