不启动web容器来简单使用Thymeleaf模板解析

分类:软件编程
阅读:2985
作者:majingjing
发布:2017-03-24 21:52

在使用spring-boot开发的项目基本上都是使用的这个模板引擎。
网上的很多的解释和使用都是停留在如何和web做集成,就是没有发现有人写过单独的工具类来解析模板。

之所以要使用模板是因为:

页面主体结构固定,具体参数可变,尽可能让参数动态化,才能提高模板的复用性

页面主体结构固定,具体参数可变,尽可能让参数动态化,才能提高模板的复用性
不像我们用程序动态的拼凑。

之前没有接触Thymeleaf的时候一直使用的Freemarker,感觉也是非常强大的。
自从接触到了Thymeleaf后有一种相见恨晚的感觉。果断投入Thymeleaf的怀抱。

使用这个模板网上的例子都是和容器绑定使用。比如我要做个页面的静态化处理,或现在正在开发整理的api文档。其实我就是想建立一个模板然后根据动态的参数填充后,得到一段字符串的文本内容。仅此而已,难道我还要架一个容器来运行吗 ?
答案当然是否定的,鉴于网上没有找到如何来用,故这就是我写这篇文章的原因。

入门学习还是从官方文档开始,官方文档也是坑人不浅啊。一不留神就疏忽了核心部分的描述。
搜狗截图20170324215542.jpg

查看具体的描述的时候,官方也是采用的 ServletContext 导致我走了很多弯路。
搜狗截图20170324221326.jpg

于是就翻看源代码,苦苦追寻,最终了解了Thymeleaf的解析原理。其实和freemarker很类似。才恍然大悟,再次看官方文档的描述,发现确实讲述了核心处理逻辑。

好了,下面开始讲述下使用关键步骤:

  1. 创建一个 `ITemplateResolver` 实例
  2. 配置转换规则
  3. 创建一个 `ITemplateEngine` 模板引擎实例
  4. Resolver 设置到 engine
  5. 调用 engine 的处理方法

附上简单的代码:

  1. package com.xmg.tzx.majj.core.tool;
  2. import java.util.Map;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.thymeleaf.TemplateEngine;
  6. import org.thymeleaf.context.Context;
  7. import org.thymeleaf.templatemode.TemplateMode;
  8. import org.thymeleaf.templateresolver.FileTemplateResolver;
  9. /**
  10. * @author majinding888@foxmail.com
  11. */
  12. public class ThymeleafUtils {
  13. private static Logger log = LoggerFactory.getLogger(ThymeleafUtils.class);
  14. private static FileTemplateResolver r = new FileTemplateResolver();
  15. static {
  16. r.setTemplateMode(TemplateMode.HTML);
  17. r.setCharacterEncoding("utf-8");
  18. }
  19. public static String render(Map<String, Object> data, String templateFile) {
  20. log.info("开始渲染:{}", templateFile);
  21. TemplateEngine t = new TemplateEngine();
  22. t.setTemplateResolver(r);
  23. Context c = new Context();
  24. c.setVariables(data);
  25. String s = t.process(templateFile, c);
  26. log.info("渲染结果:\n{}", s);
  27. return s;
  28. }
  29. }

在明白原理之后,在结合源代码来看官方文档,会发现有各种好用的工具包来帮忙处理模板的解析工作。包括自定义标签和函数。已经查看标签的实现方式都是非常容易的一件事。

好了,文章就到这里,希望能给小伙伴们带来帮助。