Groovyテンプレートエンジン
この記事の参照元は テンプレートエンジン ほとんどのコードは、ドキュメントで直接参照されています。
テンプレートエンジン紹介
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
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ハートビート・エフェクトのためのHTML+CSS
-
HTML ホテル フォームによるフィルタリング
-
HTML+cssのボックスモデル例(円、半円など)「border-radius」使いやすい
-
HTMLテーブルのテーブル分割とマージ(colspan, rowspan)
-
ランダム・ネームドロッパーを実装するためのhtmlサンプルコード
-
Html階層型ボックスシャドウ効果サンプルコード
-
QQの一時的なダイアログボックスをポップアップし、友人を追加せずにオンラインで話す効果を達成する方法
-
sublime / vscodeショートカットHTMLコード生成の実装
-
HTMLページを縮小した後にスクロールバーを表示するサンプルコード
-
html のリストボックス、テキストフィールド、ファイルフィールドのコード例