注释
单行注释为 ##,多行注释为#* *#,被注释的内容不会被模板引擎解析,文档注释是:如下:
#**
*@author xxx
*@version 5
*#
变量、属性、方法的引用
VTL 可以对变量、属性、方法进行引用。显示输出一个变量时,输出它的 toString 方法。这和 System.out.print()类似。输出一个属性时,该属性必须是可访问的,或者其 get 方法是可访问的,引用一个方法则会显示该方法的输出结果。
案例:
person 实体类
package com.wuk.entity;
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public String sayHello(String say){
return say+"is a boy";
}
}
DemoServlet.java
package com.wuk.velocity;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.wuk.entity.Person;
@WebServlet("/DemoServlet")
public class DemoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Person person=new Person();
person.setAge(12);
person.setName("wuk");
request.setAttribute("person", person);
request.getRequestDispatcher("/WEB-INF/hello.vm").forward(request, response);
}
}
hello.vm
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>Test Velocity</title>
</head>
<body>
<p>$person</p>
<p>$person.name</p>
<p>$person.toString()</p>
<p>$person.sayHello("wuk")</p>
</body>
</html>
从这个案例可以看出 在velocity页面中不仅仅可以调用对象,甚至都可以直接调用对象的方法,甚至还可以传参。
#set()的用法
除了可以像$person 这样引用一个对象实例,还可以用#set()在模板上下文中设置一个对象。
#set($person = "Tom")
$person
还可以设置一个 List 或 Map 对象,可以调用其 get()、isEmpty()等方法
##设置list集合对象
#set($l=["a", "b", "c"])
##设置Map集合对象
#set($s={"a":"aaa", "b":"bbb", "c":"ccc"})
<p>$l.get(1)</p>
<p>$l.isEmpty()</p>
<p>$s.get("a")</p>
输出结果:
b
false
aaa
#if()...elseif()...else...#end
#set($a = 10)
#if($a > 0)
<p>bigger than 0</p>
#elseif($a > 5)
17
<p>bigger than 5</p>
#elseif($a == 10)
<p>equals to 10</p>
#else
<p>others</p>
#end
判断只能比较相同类型的变量,如果==两端变量类型不同,则直接返回 false。对于字符串类型,字符串内容相同则返回 true。对于由 servlet 传入的类型,比如一个叫做 User的 JavaBean,比较实际上是调用其 equals()方法,所以如果可以通过重写 User 的 equals()和 hashCode()方法改变该判断的行为。
比如:
#set($a="aaa")
#set($b="aaa")
#if($a==$b)
<p>true</p>
#end
结果为true
判断逻辑同样可以使用 Java 中的&& || !进行逻辑的组合。
#foreach($xxx in $xxxList)...#end
和 Java 相同,循环可以使用 foreach。用 foreach 迭代输出 List 和 Map。
#set($list=["a","b","c"])
#set($map={"a":"aaa","b":"bbb","c":"ccc"})
##List集合的遍历
<ul>
#foreach($l in $list)
<li>$l</li>
#end
</ul>
##Map集合也可以进行循环遍历 遍历的是值
</ul>
#foreach($m in $map)
<li>$m</li>
#end
</ul>
##Map集合
<ul>
#foreach($m in $map.keySet())
<li>$m: $map.get($m)</li>
#end
</ul>
迭代的过程中,velocity 给定了一个变量 velocityCount 来记录迭代次数。当然你也可以自己定义一个变量进行记录。同时还有一个 velocityHasNext 可以用来判定迭代是否完成。例子如下:
##List集合的遍历
<ul>
#foreach($l in $list)
<li>$velocityCount</li>
<li>$l</li>
<li>$velocityHasNext</li>
#end
</ul>
我们可以利用 velocityCount 产生格行变色的效果。
##List集合的遍历
<table border="1" height="100px" width="100px">
#foreach($l in $list)
<tr style="background-color:
#if($velocityCount%2==0)
#c3f3c3"
#else
#f3c3f3"
#end
>
<td>$l</td>
</tr>
#end
</table>
不过通常建议应该由 CSS 和 JS 进行布局外观的控制控制。
#include()和#parse()
#include()
和#parse()
都是用于引入一段文本文件,但#include()引入的文本不会被模板引擎渲染,#parse()
则引入一段可以被渲染的文本。
例子如下:
/WEB-INF/views/module.vm
#set($list=["aaa", "bbb", "ccc"])
<ul>
#foreach($l in $list)
<li>$l</li>
#end
</ul>
/WEB-INF/views/test.vm
#include("/WEB-INF/views/module.vm")
#parse("/WEB-INF/views/module.vm")
#stop
该指令可以停止模板引擎,主要用于调试。模板引擎停止后,不会输出任何后面的内容。例子如下:
#set($list=["aaa", "bbb", "ccc"])
<ul>
#foreach($l in $list)
<li>$l</li>
#stop
<li>$l</li>
#end
</ul>
<p>test</p>
宏定义
熟悉 C 语言就应该知道宏定义的用途,C 语言中宏定义就是文本的替换,可以用来设定常量,甚至将一些函数封装到宏定义。velocity 的宏定义也是文本替换,但写法则更类似于直接定义函数。
例子如下:
##宏的定义
#macro(show_table $list)
<table border="1" height="100px" width="100px">
#foreach($l in $list)
<tr style="background-color:
#if($velocityCount%2==0)
#c3f3c3"
#else
#f3c3f3"
#end
>
<td>$l</td>
</tr>
#end
</table>
#end
#set($list=["a","b","c","e"])
##宏的引用
#show_table($list)
#set($list1=["1","2","3","4"])
#show_table($list1)
通过宏定义,我们可以把一些公用的部分抽取出来进行封装,重复利用。宏定义声明的参数可以是变量,List,Map,基本 Java 类型和字符串。