为了更好地解释用 Thymeleaf 处理模板所涉及的概念,本教程将使用一个演示应用程序,你可以从项目的网站上下载。
这个应用程序是一个想象中的虚拟杂货店的网站,它将为我们提供许多场景来展示 Thymeleaf 的许多功能。
首先,我们需要为我们的应用程序建立一套简单的模型实体。产品(Products),通过创建订单(Orders)出售给客户(Customers)。我们还将管理关于这些产品(Products)的评论(Comments)。

我们的应用程序还将有一个非常简单的服务层,由包含以下方法的服务对象组成:
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 {
// 这可以防止触发引擎对资源URL的执行
if (request.getRequestURI().startsWith("/css") ||
request.getRequestURI().startsWith("/images") ||
request.getRequestURI().startsWith("/favicon")) {
return false;
}
/*
* 查询控制器/URL映射并获得控制器来处理这个请求。
* 如果没有控制器可用。返回 false,并让其他过滤器/Servlets处理该请求。
*/
IGTVGController controller = this.application.resolveControllerForRequest(request);
if (controller == null) {
return false;
}
/*
* 获取 TemplateEngine 实例。
*/
ITemplateEngine templateEngine = this.application.getTemplateEngine();
/*
* 设置响应头
*/
response.setContentType("text/html;charset=UTF-8");
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
/*
* 执行控制器和处理视图模板,将结果写入响应器。
*/
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 对象处理模板。
最后,它将看起来像这样:
