欢迎您的访问
专注于分享最有价值的互联网技术干货

二、The Good Thymes 虚拟杂货店

几个T的资料等你来白嫖
双倍快乐
一点要收藏这个宝藏网站防止丢失,资源帮找!!!

二、The Good Thymes 虚拟杂货店

Good Thymes 虚拟杂货 GitHub 存储库中可以找到本指南以及本指南以后各章中显示的示例的源代码。

2.1 杂货店的网站

为了更好地解释 Thymeleaf 处理模板所涉及的概念,本教程将使用一个演示应用程序,您可以从该项目的网站上下载该应用程序。

该应用程序是一个虚拟虚拟杂货店的网站,它将为我们提供许多方案来展示 Thymeleaf 的许多功能。

首先,我们需要为应用程序提供一组简单的模型实体:Products,它们通过创建Orders出售给Customers。我们还将针对ProductsManagementComments

20210311103642100.png

示例应用程序模型

我们的应用程序还将具有一个非常简单的服务层,该服务层由包含以下方法的Service对象组成:

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 {

        // 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对象从服务中检索数据并处理模板。

最后,它将如下所示:

20210311103642242.png

示例应用程序主页

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

2.2 创建和配置模板引擎

过滤器中的* process(…)*方法包含以下行:

ITemplateEngine templateEngine = this.application.getTemplateEngine();

这意味着* GTVGApplication *类负责创建和配置 Thymeleaf 应用程序中最重要的对象之一:TemplateEngine实例(ITemplateEngine接口的实现)。

我们的org.thymeleaf.TemplateEngine对象初始化如下:

public class GTVGApplication {

    ...
    private final TemplateEngine templateEngine;
    ...

    public GTVGApplication(final ServletContext servletContext) {

        super();

        ServletContextTemplateResolver templateResolver =
                new ServletContextTemplateResolver(servletContext);

        // HTML is the default mode, but we set it anyway for better understanding of code
        templateResolver.setTemplateMode(TemplateMode.HTML);
        // This will convert "home" to "/WEB-INF/templates/home.html"
        templateResolver.setPrefix("/WEB-INF/templates/");
        templateResolver.setSuffix(".html");
        // Template cache TTL=1h. If not set, entries would be cached until expelled
        templateResolver.setCacheTTLMs(Long.valueOf(3600000L));

        // Cache is set to true by default. Set to false if you want templates to
        // be automatically updated when modified.
        templateResolver.setCacheable(true);

        this.templateEngine = new TemplateEngine();
        this.templateEngine.setTemplateResolver(templateResolver);

        ...

    }

}

配置TemplateEngine对象的方法有很多,但是到目前为止,这几行代码将使我们充分了解所需的步骤。

模板解析器

让我们从模板解析器开始:

ServletContextTemplateResolver templateResolver =
        new ServletContextTemplateResolver(servletContext);

模板解析器是实现 Thymeleaf API 中称为org.thymeleaf.templateresolver.ITemplateResolver的接口的对象:

public interface ITemplateResolver {

    ...

    /*
     * Templates are resolved by their name (or content) and also (optionally) their
     * owner template in case we are trying to resolve a fragment for another template.
     * Will return null if template cannot be handled by this template resolver.
     */
    public TemplateResolution resolveTemplate(
            final IEngineConfiguration configuration,
            final String ownerTemplate, final String template,
            final Map<String, Object> templateResolutionAttributes);
}

这些对象负责确定如何访问我们的模板,在此 GTVG 应用程序中,org.thymeleaf.templateresolver.ServletContextTemplateResolver表示我们将从* Servlet Context *中检索模板文件作为资源:资源存在于应用程序范围内的javax.servlet.ServletContext对象每个 Java Web 应用程序,它从 Web 应用程序根目录解析资源。

但这还不是我们可以说的关于模板解析器的全部内容,因为我们可以在模板解析器上设置一些配置参数。一,模板模式:

templateResolver.setTemplateMode(TemplateMode.HTML);

HTML 是ServletContextTemplateResolver的默认模板模式,但是无论如何都要构建它是一个好习惯,以便我们的代码清楚地记录正在发生的事情。

templateResolver.setPrefix("/WEB-INF/templates/");
templateResolver.setSuffix(".html");

前缀后缀修改了我们将传递给引擎的模板名称,以获取要使用的真实资源名称。

使用此配置,模板名称*“ product/list” *将对应于:

servletContext.getResourceAsStream("/WEB-INF/templates/product/list.html")

(可选)可以通过* cacheTTLMs *属性在模板解析器中配置已解析模板可以在缓存中生存的时间:

templateResolver.setCacheTTLMs(3600000L);

如果达到最大缓存大小并且它是当前缓存的最早条目,则在达到 TTL 之前仍可以从缓存中删除模板。

用户可以通过实现ICacheManager接口或通过修改StandardCacheManager对象来 Management 默认缓存来定义缓存行为和大小。

关于模板解析器,还有很多要学习的知识,但是现在让我们看一下模板引擎对象的创建。

模板引擎

模板引擎对象是org.thymeleaf.ITemplateEngine接口的实现。 Thymeleaf 核心org.thymeleaf.TemplateEngine提供了这些实现之一,我们在这里创建它的一个实例:

templateEngine = new TemplateEngine();
templateEngine.setTemplateResolver(templateResolver);

相当简单,不是吗?我们需要做的就是创建一个实例并将模板解析器设置为该实例。

模板解析器是TemplateEngine唯一的*“必需”参数,尽管稍后还会涉及许多其他参数(消息解析器,缓存大小等)。目前,这就是我们所需要的。

现在我们的模板引擎已经准备就绪,我们可以开始使用 Thymeleaf 创建页面了。

赞(0) 打赏
版权归原创作者所有,任何形式转载请联系我们:大白菜博客 » 二、The Good Thymes 虚拟杂货店

评论 抢沙发

8 + 6 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏