使用velocity 和 thymeleaf模板引擎编译模板
程序员文章站
2022-07-14 10:17:53
...
在项目中会经常用到用模板编译文件,本文使用velocity 和 thymeleaf编译模板
在编译javascript时使用 thymeleaf 编译会出现变量中文会被转成unicode编码,在编译完后使用转码进行转码
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
import org.springframework.stereotype.Component;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import java.io.StringWriter;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 编译脚本文件帮助类
*
* @author kou
* @Date 2019-09-23
*/
@Component
@Slf4j
public class CompileTemplate {
/**
* 使用thymeleaf编译模板文件
*
* @param template 模板文件名
* @param data 数据模型
* @return 编译后内容
*/
public String compileThymeleafTemplate(String template, Map<String, Object> data) {
return this.compileThymeleafTemplate("static/", template, data);
}
/**
* 使用thymeleaf编译模板文件
*
* @param prefix 模板文件前缀,即模板文件目录, 默认 static/
* @param template 模板文件名
* @param data 数据模型
* @return 编译后内容
*/
public String compileThymeleafTemplate(String prefix, String template, Map<String, Object> data) {
ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
// 模板所在目录
resolver.setPrefix(StringUtils.isBlank(prefix) ? "static/" : prefix);
// 模板文件后缀
resolver.setSuffix(".js");
resolver.setCharacterEncoding("UTF-8");
TemplateEngine templateEngine = new TemplateEngine();
templateEngine.setTemplateResolver(resolver);
// 填充数据
Context context = new Context();
context.setVariables(data);
// 渲染模板
String javaScript = templateEngine.process(template, context);
return unicodeToString(javaScript);
}
/**
* 使用velocity编译模板
*
* @param templateName 模板名
* @param data 模板数据
* @return 模板内容
*/
public String compileVMTemplate(String templateName, Map<String, Object> data) {
VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
velocityEngine.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
velocityEngine.setProperty("input.encoding", "UTF-8");
velocityEngine.setProperty("output.encoding", "UTF-8");
velocityEngine.init();
Template template = velocityEngine.getTemplate(templateName);
// 设置数据
VelocityContext velocityContext = new VelocityContext(data);
//模板合并,得到期望文件
StringWriter sw = new StringWriter();
template.merge(velocityContext, sw);
return sw.toString();
}
/**
* unicode转字符串
*
* @param unicode unicode编码
* @return 字符串
*/
private String unicodeToString(String unicode) {
Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
Matcher matcher = pattern.matcher(unicode);
char ch;
while (matcher.find()) {
ch = (char) Integer.parseInt(matcher.group(2), 16);
unicode = unicode.replace(matcher.group(1), ch + "");
}
return unicode;
}
}
测试:
@Resource
private CompileJavaScriptTemplate compileJavaScriptTemplate;
/**
* 测试解析JavaScript
*/
@Test
public void parseJavaScript() {
Map<String, Object> data = new HashMap<>();
data.put("name", "测试列表");
data.put("array", new String[]{"张三", "李四", "王五", "老六"});
String result = compileJavaScriptTemplate.compileThymeleafTemplate("test", data);
log.info("result: {}", result);
}
@Test
public void compileVMTemplate() {
Map<String, Object> data = new HashMap<>();
data.put("name", "velocity");
data.put("time", "2019-09-24");
data.put("array", new String[]{"张三", "李四", "王五", "老六"});
String result = compileJavaScriptTemplate.compileVMTemplate("/templates/test.vm", data);
log.info("complie velocity: {}", result);
}
test.js
var name = [[${name}]];
var array = [[${array}]];
test.vm
var name = $!{name};
var time = ${time};
var array = ${array};
var array1 = [];
#foreach($item in $array)
array1.push(${item})
#end
上一篇: artTemplate模板引擎
下一篇: 使用art-template遇到的坑
推荐阅读
-
koa2使用ejs和nunjucks作为模板引擎的使用
-
SpringMVC中使用Thymeleaf模板引擎实例代码
-
JAVA velocity模板引擎使用实例
-
koa2使用ejs和nunjucks作为模板引擎的使用
-
smarty模板引擎中内建函数if、elseif和else的使用方法
-
使用velocity 和 thymeleaf模板引擎编译模板
-
SpringMVC中使用Thymeleaf模板引擎实例代码
-
SpringBoot+ Thymeleaf模板引擎使用介绍
-
[SpringBoot——Web开发(使用Thymeleaf模板引擎)]
-
Spring Boot thymeleaf模板引擎的使用详解