Velocity中加载vm文件的三种方式

时间:2022-10-16 23:17:54

Velocity中加载vm文件的三种方式:

 

a.  加载classpath目录下的vm文件

/**
     * 初始化Velocity引擎
     * --VelocityEngine是单例模式,线程安全
     * @throws Exception
     */
    public static void initVelocity() throws Exception {
        Properties p = new Properties();
        /**
         * velocity.properties配置定义
         * file.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
         * ENCODING_DEFAULT = UTF-8
         * OUTPUT_ENCODING = UTF-8
         */
        //加载classpath目录下的vm文件
        p.setProperty("file.resource.loader.class",
                "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
        //定义字符集
        p.setProperty(Velocity.ENCODING_DEFAULT, "UTF-8");
        p.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");
        // 初始化Velocity引擎,指定配置Properties
        Velocity.init(p);
    }

 

初始化成功后,使用:Velocity.getTemplate(templateFilePath); 加载文件!

b. 根据绝对路径加载 (vm文件置于硬盘某分区中,如:d:/template/test.vm)

Properties p = new Properties();
        // 初始化默认加载路径为:D:/template
        p.setProperty(VelocityEngine.FILE_RESOURCE_LOADER_PATH, "D:/template")
        p.setProperty(Velocity.ENCODING_DEFAULT, "UTF-8");
        p.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");
        // 初始化Velocity引擎,init对引擎VelocityEngine配置了一组默认的参数 
        Velocity.init(p);

初始化成功后,使用:Velocity.getTemplate("test.vm"); 加载文件!

c. 使用文本文件

   首先定义一个velocity.properties文件

  

input.encoding = UTF-8
file.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader

 

   然后,已流的形式加载该文件

Properties p = new Properties();
        // 加载properties文件
        p.load(this.getClass().getResourceAsStream("/velocity.properties"));
        // 初始化Velocity引擎,init对引擎VelocityEngine配置了一组默认的参数 
        Velocity.init(p);

 初始化成功后,使用:Velocity.getTemplate("test.vm"); 加载文件!

 

velocity定义了模板文件:*.vm,通过VelocityEngine加载该模板,以流的形式读取该模板,然后加载一个java对象,并将模板填充。

填充velocity模板,并输出模板内容,示例:

定义模板:

<?xml version=”1.0” encoding=“ISO-8859-1” ?>
<in>
    <head>
        <version>$!ceb9000.version</version>
        <InstID>$!ceb9000.instID</InstID>
        <trmSeqNum>$!ceb9000.trmSeqNum</trmSeqNum>
        <tranDate>$!ceb9000.tranDate</tranDate>
        <tranTime>$!ceb9000.tranTime</tranTime>
        <tradeCode>$!ceb9000.tradeCode</tradeCode>
        <servName>$!ceb9000.servName</servName>
        <reserve1><![CDATA[$!ceb9000.reserve1]]></reserve1>
        <reserve2><![CDATA[$!ceb9000.reserve2]]></reserve2>
        <reserve3><![CDATA[$!ceb9000.reserve3]]></reserve3>
    </head>
    <body>
        <operationDate>$!ceb9000.operationDate</operationDate>
        <field1><![CDATA[$!ceb9000.field1]]></field1>
    </body>
</in>

定义模板填充元素对应的Bean(部分代码,记得有get/set方法)

/**
     * 版本号,必填
     */
    private String version = "1.0.1";

    /**
     * 机构号:必填
     */
    private String instID;

    /**
     * 终端流水号:必填
     */
    private String trmSeqNum;

    /**
     * 交易日期:必填
     */
    private String tranDate;

    /**
     * 交易时间:必填
     */
    private String tranTime;

 

填充

/**
     * 业务模型 --> 模板(xml) -->请求银行报文xml字符串
     *
     * @param t
     * @return
     */
    protected String data2Msg(CebCommonReqObj t, String vmPath) {
        try {
            VelocityTemplateUtil.initVelocity();
        } catch (Exception e) {
            logger.error("查找Velocity模板失败", e);
            throw new ServerException(ServerErrorEnum.INTERNAL_ERROR);
        }

        // 创建一个上下文环境,此实例是非线程安全的(VelocityContext很重要,扮演一个将java对象数据传递到模板文件vm的角色)
        VelocityContext context = new VelocityContext();
        //要替换的变量和值放入context
        context.put("ceb9000", t);
        //创建一个字符串输出流,模板输出的目标
        StringWriter w = new StringWriter();
        try {
            // 通过一个InputStreamReader读取模板文件
            Reader reader = new InputStreamReader(this.getClass().getResourceAsStream(vmPath));
            // 根据模板上下文对模板求值,mylogTag字符串为发生异常时候记录模板异常提供方便
            Velocity.evaluate(context, w, "mylogTag", reader);
            String retXML = w.toString();//模板填充后,输出填充结果到字符串
            w.close();
            return retXML;
        } catch (IOException e) {
            logger.error("填充Velocity模板失败", e);
            throw new ServerException(ServerErrorEnum.INTERNAL_ERROR);
        }
    }

 

参考:

Veloocity官方使用文档

Velocity使用示例