Velocity 模板引擎
Velocity是一个基于java的模板引擎(template engine),它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。它作为一款成熟的基于java的模板引擎,能够帮我们实现页面静态化,同时它将Java代码与网页分开,使网站在其生命周期内更加可维护,并为Java Server Pages(JSP)或PHP提供了可行的替代方案。
引擎
Velocity Engine
这是实现所有工作的实际模板引擎。
Velocity Tools
包含使用Velocity引擎构建Web和非Web应用程序的工具和其他有用的基础设施。在此找到例如Struts集成的代码或独立的VelocityViewServlet。
语法
1. 基本语法
# 关键字
Velocity关键字都是使用#开头的,如#set、#if、#else、#end、#foreach等
$ 变量
Velocity变量都是使用$开头的,如:$name、$msg
{}变量
Velocity对于需要明确表示的Velocity变量,可以使用{}将变量包含起来。如在页面中,需要有$someoneName这种内容,此时为了让Velocity能够区分,可以使用${someone}Name。
!变量
如果某个Velocity变量不存在,那么页面中就会显示$xxx的形式,为了避免这种形式,可以在变量名称前加上!如页面中含有$msg,如果msg有值,将显示msg的值;如果不存在就会显示$msg。这是我们不希望看到的,为了把不存在的变量显示为空白,可以使用$!msg。
2. 变量
变量定义
#set($root = "www")
#set($name = "index")
#set($template = "$root/$name")
$template
执行输出结果:
www/index
变量赋值
赋值的左边必须是一个变量,或者是属性的引用。右边可以是:变量引用、字面字符串、属性引用、方法引用、字面数字、数组
#set($name = $bill) ##变量引用
#set($name.pre = "monica") ##字符串
#set($name.last = $address.num) ##属性引用
#set($name.mid = $hotel.find($web)) ##方法引用
#set($name.num = 123) ##数字
#set($name.say = ["yes",$my,"yes"]) ##数组
velocity会将属性解释为属性的get方法,如:
$foo.Bar 等同于 $foo.getBar()
$foo.User("join") 等同于 $foo.getUser("join")
$foo.Request.ServerName 等同于 $foo.getRequest().getServerName()
3. 转义字符'\'
#set($mail = "foo")
$mail
\$mail
\\$mail
\\\$mail
执行结果如下:
foo $mail \foo \$mail
4. 循环
语法定义如下:
#foreach( 单个元素名称 in 集合)
....
#end
例子如下:
#foreach( $num in [2..-2])
this is $num.</br>
#end
执行结果如下:
this is 2.
this is 1.
this is 0.
this is -1.
this is -2
5. 条件
语法定义如下:
#if(condition)
......
#elseif(condition)
......
#else
......
#end
6. 关系和逻辑操作符
&& 并且 || 或者 ! 取反
7. 注释
1. 单行注释##
##这里写注释
2. 多行注释#* *#
#*
这个写注释 可以写多行的注释
*#
8. 宏
语法定义如下:
#macro(宏的名称 $参数1 $参数2 .....)
语句体(即函数体)
#end
宏调用如下:
#宏的名称 ($参数1 $参数2 .....)
例子
导入jar包:velocity-1.4.jar,velocity-dept.jar;log4j.jar
//test.java生成文件 public static void main(String[] args) { //获取模板引擎 VelocityEngine ve = new VelocityEngine(); //模板文件所在的路径 String path = "D:/work/velocity/WebRoot"; //设置参数 ve.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path); //处理中文问题 ve.setProperty(Velocity.INPUT_ENCODING, "GBK"); ve.setProperty(Velocity.OUTPUT_ENCODING, "GBK"); try { //初始化模板 ve.init(); //获取模板(hello.html) Template template = ve.getTemplate("hello.html"); //获取上下文 VelocityContext root = new VelocityContext(); //把数据填入上下文 root.put("name", "world"); //输出路径 String outpath = "e:/helloworld.html"; //输出 Writer mywriter = new PrintWriter(new FileOutputStream(new File(outpath))); template.merge(root, mywriter); mywriter.flush(); } catch(Exception e) { e.printStackTrace(); } }
//example.html 模板文件 <table cellspacing="0" cellpadding="5" width="20%" > <tr> <td bgcolor="#eeeeee" align="center"> Names: </td> </tr> #foreach($name in $theList) <tr> <td> $name </td> </tr> #end </table>
//TestVelocityServlet.java public class TestVelocityServlet extends VelocityServlet { /** * 由TestVelocityServlet.init()调用 * 在此找出模版的路径 */ protected Properties loadConfiguration(ServletConfig config) throws IOException, FileNotFoundException { //配置模板路径 Properties prop = new Properties(); String path = config.getServletContext().getRealPath("/"); prop.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path); return prop; } /** * Velocity主要的商业逻辑处理方法,由VelocityServlet自动调用 * @param ctx 模板上下文 * @return Template 模板信息 */ protected Template handleRequest(Context ctx) throws Exception { //主要在此设置演示用的数据,开发中在此调用相应的业务处理流程, //并设置返回到页面的数据 //待展示的列表数据 String p1 = "first"; String p2 = "second"; Vector personList = new Vector(); personList.addElement(new String(p1.getBytes())); personList.addElement(new String(p2.getBytes())); //定义模板 Template outty = null; //设置数据,供页面模版替换成显示的数据 ctx.put("theList", personList); try { //取模板 outty = getTemplate("example.html"); } catch (Exception e) { e.printStackTrace(); } return outty; } }
//web.xml <servlet> <servlet-name>SampleServlet</servlet-name> <servlet-class>com.huang.servlet.TestVelocityServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SampleServlet</servlet-name> <url-pattern>/a</url-pattern> </servlet-mapping>
总结
- Velocity将Java代码从Web 页面中分离出来,使用Web站点从长远看更容易维护,并且提供了一种可行的JavaServer Pages替代解决方案。
- Velocity是一种基于Java的模板引擎,但允许任何人使用简单而强大的模板语言来引用定义在Java代码中的对象。
- Velocity就是MVC架构的一种实现,但它更多的是关注在Model和View之间,作为它们的桥梁。
下一章:Velocity if else 标签
Java Velocity中if指令用于判断某个条件是否为true,允许在页面生成时,在IF条件为真的情况下包含文本。定义#if(condition) ......#elseif(condition ...