Thymeleaf学习系列

Thymeleaf学习一

1.一个网上商店的demo
为我们的应用需要一些简单的model实体集合:Products(商品),通过创建Order(订单)出售给Customers(客户)。我们还会管理关于Products(商品)的Comments(评价)
在这里插入图片描述

我们的应用将会有一个很简单的服务层,由Service对象构成,包含如下方法

public class ProductService {

    ...

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

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

在web层我们的应用将根据不同的URL请求给使用过滤器让hymeleaf使能的命令来派发执行。

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 接口的实现,从Service获取数据,使用ITemplateEngine 对象处理模板。
最终,将会像如下的展现

在这里插入图片描述

首先,让我们看看我们的模板引擎是如何初始化的
我们的过滤器里面包含的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 对象,但是现在这些代码将会教会我们这些步骤所需要的知识。

The Template Resolver
让我们从The Template Resolver开始:

ServletContextTemplateResolver templateResolver = 
        new ServletContextTemplateResolver(servletContext);

Template Resolvers是一个实现了叫做org.thymeleaf.templateresolver.ITemplateResolver的一个Thymeleaf的API的对象。

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中获取模板文件作为资源。Servlet Context是一个应用级别的javax.servlet.ServletContext对象,存在于每一个java web应用,它将负责从web应用的root中获得资源

我们还可以设置一些参数:

templateResolver.setTemplateMode(TemplateMode.HTML);

HTML是ServletContextTemplateResolver的默认模板模式,但是建立起来是一个很好的习惯,这样我们的代码就能很好的展示出究竟发生了什么:

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

prefix和suffix将修改模板的名字,这样的话我们能够给引擎传递我们正式使用的资源名字。
使用这个配置,”/product/list“将会对应于:

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

在缓存中的被解析的模板的存活时间可以在Template Resolver中通过cacheTTLMs属性来配置:

templateResolver.setCacheTTLMs(3600000L);

一个模板也可以在其TTL到达之前被从缓存中去除,只要缓存的最大cache 达到了,并且模板是oldest entry.

The Template Engine
The Template Engine对象是org.thymeleaf.ITemplateEngine接口的实现。很多实现都是Thymeleaf核心org.thymeleaf.TemplateEngine提供的。我们也可以创建一个实现:

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

我们要做的就是从创建一个实例,并将 Template Resolver设置到里面去。
Template Resolver是 TemplateEngine唯一需要的参数,虽然有很多参数,接下来我们将会讨论到(message resolver,cache sizes等等)。
我们的Template Engine已经准备好,接下来我们就可以使用Thymeleaf来创建我们的页面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刚刚好123456

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值