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

  • 相关阅读:
    js 获取时间差
    linq 两个list合并处理,并分组
    单例模式 双锁
    2018年的读书清单
    感悟
    asp.net使用Microsoft.mshtml提取网页标题等解析网页
    //利用反射快速给Model实体赋值
    C# url接口调用
    多字段动态查询
    对图片的操作
  • 原文地址:https://www.cnblogs.com/huahua035/p/4815582.html
Copyright © 2020-2023  润新知