◎筱米加步枪◎.Blog

Happy coding

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写一些小插件之类的。