本文中所展示的示例的源代码,以及本指南的后续章节,都可以在Good Thymes Virtual Grocery GitHub repository查看.
2.1一个杂货店的网站
为了更好地解释使用Thymeleaf处理模板所涉及的概念,本教程将使用一个示例应用程序,您可以从该项目的web站点下载该应用程序。
这个应用程序是虚拟杂货店的网站,它将为我们提供许多场景来展示Thymeleaf的许多特性。
首先,我们需要为我们的应用程序创建一个简单的模型实体集:通过创建订单来销售给客户的产品。我们还将管理关于这些产品的评论:
示例应用程序模型
我们的应用程序还将有一个非常简单的服务层,由包含诸如:
public class ProductService { ... public List<Product> findAll() { return ProductRepository.getInstance().findAll(); } public Product findById(Integer id) { return ProductRepository.getInstance().findById(id); } }
在web层,我们的应用程序将有一个过滤器,它将根据请求URL将执行委派给支持thymeleafl的命令:
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对象来处理模板。
最后,它看起来是这样的:
但是首先让我们看看这个模板引擎是如何初始化的。