目次15構成の詳細
15.1リゾルバーテンプレート
Thymes仮想食料品店では、ServletContextTemplateResolverと呼ばれるITemplateResolverの実装を選択しました。これにより、サーブレットコンテキストからリソースとしてテンプレートを取得できました。
Thymeleafには、独自のテンプレートリゾルバーを作成し、ITemplateResolverを実装する機能を提供することに加えて、すぐに使用できる4つの実装が含まれています。
- org.thymeleaf.templateresolver.ClassLoaderTemplateResolver 。これは、クラスローダーリソースとしてテンプレートを検索します。次に例を示します。
return Thread.currentThread().getContextClassLoader().getResourceAsStream(template);
- org.thymeleaf.templateresolver.FileTemplateResolver 。ファイルシステムからファイルとしてテンプレートを検索します。次に例を示します。
return new FileInputStream(new File(template));
- org.thymeleaf.templateresolver.UrlTemplateResolver。URLとしてパターンを検索します(ローカルではないものも含む)。例:
return (new URL(template)).openStream();
- org.thymeleaf.templateresolver.StringTemplateResolver 。これは、Stringがテンプレート(またはこの場合は単純な名前よりも明らかに大きいテンプレートの名前)として指定されているため、テンプレートを直接検索します。
return new StringReader(templateName);
事前定義されたすべてのITemplateResolver実装により、以下を含む同じ構成パラメーターのセットを使用できます。
- プレフィックスとサフィックス(既に見たとおり):
templateResolver.setPrefix("/WEB-INF/templates/"); templateResolver.setSuffix(".html");
- ファイル名と一致しないテンプレート名を使用できるテンプレートエイリアス。 サフィックス/プレフィックスとエイリアスがある場合、エイリアスはプレフィックス/サフィックスの前に適用されます。
templateResolver.addTemplateAlias("adminHome","profiles/admin/home"); templateResolver.setTemplateAliases(aliasesMap);
- テンプレートの読み取り時に使用されるエンコード:
templateResolver.setEncoding("UTF-8");
- 使用されるテンプレートモード:
- パターンキャッシュとパターンのデフォルトモードは、特定のパターンがキャッシュ可能かどうかを判断することです。
- このテンプレートリゾルバで作成された解析済みテンプレートキャッシュエントリのTTL(ミリ秒)。 指定しない場合、キャッシュエントリを削除する唯一の方法はLRUです(最大キャッシュサイズを超えており、レコードが最も古くなります)。
Thymeleaf + Spring統合パッケージは、Springインフラストラクチャ全体を使用してアプリケーション内のリソースにアクセスして読み取るSpringResourceTemplateResolver実装を提供します。これは、Spring対応アプリケーションでの推奨実装です。
リゾルバテンプレートのチェーンさらに、パターンエンジンはいくつかのパターンファインダを指定できます。この場合、パターンを検索する順序を設定できるため、最初のパターンファインダがパターンを見つけられない場合、2番目のパターンファインダが要求されます。
ClassLoaderTemplateResolver classLoaderTemplateResolver = new ClassLoaderTemplateResolver(); classLoaderTemplateResolver.setOrder(Integer.valueOf(1)); ServletContextTemplateResolver servletContextTemplateResolver = new ServletContextTemplateResolver(servletContext); servletContextTemplateResolver.setOrder(Integer.valueOf(2)); templateEngine.addTemplateResolver(classLoaderTemplateResolver); templateEngine.addTemplateResolver(servletContextTemplateResolver);
複数のリゾルバーテンプレートを使用する場合、Thymeleafがパターンを検索するように設計されていないこれらのパターンリゾルバーをすばやく元に戻し、パフォーマンスを向上できるように、パターン認識ツールごとにパターンを指定することをお勧めします。 これは要件ではありませんが、推奨事項です。
ClassLoaderTemplateResolver classLoaderTemplateResolver = new ClassLoaderTemplateResolver(); classLoaderTemplateResolver.setOrder(Integer.valueOf(1));
これらの解決可能なテンプレートが指定されていない場合、作成する各ITemplateResolver実装の特定の機能に依存します。 すべての実装が解決する前にテンプレートの存在を決定できるわけではないため、テンプレートを常に解決可能と見なし、検索チェーンを中断することができることに注意してください(他のリゾルバが同じテンプレートをチェックするのを防ぎます)。
Thymeleafカーネルの一部であるITemplateResolverのすべての実装には、リゾルバーがリソースを見つける前に存在するかどうかを本当にチェックすることを強制できるメカニズムが含まれています。 これは
checkExistenceフラグで、次のように機能します。
ClassLoaderTemplateResolver classLoaderTemplateResolver = new ClassLoaderTemplateResolver(); classLoaderTemplateResolver.setOrder(Integer.valueOf(1)); classLoaderTempalteResolver.setCheckExistence(true);
この
checkExistenceフラグにより、リゾルバーは検索フェーズ中にリソースの存在を
実際に確認するよう
に強制します(現在のチェックがfalseを返す場合、チェーン内で次の検索を実行します)。 これは良い解決策のように思えるかもしれませんが、ほとんどの場合、リソース自体への二重アクセスを意味し(存在を確認するために一度、それを読むために別の時に)、たとえば「リモート」テンプレートベースのリソースのパフォーマンスの問題になるURLは潜在的なパフォーマンスの問題であり、いずれにしてもテンプレートキャッシュを使用することで大幅に軽減できます(この場合、テンプレートは最初にアクセスしたときにのみ検索されます)。
15.2メッセージリゾルバー
GroceryアプリケーションのMessage Resolver実装を明示的に指定しなかったため、前述のように、これは使用される実装がorg.thymeleaf.messageresolver.StandardMessageResolverオブジェクトであることを意味していました。
StandardMessageResolverはIMessageResolverインターフェイスの標準実装ですが、必要に応じて独自のアプリケーションを作成し、アプリケーションの特定のニーズに適合させることができます。
Thymeleaf + Spring統合パッケージは、標準のSpringメソッドを使用して、Spring Application Contextで宣言されたMessageSourceコンポーネントを使用して外部メッセージを受信するIMessageResolverのデフォルト実装を提供します。
標準メッセージリゾルバーそれでは、特定のテンプレートによって要求されたメッセージの
StandardMessageResolverはどのように見えますか?
テンプレート名が「home」で、/ WEB-INF / templates / home.htmlにあり、要求された言語がgl_ESである場合、このリゾルバーは次のファイル内のメッセージを次の順序で検索します。
/WEB-INF/templates/home_gl_ES.properties /WEB-INF/templates/home_gl.properties /WEB-INF/templates/home.properties
完全なメッセージ検索エンジンの動作の詳細については、StandardMessageResolverクラスのJavaDocドキュメントを参照してください。
メッセージファインダーの設定テンプレートエンジンにメッセージ変換ツール(またはそれ以上)を追加する場合はどうなりますか? これは簡単です:
そして、なぜ複数のメッセージファインダーが必要なのでしょうか。 テンプレートファインダと同じ理由で、メッセージオーガナイザーが注文され、最初のメッセージが特定のメッセージを見つけられない場合、2番目が要求され、3番目が要求されます。
15.3変換サービス
ダブルブラケット構文
($ {{...}})を使用してデータ変換とフォーマット操作を実行できる変換サービスは、実際にはThymeleafテンプレートエンジン自体ではなく、標準の方言の要素です。
したがって、それを構成する方法は、テンプレートエンジンで構成されているStandardDialectインスタンスで
IStandardConversionServiceインターフェイスのユーザー実装を直接構成することです。 詳細:
IStandardConversionService customConversionService = ... StandardDialect dialect = new StandardDialect(); dialect.setConversionService(customConversionService); templateEngine.setDialect(dialect);
thymeleaf-spring3および
thymeleaf-spring4パッケージにはSpringStandardDialectが含まれており、この方言は
IStandardConversionServiceの実装で事前構成されており、ネイティブSpring変換サービスインフラストラクチャをThymeleafに統合していることに注意してください。
15.4ロギング
Thymeleafはイベントロギングに細心の注意を払い、常にロギングインターフェースを介して最大限の有用な情報を提供しようとします。
使用されるロギングライブラリは
slf4jです 。これは、アプリケーションで使用できるロギング実装(log4jなど)へのブリッジとして実際に機能します。
Thymeleafクラスでは
、必要な詳細レベルに応じて
TRACE、DEBUG、およびINFOデータが書き込まれ、一般的なログに加えて、TemplateEngineクラスに関連付けられた3つの特別なレジストラを使用します。
log4jを使用したThymeleafロギングインフラストラクチャの構成例は次のとおりです。
log4j.logger.org.thymeleaf=DEBUG log4j.logger.org.thymeleaf.TemplateEngine.CONFIG=TRACE log4j.logger.org.thymeleaf.TemplateEngine.TIMER=TRACE log4j.logger.org.thymeleaf.TemplateEngine.cache.TEMPLATE_CACHE=TRACE