官网:http://velocity.apache.org
1 Velocity 是什么?
Velocity是一个基于Java的模板引擎。
2 用途
Velocity将Java代码与网页分开,使网站在其生命周期内更加可维护,并为Java Server Pages(JSP)或PHP提供了可行的替代方案。
3 应用场景
①当Velocity用于Web开发时,Web设计人员可以与Java程序员并行工作,以根据模型 - 视图 - 控制器(MVC)模型开发Web站点,这意味着网页设计人员可以专注于创建一个看起来很好的站点,程序员可以专注于编写一流的代码
②它可以用于从模板生成SQL,PostScript和XML。它可以用作生成源代码和报告的独立实用程序,也可以用作其他系统的集成组件。例如,Velocity为各种Web框架提供模板服务,使他们能够根据真正的MVC模型,使视图引擎促进Web应用程序的开发。
4 使用说明
第一步:引入velocity-1.7 和 velocity-1.7-dep jar包
第二步:声明一个bean 作用是用来填充数据
第三步:调用
// 填充工具操作
public class TemplateTool {
public static String fill(VelocityContext context, String tmdir, String tmFile){
String result = "";
try {
Properties p = new Properties();
p.setProperty("file.resource.loader.path", tmdir);
// 引擎
VelocityEngine ve = new VelocityEngine();
ve.init(p);
//模板
Template t = ve.getTemplate(tmFile);
// 将输入写入模板中
StringWriter writer = new StringWriter();
t.merge(context, writer);
result = writer.toString();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static String fill(VelocityContext context, String tmdir, String tmFile, String inputEncode, String ouputEncode){
String result = "";
try {
Properties p = new Properties();
p.setProperty("file.resource.loader.path", tmdir);
p.setProperty("ISO-8859-1", "UTF-8");
p.setProperty("input.encoding", inputEncode);
p.setProperty("output.encoding", ouputEncode);
VelocityEngine ve = new VelocityEngine();
ve.init(p);
Template t = ve.getTemplate(tmFile);
StringWriter writer = new StringWriter();
t.merge(context, writer);
result = writer.toString();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static String fill(VelocityContext context, String templateString){
String result = "";
try {
VelocityEngine ve = new VelocityEngine();
ve.init();
StringWriter writer = new StringWriter();
StringReader reader = new StringReader(templateString);
ve.evaluate(context, writer, "temp", reader);
result = writer.toString();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static String test(int i){
return "array:" + i;
}
private String getCancelRequestMsg(CancelRequestDTO request) {
// 定义局部变量
String templatePath = "/template/cancel"; // 报文模板路径
String templateFileName = "cancel_hesitation_request.xml"; // 报文模板文件名
String requestXml = "";
// 构建请求报文,并转换成报文字符串
VelocityContext context = new VelocityContext();
context.put("seatDept", request.getSeatDept());
context.put("seatCode", request.getSeatCode());
context.put("insu", request.getInsu());
context.put("subject", request.getSubject());
/*context.put("traDate", DateUtils.dateToString("yyyyMMdd", request.getTraDate()));*/
context.put("trans", request.getTrans());
context.put("policyNo", request.getPolicyNo());
context.put("serviceId", request.getServiceId());
// context.put("productNum", request.getProductNum().get(0));
// context.put("withdrawMoney", request.getWithdrawMoney().get(0));
templatePath = System.getProperty("user.dir")+"/WebContent"+templatePath;
requestXml = TemplateTool2.fill(context, templatePath, templateFileName, "GBK", "GBK");
// requestXml = TemplateTool.fill(context, this.getClass().getResource(templatePath).getPath(), templateFileName, "GBK", "GBK");
// requestXml = TemplateTool.fill(context, templatePath, templateFileName, "GBK", "GBK");
// LogTool.inf(this.getClass(), "getCancelRequest is: " + requestXml);
// if (requestXml == null || "".equals(requestXml)) {
// errorLogTool.addErrorLog("填充模板出错,模板路径:" + templatePath
// + templateFileName, ConstantTool.ErrorTemplateFill);
// return null;
// }
System.out.println(requestXml);
// 返回报文字符串
return requestXml;
}
public static void main(String[] args) {
ArrayList productNumList = new ArrayList();
productNumList.add("ProductNum1");
productNumList.add("ProductNum2");
productNumList.add("ProductNum3");
ArrayList withdrawMoneyList = new ArrayList();
withdrawMoneyList.add("withdrawMoney1");
withdrawMoneyList.add("withdrawMoney2");
withdrawMoneyList.add("withdrawMoney3");
CancelRequestDTO cancelRequestDTO = new CancelRequestDTO();
cancelRequestDTO.setSeatDept("SeatDept1");
cancelRequestDTO.setSeatCode("SeatCode1");
cancelRequestDTO.setInsu("insu1");
cancelRequestDTO.setSubject("subject1");
cancelRequestDTO.setTrans("Trans1");
cancelRequestDTO.setPolicyNo("policyNo1");
cancelRequestDTO.setServiceId("ServiceId1");
// cancelRequestDTO.setProductNum(productNumList);
// cancelRequestDTO.setWithdrawMoney(withdrawMoneyList);
TemplateTool2 templateTool = new TemplateTool2();
templateTool.getCancelRequestMsg(cancelRequestDTO);
}
}
实体类
public class CancelRequestDTO {
private String seatDept;
private String seatCode;
private String insu;
private String subject;
/*private Date traDate;*/
private String trans;
/*private Date validateTime;*/
private String policyNo;
private String serviceId;
/*private List productNum;
private List withdrawMoney;*/
private ArrayList
${seatDept}
${seatCode}
${insu}
11
${subject}
${trans}
$!{policyNo}
11
$serviceId
#foreach($item in $jobs)
$item.get("productNum")
$item.get("withdrawMoney")
#end
5 语法说明
① 变量
#set($!{name} = "velocity")
#set($!{foo} = $bar)
#set($foo =“hello”)
#set($foo.name = $bar.name)
#set($foo.name = $bar.getName($arg))
#set($foo = 123)
#set($foo = [“foo”,$bar])
#set($greet = 'hello')
#set($名字=“”)
#set($!{}名字=“”)
面代码中 $!{}的写法,使用$vari获取变量时,如果变量不存在,Velocity引擎会将其原样输出,
通过使用$!{}的形式可以将不存在的变量变成空白输出.
② 循环
#foreach($item in $list)
$item
$velocityCount
#end
$item代表遍历的每一项,
velocityCount是Velocity提供的用来记录当前循环次数的计数器,默认从1开始计数,可以在velocity.properties文件中修改其初始值
③条件控制语法
使用条件语法对流程进行控制
④宏
在Velocity中也有宏的概念,可以将其作为函数来理解
⑤parse和include指令 (可以和jsp的动静态包含联系在一起)
在Velocity中可以通过parse或者include指令引入外部vm文件,
但是二者存在区别:include指令会将外部文件原样输出,
而parse指令会先对其进行解析再输出(即对外部文件中的vm语法解析)
6 使用特殊情况
① 当变量没有值时候,不输出
② 语法不在意文件格式,可以在任意格式文件输出
③ list中放置map ,并且map循环展示取值
④TemplateTool.fill 在填充时候的模板路径是个难点,要注意下
ArrayList