使用velocity 和 thymeleaf模板引擎編譯模板

在項目中會經常用到用模板編譯文件,本文使用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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章