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);
}
}
参考:
Velocity中加载vm文件的三种方式的更多相关文章
- 转 Velocity中加载vm文件的三种方式
Velocity中加载vm文件的三种方式 velocitypropertiespath Velocity中加载vm文件的三种方式: 方式一:加载classpath目录下的vm文件 Prope ...
- Hadoop生态圈-注册并加载协处理器(coprocessor)的三种方式
Hadoop生态圈-注册并加载协处理器(coprocessor)的三种方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 到目前为止,大家已经掌握了如何使用过滤器来减少服务器端通过 ...
- ios网络学习------4 UIWebView的加载本地数据的三种方式
ios网络学习------4 UIWebView的加载本地数据的三种方式 分类: IOS2014-06-27 12:56 959人阅读 评论(0) 收藏 举报 UIWebView是IOS内置的浏览器, ...
- 加载xib文件的两种方式
一.加载xib文件的两种方式 1.方法一(NewsCell是xib文件的名称) NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@&quo ...
- Spring加载properties文件的两种方式
在项目中如果有些参数经常需要修改,或者后期可能需要修改,那我们最好把这些参数放到properties文件中,源代码中读取properties里面的配置,这样后期只需要改动properties文件即可, ...
- 加载properties文件的三种方法
源代码: package a.one; import java.io.FileInputStream; import java.io.InputStream; import java.util.Pro ...
- iOS --- UIWebView的加载本地数据的三种方式
UIWebView是IOS内置的浏览器,可以浏览网页,打开文档 html/htm pdf docx txt等格式的文件. safari浏览器就是通过UIWebView做的. 服务器将MIM ...
- 加载gif动画的三种方式
GifView.h/** * 调用结束就开始播放动画,如果需要用户指定何时播放的话,只需要把timer的开始放到合适的位置.通过对CFDictonaryRaf 也就是gifProperties的改变, ...
- windows/tomcat 修改java虚拟机JVM以utf-8字符集加载class文件的两种方式
1.情景展示 做了这么长时间的java开发,但是,你知道JVM是以怎样的编码加载.解析class文件的吗? 我们知道,通常情况下,我们会将java文件的字符集修改成utf-8,这样,理所当然地就认 ...
随机推荐
- 前端技巧-w3c
1.使用全等===比较符 if (zeroAsAString === 0) { // 判断为false }在和null进行比较的时候,允许使用 == 比较符 2.使用 .parseInt() 的时候, ...
- 从c到cpp对static 关键字的总结 需要整理下!!!!!!!!!!!!!!!!!!!!!!
一个完整的程序,在内存中的分布情况如下: 具体分布图 自己看书去!!!!!1.栈区: 由编译器自动分配释放,像局部变量,函数参数,都是在栈区.会随着作用于退出而释放空间.3.堆区:程序员分配并 ...
- c++ primer 中讲的顶层const 和 底层 const 理解
c++ primer 中讲的 顶层const 和 底层 const 以前没搞懂的顶层const和底层const,这次看了后感觉明白了. 首先,const是一个限定符,被它修饰的变量的值不能改 ...
- MapReduce的主要的六个类讲解
a.InputFormat类.该类的作用是将输入的文件和数据分割成许多小的split文件, 并将split的每个行通过LineRecorderReader解析成<Key,Value>,通过 ...
- cad 安装失败/出错/卸载 2018/2017/2016/2015/2013/2012
AUTO Uninstaller 更新下载地址 1.选择CAD 2.选择版本 3.点击“开始卸载”
- UGUI RectTransform 矩形变换
UGUI游戏对象基本都有这个组件. float radius; radius = GetComponent<RectTransform>().sizeDelta.x; radius = ( ...
- 微信小程序全选多选效果
效果图: 代码: wxml <view class='hei_top'> <view class='hei_p'>共 <text>4</text> 场& ...
- SSIS 错误代码 DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER
[OLE DB 源 [2]] 错误: SSIS 错误代码 DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER.对连接管理器“test.trade_sh ...
- 北航oo作业第一单元小结
前言 在经过了三次艰辛的oo作业后,oo课程的第一单元告一段落,这一单元,我作为一个oo小白,开始了解oo的编程思想,也有了自己的一点心得体会.把笔粗成字,不当之处,还请各位大佬多多指教. 一.分析程 ...
- css随堂笔记(一)
Css初体验第一天 1 css初识:css主要用于设置HTML页面中文本内容,图片的外形,以及版面的布局等外观显示样式 Css样式规范:h1{属性:值} 2 css的三总书写方式:1 行内样式 将样 ...