Velocity中加載vm文件的三種方式


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使用示例

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM