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” ?>
        <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>
        <operationDate>$!ceb9000.operationDate</operationDate>
        <field1><![CDATA[$!ceb9000.field1]]></field1>
    </body>

定义模板填充元素对应的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使用示例