日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

velocity 继续之 语法学习篇

發布時間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 继续之 语法学习篇的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。