欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用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

 

 

相关标签: 模板引擎