Thymeleafチュートリアル:第2章良いThymes仮想食料品店

目次



2タイムズグッドバーチャルグローサリー



マニュアルのこの章および今後の章で示される例のソースコードは、Good Thymes Virtual Grocery GitHubリポジトリhttps://github.com/thymeleaf/thymeleafexamples-gtvgにあります



2.1食料品店のウェブサイト



Thymeleafでのテンプレートの処理に関連する概念をよりよく説明するために、このチュートリアルでは、プロジェクトWebサイトからダウンロードできるデモアプリケーションを使用します。



このアプリは、架空の仮想食料品店のウェブサイトであり、Thymeleafの多くの機能を示す多くのシナリオを提供します。



まず、アプリケーション用のモデルオブジェクトの簡単なセットが必要です。これは、注文を通じて顧客に販売される製品です。 製品のコメントも管理します。



サンプルアプリケーションモデル



また、アプリケーションには、次のようなメソッドを含むServiceオブジェクトで構成される非常に単純なサービスレベルがあります。



public class ProductService { ... public List<Product> findAll() { return ProductRepository.getInstance().findAll(); } public Product findById(Integer id) { return ProductRepository.getInstance().findById(id); } }
      
      





Webレベルでは、アプリケーションに、リクエストURLに応じてThymeleaf対応コマンドの実行を委任するフィルターがあります。



 private boolean process(HttpServletRequest request, HttpServletResponse response) throws ServletException { try { // This prevents triggering engine executions for resource URLs if (request.getRequestURI().startsWith("/css") || request.getRequestURI().startsWith("/images") || request.getRequestURI().startsWith("/favicon")) { return false; } /* * Query controller/URL mapping and obtain the controller * that will process the request. If no controller is available, * return false and let other filters/servlets process the request. */ IGTVGController controller = this.application.resolveControllerForRequest(request); if (controller == null) { return false; } /* * Obtain the TemplateEngine instance. */ ITemplateEngine templateEngine = this.application.getTemplateEngine(); /* * Write the response headers */ response.setContentType("text/html;charset=UTF-8"); response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); /* * Execute the controller and process view template, * writing the results to the response writer. */ controller.process( request, response, this.servletContext, templateEngine); return true; } catch (Exception e) { try { response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } catch (final IOException ignored) { // Just ignore this } throw new ServletException(e); } }
      
      





IGTVGControllerのインターフェース:



 public interface IGTVGController { public void process( HttpServletRequest request, HttpServletResponse response, ServletContext servletContext, ITemplateEngine templateEngine); }
      
      





あとは、IGTVGControllerインターフェイスを実装するだけです。IGTVGControllerインターフェイスは、サービスにデータを要求し、IGTemplateEngineオブジェクトを使用してテンプレートを処理します。



最後に、次のようになります。



アプリケーションホームページの例



2.2テンプレートエンジンの作成と設定



フィルターのプロセス(...)メソッドには次の行が含まれます。



 ITemplateEngine templateEngine = this.application.getTemplateEngine();
      
      





つまり、GTVGApplicationクラスは、Thymeleafアプリケーションで最も重要なオブジェクトの1つであるTemplateEngineのインスタンス(ITemplateEngineインターフェースの実装)の作成と構成を担当します。



org.thymeleaf.TemplateEngineオブジェクトが初期化されます。



 public class GTVGApplication { ... private final TemplateEngine templateEngine; ... public GTVGApplication(final ServletContext servletContext) { super(); ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext); // HTML is the default mode, but we set it anyway for better understanding of code templateResolver.setTemplateMode(TemplateMode.HTML); // This will convert "home" to "/WEB-INF/templates/home.html" templateResolver.setPrefix("/WEB-INF/templates/"); templateResolver.setSuffix(".html"); // Template cache TTL=1h. If not set, entries would be cached until expelled by LRU templateResolver.setCacheTTLMs(Long.valueOf(3600000L)); // Cache is set to true by default. Set to false if you want templates to // be automatically updated when modified. templateResolver.setCacheable(true); this.templateEngine = new TemplateEngine(); this.templateEngine.setTemplateResolver(templateResolver); ... } }
      
      





TemplateEngineオブジェクトをカスタマイズするには多くの方法がありますが、現時点では、これらの数行のコードから必要な手順について十分な情報が得られます。



テンプレートリゾルバ



テンプレートリゾルバから始めましょう。



 ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext);
      
      





テンプレートリゾルバーは、org.thymeleaf.templateresolver.ITemplateResolverと呼ばれるThymeleaf APIからのインターフェイスを実装するオブジェクトです。



 public interface ITemplateResolver { ... /* * Templates are resolved by their name (or content) and also (optionally) their * owner template in case we are trying to resolve a fragment for another template. * Will return null if template cannot be handled by this template resolver. */ public TemplateResolution resolveTemplate( final IEngineConfiguration configuration, final String ownerTemplate, final String template, final Map<String, Object> templateResolutionAttributes); }
      
      





これらのオブジェクトは、テンプレートの使用方法を決定する役割を果たします。このGTVGアプリケーションでは、org.thymeleaf.templateresolver.ServletContextTemplateResolverは、存在するアプリケーションレベルjavax.servlet.ServletContextで、サーブレットコンテキストからテンプレートファイルをリソースとして抽出することを意味します。すべてのJava Webアプリケーションで、Webアプリケーションのルートからリソースを解決します。



しかし、パターン認識エンジンについて言うことができるのはそれだけではありません。パターン認識エンジンにいくつかの構成パラメーターを設定できるからです。 まず、テンプレートモード:



 templateResolver.setTemplateMode(TemplateMode.HTML);
      
      





HTMLはServletContextTemplateResolverのデフォルトのテンプレートモードですが、コードド​​キュメントで何が起きているかを明確に示すために、とにかくセットアップすることをお勧めします。



 templateResolver.setPrefix("/WEB-INF/templates/"); templateResolver.setSuffix(".html");
      
      





接頭辞と接尾辞はテンプレートの名前を変更し、使用される実際のリソースの名前を取得するためにエンジンに渡します。



この構成を使用すると、テンプレート名「product / list」が一致します。



 servletContext.getResourceAsStream("/WEB-INF/templates/product/list.html");
      
      





オプションですが、分析されたテンプレートがキャッシュ内に存在できる時間は、cacheTTLMsプロパティを使用してテンプレートリゾルバーで構成されます。



 templateResolver.setCacheTTLMs(3600000L);
      
      





最大キャッシュサイズに達すると、テンプレートはTTLに達する前にキャッシュから消えることがあり、これが最も古いレコードです。



キャッシュの動作とサイズは、ICacheManagerインターフェイスを実装するか、StandardCacheManagerオブジェクトを変更してデフォルトのキャッシュを管理することにより、ユーザーが定義できます。



テンプレートリゾルバについてはまだ多くのことを言うことができますが、テンプレートエンジンオブジェクトの作成に戻りましょう。



テンプレートエンジン



テンプレートエンジンオブジェクトは、org.thymeleaf.ITemplateEngineインターフェースの実装です。 これらの実装の1つがThymeleafコアによって提案されています:org.thymeleaf.TemplateEngine、およびそれをインスタンス化します:



 templateEngine = new TemplateEngine(); templateEngine.setTemplateResolver(templateResolver);
      
      





シンプルでしょ? 必要なのは、インスタンスを作成し、そのテンプレートリゾルバを設定することだけです。



テンプレートリゾルバは、TemplateEngineが必要とする唯一の必須パラメータですが、後で説明する他の多くのもの(メッセージリゾルバ、キャッシュサイズなど)があります。 これまでのところ、必要なのはそれだけです。



これでテンプレートモジュールの準備ができました。Thymeleafでページの作成を開始できます。



継続する。 第3章テキストの使用



All Articles