velocity 继续之 语法学习篇
1.變量
在變量的定義中,我們用#set指令.比如#set($name="laizhd")
如果只寫#set($name)或#set($name = null)會拋出org.apache.velocity.runtime.parser.ParseException異常
如果在雙引號中的字符串字面量中出現了變量的名稱,該變量名稱將被解析,比如#set($fullname = "lai-$name"),將對字符串里的$name進行解析,最后$fullname的值是"lai-laizhd".
當然,從$name = "laizhd" 中,我們可以得知velocity中的變量是弱類型的,因為我們并不需要特別指明$name是字符串類型.如果我們要給一個變量賦值整形,可以直接給數字的字面量,而不用加以引號,比如#set($num = 123).
還有,因為是弱類型,所以在#set($name = 'laizhd'")之后,我又加了一句#set($name = 123)是不后報錯的,而且后面的值會都以$name = 123 為準進行引用.
另外,在賦值表達式的右邊,其類型除了有字符串,整型以外,還可以有變量引用,如$name = $num;可以用屬性引用,如$people.ID = $Student.ID;可以用方法引用,如$people.ID = $student.getID($name);還可以是數組列表,如$string.list = ["a","b","c"]
剛剛把所有的情況都實驗了一遍,其它的都還很好理解,但對于屬性和方法這一塊,需要做一個探究.
屬性只能是來自于java中所定義的屬性,而且要知道,在模版中調用一個屬性的引用,在實際上它還是把這個屬性當前一個方法來調用.
比如調用$student.Name并不是說在Student對象中真的有一個Name成員,而是模版調用了Student的getName()方法,所以它$student.Name其實是$student.getName()方法調用的一個簡寫.
我實驗用的Temple代碼如下:
#set($boy = "lai")
Hello $name! Welcome to $site world!
$boy and the $girl
##字符串賦值
#set($test = "test")
stirng = $test
##數值賦值
#set($test = 123)
number = $test
##變量引用賦值
#set($test = $boy)
test = $test
##屬性引用
#set($student = $stu)
id = $stu.ID;
id = $student.ID
##方法引用
#set($info = $stu.toString("lai"))
info = $info
##數組引用
#set($list = ["a",123,"b",$stu,$stu.ID,$stu.Name])
#foreach ($element in $list)
??? This is $element.
#end
實驗用的java代碼如下:
import java.io.StringWriter;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
public class VelocityTest {
??? public static void main(String[] args) throws Exception {
???????
??????? /* first, get and initialize an engine */
??????? VelocityEngine ve = new VelocityEngine();
??????? ve.init();
??????? /* next, get the Template */
??????? Template t = ve.getTemplate("hello.vm");
??????? VelocityContext context = new VelocityContext();
??????? context.put("name", "紫蝶_妖兒");
??????? context.put("site", "http://ctfzh.cnblogs.com");??????
??????? Student stu = new Student(23,"lai");
??????? context.put("stu", stu);?????
??????? /* now render the template into a StringWriter */
??????? StringWriter writer = new StringWriter();
??????? t.merge(context, writer);
??????? System.out.println(writer.toString());?????
??????? /* create a context and add data */???????
??????? /* show the World */?????
??? }
}
public class Student {
??? public int ID;
??? public String Name;
??? public Student(int id,String name) {
??????? ID = id;
??????? Name = name;
??? }
???
??? public int getID()
??? {
??????? return ID;
??? }
???
??? public String getName()
??? {
??????? return Name;
??? }
???
??? public String toString(String str)
??? {
??????? return str + ID + Name;
??? }
}
2.循環.
在上面的例子中已經有出現過,主要是通過#foreach指令來完成.我們要用來遍歷的變量可以對應于java中Vector,Hashtable,或者Array
在Velocity中,還提供了一種特別的循環方式:
#set($bar = [0..3]); ##表示是的bar是個從0到3的數組
#set($bar = [2..-2]); ##表示的是bar是個從2到時-2的數組
另外有一個預定義的變量$velocityCount,自動記錄循環次數.
3.嵌套
velocityCount支持嵌套,比如循環嵌套
4.條件語句,#if,#elseif,#else.
5.注釋
##相當于代碼里的//
#*?? *# 相當于代碼里的/*? */
6.關系邏輯操作符
有AND,OR,NOT操作符
7.宏
velocity支持宏定義,不過在這里我們可以把它當前是一種函數來使用.
對宏定義的格式:
#macro(宏的名稱 $參數1 $參數2 ...)
語句體
#end
對宏的調用:
#宏的名稱($參數1 $參數2 ...)
實驗代碼:
#macro(mac $a $b)
??? $a loves $b ;
#end
#mac("lai" "tong")
這里有個要特別注意的地方,就是參數之間用空格來分開,而不是平時所習慣的逗號
8.#stop指令
這個指令表示停止執行模板并返回,可以用于幫助debug
9.#include 與 #parse
#include是把一個文件包含進來,但模板引擎不會對文件里的內容進行解析渲染.
#include一次可以包含多個文件,文件名間使用逗號間隔,使用例子如下:
#include("one.gif","included.vm")
在對當前文件進行解析時候,如果遇到include就會把#include所指定的文件的內容給直接copy進來.
#parse一次只能包含一個文件,模版引擎會對parse進來的文件內容進行velocity語法上的解析渲染.
可以復用#parse進行遞歸調用,在遞歸調用的過程中,于外部聲明的變量可以被內部所調用,同時如果內外層出現同名的變量名里,內部變量會覆蓋外部變量.
10.轉義字符
如果引用變量已經被定義,如$boy已經被定義,且值為"lai",則\$boy會輸出lai.
如果$boy未被定義,則會直接輸出\$boy.
其它場合轉義字符的用法與java中相似.
11.內置對象.
對于vm中的內置對象,這可能要進一步深入的學習才知道怎么使用了,至少目前還是不懂的,畢竟我才接觸了兩天.
12.數組
因為velocity歸根只能訪問對象的方法,而數組又就一個特殊的Array,在對固定位置元素的訪問的時候調用了Array的get(Object array,int index)方法,但velocity沒辦法提供這樣的訪問,所以要么對數組進行其它方式的包裝,要么就通過公用Util類的方式來提供(這句話我不是很明白),傳入數組對象和要訪問的位置參數,從而達到返回所需值的目的.
?
這么用大概是知道了,不過具體velocity是做什么的,這是什么,它存在的意義到底是什么,這個還對其進一步的學習...
轉載于:https://www.cnblogs.com/laizhd/archive/2011/08/17/2143518.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的velocity 继续之 语法学习篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css里slidebottom,jque
- 下一篇: 随时看看,乐观向上