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