2.1 杂货店网站

为了更好地解释在使用Thymeleaf处理模版时涉及的概念,本教程将会使用一个演示应用。你可以从项目的网站上下载⏬。

这个应用是一个虚构的杂货店的网站。它将会提供我们许多场景,来展示Thymeleaf的诸多特性。

首先,我们需要为应用准备一套简单的模型实体:通过创建订单卖给顾客产品。我们也会管理与那些产品有关的评论

Example application model

我们的应用也会🈶️一个非常简单的服务层,由包含如下方法的服务对象组成:

  1. public class ProductService {
  2. ...
  3. public List<Product> findAll() {
  4. return ProductRepository.getInstance().findAll();
  5. }
  6. public Product findById(Integer id) {
  7. return ProductRepository.getInstance().findById(id);
  8. }
  9. }

在网络层,我们的应用将会🈶️一个过滤器。它会依据请求的URL,分配执行启用Thymeleaf的命令:

  1. private boolean process(HttpServletRequest request, HttpServletResponse response)
  2. throws ServletException {
  3. try {
  4. // This prevents triggering engine executions for resource URLs
  5. if (request.getRequestURI().startsWith("/css") ||
  6. request.getRequestURI().startsWith("/images") ||
  7. request.getRequestURI().startsWith("/favicon")) {
  8. return false;
  9. }
  10. /*
  11. * Query controller/URL mapping and obtain the controller
  12. * that will process the request. If no controller is available,
  13. * return false and let other filters/servlets process the request.
  14. */
  15. IGTVGController controller = this.application.resolveControllerForRequest(request);
  16. if (controller == null) {
  17. return false;
  18. }
  19. /*
  20. * Obtain the TemplateEngine instance.
  21. */
  22. ITemplateEngine templateEngine = this.application.getTemplateEngine();
  23. /*
  24. * Write the response headers
  25. */
  26. response.setContentType("text/html;charset=UTF-8");
  27. response.setHeader("Pragma", "no-cache");
  28. response.setHeader("Cache-Control", "no-cache");
  29. response.setDateHeader("Expires", 0);
  30. /*
  31. * Execute the controller and process view template,
  32. * writing the results to the response writer.
  33. */
  34. controller.process(
  35. request, response, this.servletContext, templateEngine);
  36. return true;
  37. } catch (Exception e) {
  38. try {
  39. response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
  40. } catch (final IOException ignored) {
  41. // Just ignore this
  42. }
  43. throw new ServletException(e);
  44. }
  45. }

这是我们的IGTVGController接口:

  1. public interface IGTVGController {
  2. public void process(
  3. HttpServletRequest request, HttpServletResponse response,
  4. ServletContext servletContext, ITemplateEngine templateEngine);
  5. }

现在我们要做的就是创建IGTVGController接口的实现,从服务中取回数据,并使用ITemplateEngine对象处理模版。

最后,它看起来就像这样:

Example application home page

但是,先让我们看看那个模版引擎是怎么被初始化的。