Velocity基础笔记
今天初步学了一下Velocity,顺手写了一些简单例子,主要是测试VTL(Velocity描述语言)的语法.
先来看看如何使用Velocity的:
//需要依赖的包:common.collections.jar,common-lang.jar public class VeloccityTest { public static void main(String[] args) { //创建引擎 VelocityEngine velocityEngine = new VelocityEngine(); //设定输入输出编码可支持中文 Properties prop = new Properties(); prop.setProperty(Velocity.ENCODING_DEFAULT, "utf-8"); prop.setProperty(Velocity.INPUT_ENCODING, "utf-8"); prop.setProperty(Velocity.OUTPUT_ENCODING, "utf-8"); //可以根据属性对象或者属性文件进行定义,原理是一样的. velocityEngine.init(prop); //取得VTL定义的文件获取模板对象 Template template = velocityEngine.getTemplate("/src/template.vm"); //新创一个Velocity上下文 VelocityContext velocityContext = new VelocityContext(); //放入VTL中定义的变量值 velocityContext.put("name", "ChenST"); velocityContext.put("address", "淘宝商城"); List<String> products = new ArrayList<String>(); products.add("百事可乐"); products.add("可口可乐"); //可放入一个ArrayList集合代表数组 velocityContext.put("products", products); Map<String, String> map = new HashMap<String, String>(); map.put("key", "mapValue"); //可放入一个Map结构的对象 velocityContext.put("map", map); People people = new People(); people.setName("张三"); //可放入一个自定义对象 velocityContext.put("people", people); StringWriter stringWriter = new StringWriter(); //根据模板定义的内容进行合并,并将结果输出给流对象 template.merge(velocityContext, stringWriter); System.out.println(stringWriter.toString()); } }
接下来再来看看具体的VTL是如何定义和描述的,(习惯将一些学习过程写在代码中...)
#####这个是注释##### #####parse脚本元素包含另一个VTL的本地文件###### 测试解析:#parse("/src/other.vm") #####include包含另外一个文件,只是文本包含,不进行解析###### 测试文本包含:#include("/src/other.vm"); #####set脚本元素定义变量##### #set($defaultDept = "技术部") #####引用变量值,可以是VTL中指定的,也可以是Java程序中注入上下文的值##### #####可以$name也可以${name},后者比较规范##### 测试获取变量值:你好, $name,欢迎来到 $address,默认部门:$defaultDept #####判定元素if-else-end##### #set($i = 1) #set($j = 2) #if( $i == $j) 测试判定元素:i值和j值相等 #else 测试判定元素:i值和j值不相等 #end #####VTL变量的算数运算###### #set($plus = ${i}+${j}) #set($minus = ${i}-${j}) #set($multi = ${i}*${j}) #set($divis = ${i}/${j}) 测试运算: 加法运算:结果:${plus} 减法运算:结果:${minus} 乘法运算:结果:${multi} 除法运算:结果:${divis} #####foreach-end脚本元素用于循环操作,products是一个ArrayList##### #####velocityCount变量的名字是Velocity默认的名字,可以通过修改velocity.properties文件来改变它### #####directive.foreach.counter.name = velocityCount ##### #####directive.foreach.counter.initial.value = 1 ##### 测试循环元素: #foreach($product in $products) 第$velocityCount条记录 - ${product} #end #####使用.有两种含义,一种可以是HashMap,HashTable这种结构,另外一种可以是对象的属性值或者方法##### 测试Map的值:${map.key} 测试对象的值:${people.name} 测试对象方法:${people.call()} #####macro元素标签可用于定义一个可重用的模板,如reTemp为模块名,可跟任意个参数##### #macro(reTemp $parm1 $parm2) 测试定义可重用模板,参数:${parm1},${parm2} #end #####使用定义的可重用的模块##### #reTemp(${i} ${j}) #####可以使用中括号操作符表示一个范围,默认增量为1##### 测试范围元素: #foreach ( $foo in [3..1]) $foo #end #####$test和$!的区别:前者找不到时原串输出,后缀如果找不到输出空串##### 找不到test变量值输出:$test 找不到test变量值输出:$!test |
另外一个被引用的文件
测试引用其他文件:你好, $name,欢迎来到 $address |
感觉Velocity还是挺好的..可以自己一定一些模板,比如java代码,XML代码之类的都可以.可以自己试着做一些小工具,生成自己开发模式的一些代码.还可以结合Eclipse写一些小插件之类的。