JAVA集成velocity实现对已有模板替换(占位符变量)替换

 

 

平时我们如果有一些简单的模板替换需求,比如有个txt文件,或者代码生成模板文件 要根据传入的变量替换成具体的值 就可以使用这个框架

如果是太复杂的 比如替换word模板这种的,可以使用freemaker,参考:https://www.cnblogs.com/pxblog/p/12790904.html

 

依赖

 <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.0</version>
        </dependency>

 

 

把模板文件放在resource底下 ,命名改成以.vm结尾

template.txt.vm 内容如下

{name},你好

 

 

java类

VelocityInitializer.java

import org.apache.velocity.app.Velocity;

import java.util.Properties;

/**
 * VelocityEngine工厂
 */
public class VelocityInitializer {
    /**
     * 初始化vm方法
     */
    public static void initVelocity() {
        Properties p = new Properties();
        try {
            // 加载classpath目录下的vm文件
            p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
            // 定义字符集
            p.setProperty("input.encoding", "UTF-8");
            p.setProperty("output.encoding", "UTF-8");
            // 初始化Velocity引擎,指定配置Properties
            Velocity.init(p);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

 

 

使用方式

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

import java.io.StringWriter;

public class VelocityUtils {


    /**
     * 设置模板变量信息
     *
     * @param name 模板的变量值,这里也可以传对象 传对象的话 模板就需要使用${对象名.属性名}
     * @return
     */
    public static VelocityContext prepareContext(String name) {
        VelocityContext velocityContext = new VelocityContext();
        velocityContext.put("name", name);
        return velocityContext;
    }


    /**
     * 生成模板,使用方式
     *
     * @param name
     * @return
     */
    public static void generateTemplate(String name) {
            VelocityInitializer.initVelocity();

            //设置模板数据
            VelocityContext context = prepareContext(name);


            StringWriter sw = new StringWriter();

            //这里是模板存放的路径,如果是resource底下,直接这样写就可以
            Template tpl = Velocity.getTemplate("template.txt.vm", "UTF-8");

            //填充模板数据
            tpl.merge(context, sw);

            //这个就是变量替换后的模板内容,可以根据自己需求增加后面逻辑
            String template = sw.toString();

    }
}

 

 

velocity一些语法

遍历,判断遍历是不是最后一个元素,不是加","      

#foreach($url in $urls)
    "${url}"#if($foreach.count != $urls.size()),#end
  #end

 

posted @ 2023-07-10 19:04  yvioo  阅读(928)  评论(0编辑  收藏  举报