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

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

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

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

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

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

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

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

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

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

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

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

创建一个 `ITemplateResolver` 实例
配置转换规则
创建一个 `ITemplateEngine` 模板引擎实例
将 ‘Resolver’ 设置到 engine 中
调用 engine 的处理方法

附上简单的代码:

package com.xmg.tzx.majj.core.tool;

import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.FileTemplateResolver;

/**
 * @author majinding888@foxmail.com
 */
public class ThymeleafUtils {
	private static Logger log = LoggerFactory.getLogger(ThymeleafUtils.class);

	private static FileTemplateResolver r = new FileTemplateResolver();
	static {
		r.setTemplateMode(TemplateMode.HTML);
		r.setCharacterEncoding("utf-8");
	}

	public static String render(Map<String, Object> data, String templateFile) {
		log.info("开始渲染:{}", templateFile);
		TemplateEngine t = new TemplateEngine();
		t.setTemplateResolver(r);
		Context c = new Context();
		c.setVariables(data);
		String s = t.process(templateFile, c);
		log.info("渲染结果:\n{}", s);
		return s;
	}

}

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

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