为了更好地解释用 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 对象处理模板。
最后,它将看起来像这样: