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); } }
参考: