The Good Thymes Virtual Grocery 介绍Thymeleaf 使用文本 可以在Good Thymes Virtual Grocery GitHub存储库中找到本指南的本章和后续章节中显示的示例的源代码。 2.1 A website for a grocery 为了更好地解释使用Thymeleaf处理模板所涉及的概念,本教程将使用可从项目网站下载的演示应用程序。 这个应用程序是一个假想的虚拟杂货的网站,并将为我们提供许多场景来展示Thymeleaf的许多功能。 首先,我们需要一套简单的模型实体用于我们的应用程序:通过创建Products销售。我们还将管理这些:CustomersOrdersCommentsProducts 我们的应用程序还有一个非常简单的服务层,由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接口的实现,从服务中检索数据并使用ITemplateEngine对象处理模板。 最后,它看起来像这样: 但首先让我们看看该模板引擎是如何初始化的。 2.2创建和配置模板引擎 我们的过滤器中的process(...)方法包含以下行: ITemplateEngine templateEngine = this.application.getTemplateEngine(); 这意味着GTVGApplication类负责创建和配置Thymeleaf应用程序中最重要的对象之一: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 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); 模板解析器是实现Thymeleaf API的接口的对象,称为org.thymeleaf.templateresolver.ITemplateResolver: 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我们将从Servlet上下文中检索模板文件作为资源的方式: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对象来管理默认缓存来定义缓存行为和大小。 关于模板解析器还有很多东西需要学习,但是现在让我们来看看Template Engine对象的创建。 模板引擎 模板引擎对象是org.thymeleaf.ITemplateEngine接口的实现。其中一个实现是由Thymeleaf核心提供的:org.thymeleaf.TemplateEngine我们在这里创建一个实例: templateEngine = new TemplateEngine(); templateEngine.setTemplateResolver(templateResolver); 相当简单,不是吗?我们所需要的只是创建一个实例并将模板解析器设置为它。 模板解析器是唯一需要的参数TemplateEngine,尽管稍后将介绍许多其他参数(消息解析器,缓存大小等)。现在,这就是我们所需要的。 我们的模板引擎现已准备就绪,我们可以使用Thymeleaf开始创建页面。 介绍Thymeleaf 使用文本