Thymeleafについて何か書こっかなと思ったので、TemplateEngineオブジェクトについて書いてみます。初Qiita!
Javadoc
Thymeleafって結構コーディング規約とかしっかりしてて、ソース読んでて楽しいです。Javadocもしっかり書かれているので、今日はこのJavadocを見ていこうと思います。
TemplateEngine (thymeleaf 2.1.3.RELEASE API)
テンプレートエンジンの初期化
デフォルトコンストラクタで生成します。インスタンスの生成と初期化はコストが高いのでテンプレート処理の度に生成するんじゃなくて、1インスタンスだけ作って処理した方がいいよ。って。
final TemplateEngine templateEngine = new TemplateEngine();
設定
TemplateEngineのインスタンスに色々と設定をするのですが以下のものが設定できます。
テンプレートリゾルバーは必須で、それ以外は任意です。
- (必須)テンプレートリゾルバー
- (任意)ダイアレクト
- (任意)メッセージリゾルバー
- (任意)テンプレートモードハンドラー
- (任意)キャッシュマネージャ
簡単にそれぞれについて説明しますね。
テンプレートリゾルバー
テンプレートを解決するためのオブジェクトです。たとえば ClassLoaderTemplateResolver
は ClassLoader#getResourceAsStream(String)
でテンプレートを取得、FileTemplateResolver
はファイルから、ServletContextTemplateResolve
はサーブレットコンテキストのルートから解決って感じですね。
ダイアレクト
ダイアレクトというのは、テンプレートを処理するための一連のDOMプロセッサーと式のパーサーのセットのことです。Thymeleafではスタンダードダイアレクトと呼ばれるコアライブラリを提供していて、これがデフォルトです。SpEL式を使えるSpring用ダイアレクトも別途提供されています。
メッセージリゾルバー
多言語対応のための外部化メッセージを解決するためのオブジェクトです(ちなみに外部化メッセージは#{...}
という構文で使います)。デフォルトのスタンダードメッセージリゾルバーはテンプレート名を元にメッセージファイル名を決定します。
例えば /WEB-INF/templates/home.html
というテンプレートに対しては、テンプレートと同じフォルダ内の同じ名前のファイルにロケール情報を表す文字列を付けて拡張子が.properties
のファイルの中からメッセージを探します。次のようになります:
- /WEB-INF/templates/home_ll_CC-vv.properties
- /WEB-INF/templates/home_ll_CC.properties
- /WEB-INF/templates/home_ll.properties
- /WEB-INF/templates/home.properties
- (default messages, if they exist)
("ll" = language, "CC" = country, "vv" = variant)
テンプレートモードハンドラー
Thymeleafはデフォルトで XML, VALIDXML, XHTML, VALIDXHTML, HTML5, LEGACYHTML5 の6つのテンプレートモードに対応しています。
キャッシュマネージャ
テンプレートやフラグメント、メッセージや式などのキャッシュをコントロールするオブジェクトです。デフォルトではスタンダードキャッシュマネージャが設定されています。
実際どんな風に使ってる?
個人的にはこんな感じで使ってます。
- (必須)テンプレートリゾルバー
-
ServletContextTemplateResolver
にPrefixやSuffix、テンプレートキャッシュの設定をして使ってる。 - キャッシュは開発時にはリアルタイム反映したいのでOFFにしてます。
- (任意)ダイアレクト
- デフォルトのまま特に触らず。
- (任意)メッセージリゾルバー
- デフォルトのまま特に触らず。
- (任意)テンプレートモードハンドラー
- デフォルトのまま特に触らずに、モードはHTML5を指定。
- (任意)キャッシュマネージャ
- デフォルトのまま特に触らず。
テンプレート処理
処理は2つ
- コンテキストオブジェクトの用意
- テンプレート処理の実行
です。
コンテキストオブジェクトの用意
コンテキストは、テンプレートに渡すための変数マップをもったオブジェクトですね。Webアプリ用には WebContext
というコンテキストクラスが用意されていてこれを使うと、テンプレートから HttpServletRequest
や ServletContext
や HttpSession
にアクセスできます。
テンプレートに渡したいオブジェクトを、このコンテキストに詰めます。
final IContext ctx = new WebContext(request, servletContext);
ctx.setVariable("allItems", items);
テンプレート処理の実行
テンプレート名とコンテキストオブジェクトを渡して、Writerを指定すればOKです。
templateEngine.process("mytemplate", ctx, httpServletResponse.getWriter());
テンプレート名を元に、テンプレートリゾルバーがテンプレートを見つけて、指定したダイアレクトでテンプレートを処理してくれます。
こんなとこかな。