Thymeleaf是什么
Thymeleaf是一个JAVA库,它是一种XML/XHTML/HTML5模板引擎,能够转换一组模板以展示应用产生的数据与文字。
Thymeleaf可以处理web应用或独立应用程序中的任何XML文件,但它更适用于处理web应用中的XHTML/HTML5。
Thymeleaf的主要目标是提供一种优雅的、格式良好的创建模板的方式。为了实现这一目的,它基于XML标签与属性,执行DOM中预定义的逻辑,而不是直接在模版中编写逻辑代码。
Thymeleaf的体系结构能够快速处理模板。它依靠智能缓存解析文档,以在执行中使用最少的 I/O次数。
相关资料
Thymeleaf文档
Thymeleaf + Spring文档
Thymeleaf扩展
在这个文档里可以学到如何去扩展Thymeleaf扩展,可以自定义自己的Thymeleaf模板方言,处理器,实体等等。
The Thymeleaf交互教学
这个有点类似OJ,可以在网站上写代码并且可以看到效果,是一种很好的学习Thymeleaf的方式。
导入Thymeleaf示例程序
从一个例子入手能够快速的理解Thymeleaf的结构和用法。而Thymeleaf官方正好给我们提供了这样一个例子。下载地址:thymeleafexamples-gtvg
这是一个虚拟的杂货店网站。网站的实体与业务流程如下:用户(Customers)购买网站的产品并产生订单(Orders),同时网站也会管理产品的评价(Comments)。
程序的package结构如下图:
GTVGFilter
项目通过GTVGFilter过滤器拦截request,根据requestURL获取相应的控制器(Controller)。
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); } }
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); } }
GTVGApplication
GTVGApplication类 类似于spring中的容器,它配置了templateEngine并且用一个Map来保存requestURL与对应的控制器类的键值对。GTVGFilter中就是通过它来寻找对应的控制器类的。
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());
但是我们的重点并不在这。
创建并配置模板引擎(Template Engine)
public class GTVGApplication { ... private static TemplateEngine templateEngine; ... static { ... initializeTemplateEngine(); ... } private static void initializeTemplateEngine() { ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(); // XHTML is the default mode, but we set it anyway for better understanding of code templateResolver.setTemplateMode("XHTML"); // 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(3600000L); templateEngine = new TemplateEngine(); templateEngine.setTemplateResolver(templateResolver); } ... }
(1)模板解析器(The Template Resolver)
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); }
这些对象(即模板解析器)主要负责定义模板的访问方式。在示例程序中,我们使用的org.thymeleaf.templateresolver.ServletContextTemplateResolver是把模板以Servlet上下文的形式访问的。接着我们可以给模板解析器设置一系列参数,例如上面代码中的:模板模式(setTemplateMode),前缀后缀(setPrefix,setSuffix),缓存时间()等等。
(2)模板引擎(The Template Engine)
例子中初始化并配置模板引擎只用了两行代码。
templateEngine = new TemplateEngine(); templateEngine.setTemplateResolver(templateResolver);
我们需要做的仅仅是将模板解析器的对象设置给模板引擎。
运行Thymeleaf示例程序
将实例程序发布到服务器中,输入网址就可以看到运行的结果了。