2.1 杂货店网站

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

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

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

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

public class ProductService {

    ...

    public List<Product> findAll() {
        return ProductRepository.getInstance().findAll();
    }

    public Product findById(Integer id) {
        return ProductRepository.getInstance().findById(id);
    }

}

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

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对象处理模版。

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

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

Last updated