velocity学习(2)--VTL 语法
注釋
單行注釋為 ##,多行注釋為#* *#,被注釋的內容不會被模板引擎解析,文檔注釋是:如下:
#** *@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;}@Overridepublic 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()方法改變該判斷的行為。
比如:
結果為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
/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 類型和字符串。
總結
以上是生活随笔為你收集整理的velocity学习(2)--VTL 语法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html语言计算圆周长和面积,纯JSP实
- 下一篇: Android动画之仿美团加载数据等待时