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

  • 相关阅读:
    什么是webview
    juqery.fn.extend和jquery.extend
    LeetCode
    5. Longest Palindromic Substring
    42. Trapping Rain Water
    11. Container With Most Water
    621. Task Scheduler
    49. Group Anagrams
    739. Daily Temperatures
    3. Longest Substring Without Repeating Characters
  • 原文地址:https://www.cnblogs.com/huahua035/p/4815582.html
Copyright © 2020-2023  润新知