本文中所展示的示例的源代码,以及本指南的后续章节,都可以在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对象来处理模板。


最后,它看起来是这样的:

但是首先让我们看看这个模板引擎是如何初始化的。


关注极客云图了解更多内容