Velocity初探小結

velocity使用語法詳解

  做java開發的朋友一般對JSP是比較熟悉的,大部分人第一次學習開發View層都是使用JSP來進行頁面渲染的,我們都知道JSP是可以嵌入java代碼的,在遠古時代,java程序員甚至在一個jsp頁面上就完成了所有的業務邏輯代碼,能夠實用平臺的API,這是jsp的一個優點,所謂物極必反,這一點在某些方面也成了它的一個缺點,內容和表示的界限變得很模糊,使得mvc分層不夠徹底.

  Velocity的寫法比較接近java的語法,語法非常簡單,對於java開發人員來說,從一竅不通到上手使用velocity幾乎不需要花很多時間,還有很重要的一點,我覺得是velocity沒有很多的標籤,自由度比較高.

  Velocity渲染模板時,先把模板解析成一顆語法樹,然後去遍歷這棵樹,分別渲染每一個節點.

  我對velocity也屬於剛剛入門的階段,所以只是簡單的總結一下一些常用的語法和基礎知識.

#set 語法

  #set可以創建一個Velocity的變量,一般用於向一個變量或屬性賦值,下面的第一個例子,大概和java中的String name=user.getName();是一個意思.

  在Velocity語法樹中,#set表達式對應的是一個ASTSetDirective類,"="兩邊的表達式值,分別對應該類的兩個子節點,LHS和RHS.

  •     #set($user.name="zhangsan")   可以理解爲     user.setName("zhangsan")
  •     #set(name=name=user.name)         可以理解爲     user.getName();

   像上述例子中的第一個:不僅可以表示 user.setName("zhangsan"),還可以表示user.setname("zhangsan"),或者user.put("name","zhangsan"),這是動態語言的特點,不想java語法那樣嚴格的定義.

  注意:#set表達式,結尾不需要#end跟隨,其他表達式基本都需要加#end.

#foreach語法

  這是Velocity中唯一一種循環的語法,類似於java的增強for循環

複製代碼
#foreach($user in $userList)
    .....
#end
--------------------------------
基本和java中的for循環是一個意思
--------------------------------
for(User user:userList){
.....
}
複製代碼

  $userList變量的內容是一個數組, Hashtable 或者 Array. 分配給$user 變量的值是Java的對象和一個變量的引用.

  這裏userList是一個List,可以使用$foreach.count來進行簡單的循環計數.

  #if( $foreach.hasNext ),可以用來判斷是否是最後一次迭代.

  如果你想從零開始進行#foreach循環, 你可以使用 foreach.indexforeach.index代替foreach.count..

  同樣的, foreach.firstforeach.first和foreach.last也提供了foreach.hasNext方式.如果你想訪問#foreach外面的這些屬性, 你能夠引用它們通過foreach.hasNext方式.如果你想訪問#foreach外面的這些屬性, 你能夠引用它們通過foreach.parent或 foreach.topmost(foreach.topmost屬性(foreach.parent.index 或者 $foreach.topmost.hasNext)

  如果你的userList中有很多數據,但你只想遍歷前3條,那麼可以這麼寫:

複製代碼
#foreach( $user in $userList )
    #if( $foreach.count > 3 )
        #break
    #else
    .....
  
  #end #end
複製代碼

  

  注意:在#foreach中產生的變量只在foreach的作用範圍內有效

#if,#elseif,#else語法

  條件判斷語句,語法規則和java也是基本一致的,但是在判斷語句的處理上卻有很大不同.

  例如#if(user),user),這裏只要user變量的值不是null,或者不是false,那麼就爲true.

  表達式中支持很多條件判斷,如">","<","==","&&","||"等

#parse語法

  #parse語法的作用是引用其他模塊,比如你可以把多個vm文件中重複的代碼抽取出來,放到一個單獨的"common.vm"文件中,然後再在每一個模塊的對應位置使用#parse('common.vm')把公共模塊引入到當前模塊.

  需要特別注意的一點是,common.vm中的變量的值都可以由#paser()所在的vm文件模板的上下文中取得,也就是說,你只是把一段公共的vm代碼放在一個單獨的模板文件中,除此之外,和兩者在一個模板文件中沒有任何其他區別.

  另外#parse()中不僅能引入其他模板文件,也可以引入一個變量.同時需要記得一點,#parse引入的模板文件中,也可以包含#parse.

  說到了#parse就要提到另一個引入的指令#include,也是引入外部文件的意思,他們的區別總結如下:

    1.  #include()可以同時引入多個文件, #parse()只能一次引入一個文件(或變量).
    2.  #include引入的內容不會被Velocity的emplate engine即模板引擎處理, #parse引入的內容會被處理,也就是說#include引入的內容不能包含velocity語法,而後者,當然是可以的.

(轉)Velocity和jsp的區別:

  執行方式不一樣: JSP是編譯執行,Velocity是解釋執行.如果JSP文件被修改了,對應的java類就會重新編譯,而Velocity卻不需要,只是會重新生成一棵語法樹.

  執行效率不同:理論上來說,編譯執行的效率明顯好於解釋執行,在JSP中方法調用是直接執行的,而在velocity中使用反射執行的,從這方面來講JSP效率會明顯好於Velocity.如果JSP中有大量的jstl或者其他標籤的話,就不一定了.

  需要的環境支持不同:JSP的執行依賴Servlet環境,他需要ServletContext,request,response這些類.而渲染Velocity不需要其他環境的支持,所以說velocity的應用環境更廣.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章