LoginSignup
9
10

More than 5 years have passed since last update.

ThymeleafのTemplateEngineオブジェクト

Posted at

Thymeleafについて何か書こっかなと思ったので、TemplateEngineオブジェクトについて書いてみます。初Qiita!

Javadoc

Thymeleafって結構コーディング規約とかしっかりしてて、ソース読んでて楽しいです。Javadocもしっかり書かれているので、今日はこのJavadocを見ていこうと思います。

TemplateEngine (thymeleaf 2.1.3.RELEASE API)

テンプレートエンジンの初期化

デフォルトコンストラクタで生成します。インスタンスの生成と初期化はコストが高いのでテンプレート処理の度に生成するんじゃなくて、1インスタンスだけ作って処理した方がいいよ。って。

final TemplateEngine templateEngine = new TemplateEngine();

設定

TemplateEngineのインスタンスに色々と設定をするのですが以下のものが設定できます。
テンプレートリゾルバーは必須で、それ以外は任意です。

  • (必須)テンプレートリゾルバー
  • (任意)ダイアレクト
  • (任意)メッセージリゾルバー
  • (任意)テンプレートモードハンドラー
  • (任意)キャッシュマネージャ

簡単にそれぞれについて説明しますね。

テンプレートリゾルバー

テンプレートを解決するためのオブジェクトです。たとえば ClassLoaderTemplateResolverClassLoader#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つ

  1. コンテキストオブジェクトの用意
  2. テンプレート処理の実行

です。

コンテキストオブジェクトの用意

コンテキストは、テンプレートに渡すための変数マップをもったオブジェクトですね。Webアプリ用には WebContext というコンテキストクラスが用意されていてこれを使うと、テンプレートから HttpServletRequestServletContextHttpSession にアクセスできます。

テンプレートに渡したいオブジェクトを、このコンテキストに詰めます。

final IContext ctx = new WebContext(request, servletContext);
ctx.setVariable("allItems", items);

テンプレート処理の実行

テンプレート名とコンテキストオブジェクトを渡して、Writerを指定すればOKです。

templateEngine.process("mytemplate", ctx, httpServletResponse.getWriter());

テンプレート名を元に、テンプレートリゾルバーがテンプレートを見つけて、指定したダイアレクトでテンプレートを処理してくれます。

こんなとこかな。

9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10