示例所示的源代码和本指南中将来的章节均可以在此找到Good Thymes Virtual Grocery GitHub repository.html
为了更好地解释Thymeleaf参与处理模板的概念,本教程将使用一个演示的应用程序,您能够从上面地址下载项目。 git
这个应用程序是一个虚构的虚拟商店网站,并将为咱们提供足够的场景举例说明不一样Thymeleaf特性。github
咱们须要为咱们的应用程序设计一套很是简单的实体模型: Products(商品) 经过建立orders(订单)卖给Customers(客户)。咱们也管理这些产品的Comments(评论)。应用程序模型以下:
web
咱们的小应用程序也将有一个很是简单的服务层,服务对象包含方法以下:缓存
public class ProductService { ... public List<Product> findAll() { return ProductRepository.getInstance().findAll(); } public Product findById(Integer id) { return ProductRepository.getInstance().findById(id); } }
最后,在web层有一个过滤器,将根据请求URL委托执行Thymeleaf-enabled命令:app
private boolean process(HttpServletRequest request, HttpServletResponse response) throws ServletException { try { /* * 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 = GTVGApplication.resolveControllerForRequest(request); if (controller == null) { return false; } /* * Obtain the TemplateEngine instance. */ TemplateEngine templateEngine = GTVGApplication.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) { throw new ServletException(e); } }
这是咱们的 IGTVGController 接口:网站
public interface IGTVGController { public void process(HttpServletRequest request, HttpServletResponse response,ServletContext servletContext, TemplateEngine templateEngine); }
如今咱们要作的就是建立IGTVGController接口的实现,从服务层获取数据并使用TemplateEngine对象处理模板。最后,它会像这样:
但首先让咱们看看模板引擎是如何初始化的。this
在咱们的过滤器的process(…)方法包含这个句子:spa
TemplateEngine templateEngine = GTVGApplication.getTemplateEngine();
这意味着GTVGApplication类负责建立和配置程序中最重要的一个对象TemplateEngine实例。咱们的org.thymeleaf.TemplateEngine对象初始化过程以下:设计
public class GTVGApplication { ... private TemplateEngine templateEngine; ... public GTVGApplication(final ServletContext servletContext) { super(); ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext); // HTML is the default mode, but we will 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"); // Set template cache TTL to 1 hour. If not set, entries would live in cache 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); this.controllersByURL = new HashMap<String, IGTVGController>(); this.controllersByURL.put("/", new HomeController()); this.controllersByURL.put("/product/list", new ProductListController()); this.controllersByURL.put("/product/comments", new ProductCommentsController()); this.controllersByURL.put("/order/list", new OrderListController()); this.controllersByURL.put("/order/details", new OrderDetailsController()); this.controllersByURL.put("/subscribe", new SubscribeController()); this.controllersByURL.put("/userprofile", new UserProfileController()); } ... }
固然有不少方法配置TemplateEngine对象,可是如今这些几行代码将知足咱们所需。
让咱们先从模板解析器开始:
ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
模板解析器是实现了Thymeleaf API中的org.thymeleaf.templateresolver.ITemplateResolver接口的对象。
public interface ITemplateResolver { ... /* * Templates are resolved by String name (templateProcessingParameters.getTemplateName()) * Will return null if template cannot be handled by this template resolver. */ public TemplateResolution resolveTemplate( TemplateProcessingParameters templateProcessingParameters); }
模板解析器负责肯定如何访问咱们的模板。而且咱们能从servlet上下文环境中解析模板文件。
但上述并非模板解析器的全部功能,由于咱们能够设置一些配置参数。首先, 设置模板模式,一个标准的例子以下:
templateResolver.setTemplateMode("XHTML");
XHTML是ServletContextTemplateResolver默认的模板模式。
templateResolver.setPrefix("/WEB-INF/templates/"); templateResolver.setSuffix(".html");
这些前缀和后缀用来修饰模板引擎调用的模板路径,好比模板的调用模板的路径为“product/list“至关于以下操做
servletContext.getResourceAsStream("/WEB-INF/templates/product/list.html")
可选地,在缓存中解析模板的有效时间是配置的,模板解析器经过cacheTTLMs属性设置
templateResolver.setCacheTTLMs(3600000L);
固然,一个模板在到达最大缓存时间前是能够被去掉的,而到达最大缓存时间的时候,会去掉缓存中最老的。
缓存行为和大小能够由用户经过实现ICacheManager接口或简单修改StandardCacheManager来改变默认缓存对象集。
模板引擎是类org.thymeleaf.TemplateEngine的对象。下面的例子建立了咱们的模板引擎:
templateEngine = new TemplateEngine(); templateEngine.setTemplateResolver(templateResolver);
很是简单,不是吗?咱们所须要仅仅的是建立一个实例并设置模板解析器给它。
模板解析器是TemplateEngine惟一须要的参数,固然接下来还有不少其余参数须要设置(消息解析器、缓存大小等)。就目前而言,这就是咱们所须要的。
咱们的模板引擎如今准备好了,咱们能够开始使用Thymeleaf建立咱们的页面了。