天天看點

Velocity模闆學習表現層的三種主要技術

Velocity模闆學習

  • 表現層的三種主要技術
    • Velocity模版語言(VTL)詳細學習
(本篇文章學習自https://www.cnblogs.com/avivaye/p/4418878.html)

)

表現層的三種主要技術

jsp、freemarker、velocity。其中velocity性能最好,其次是jsp。

在伺服器端可以使用 Velocity 處理模闆和生成的動态内容(HTML、XML等)。這和 JSP 技術的目标非常接近。但是,JSP 模型可以毫無阻礙地通路底層的 Servlet API 和 Java 程式設計語言。它基本上是一種在很大程度上開放的通路模型。而作為一種完全自包含的模闆引擎和腳本解釋器,Velocity 擁有完全封閉的模型。任何針對系統和/或 Java 程式設計語言的通路都必須明确地啟用。預設情況,Velocity 模闆中不能通路 Java 程式設計語言的任何方面。這種封閉的模型使 Velocity 能夠提供分離的模闆表示層,與任何應用程式業務邏輯或者資料管理代碼清晰地劃分開。進而保證了web site 的長期可維護性.

第一次解釋jsp需要經過轉換成java代碼,再編譯成class檔案等步驟,而velocity則在速度上更快,因為它不需要經過像解釋jsp頁面那麼多的步驟。

jsp是大家最熟悉的技術

優點:

1、功能強大,可以寫java代碼

2、支援jsp标簽(jsp tag)

3、支援表達式語言(el)

4、官方标準,使用者群廣,豐富的第三方jsp标簽庫

5、性能良好。jsp編譯成class檔案執行,有很好的性能表現

缺點:沒有明顯缺點,非要挑點骨頭就是,由于可編寫java代碼,如使用不當容易破壞mvc結構。

velocity是較早出現的用于代替jsp的模闆語言

優點:

1、不能編寫java代碼,可以實作嚴格的mvc分離

2、性能良好,據說比jsp性能還要好些

3、使用表達式語言,據說jsp的表達式語言就是學velocity的

缺點:

1、不是官方标準 2、使用者群體和第三方标簽庫沒有jsp多 3、對jsp标簽支援不夠好

freemarker 也是一種模版引擎語言

優點:

1、不能編寫java代碼,可以實作嚴格的mvc分離

2、性能非常不錯

3、對jsp标簽支援良好

4、内置大量常用功能,使用非常友善

5、宏定義(類似jsp标簽)非常友善

6、使用表達式語言

缺點:

1、不是官方标準 2、使用者群體和第三方标簽庫沒有jsp多

Velocity模版語言(VTL)詳細學習

  1. 定義變量 :文法符号用為兩類,一類用#開頭,代表控制符号,#set表示定義變量,另一類用美元符開頭,通常用于顯示輸出變量;

    #set($a='100') ,#set ( $str= “Velocity” )

    $a ,$str

    值分别為100和Velocity
  2. 注釋用法 :

    單行注釋:## 内容

    多行注釋:#* 内容 * #

    文檔格式:#** 内容 *#

  3. 引用标記
${mudSlinger}     變量
${customer.Address}   屬性
${purchase.getTotal()}   方法入代碼片
           
  1. 基礎文法 :
  1. 條件語句

#if ( $foo ) 1 #else 2 #end

上例中的條件語句将在以下兩種條件下成立:

1.$foo是一個boolean型的變量,且它的值為true

2.$foo變量的值不為null

#if( $foo < 60 ) 完蛋了 #elseif( $foo == 60 ) 萬幸 #else 浪費 #end

  1. 循環語句

    #foreach ( $product in a l l P r o d u c t s ) 這 是 第 allProducts ) 這是第 allProducts)這是第velocityCount次循環,值為: $product

    #end

每次循環 a l l P r o d u c t s 中 的 一 個 值 都 會 賦 給 allProducts中的一個值都會賦給 allProducts中的一個值都會賦給product變量。

$velocityCount 變量的名字是Velocity預設的名字,你也可以通過修改velocity.properties檔案來改變它。預設情況下,計數從“1”開始,但是你 可以在velocity.properties設定它是從“1”還是從“0”開始。下面就是檔案中的配置:

directive.foreach.counter.name = velocityCount

directive.foreach.counter.initial.value = 1

周遊數組:

#set($list = ["hello", "velocity", "world"])
#foreach ($item in $list)
$velocityCount . $item <br/>
#end
           

其中velocityCount為索引變量

  1. 關系、邏輯運算符

相等 == 不等 != 且 && 或|| 非 !

  1. include

#include script element允許模闆設計者引入本地檔案。被引入檔案的内容将不會通過模闆引擎被render。為了安全的原因,被引入的本地檔案隻能在TEMPLATE_ROOT目錄下。

#inclued ( “one.txt” )

如果您需要引入多個檔案,可以用逗号分隔就行:

#include ( “one.gif”, “two.txt”, “three.htm” )

在括号内可以是檔案名,但是更多的時候是使用變量的:

#inclue ( “greetings.txt”, $seasonalstock )

  1. parse

    #parse script element允許模闆設計者一個包含VTL的本地檔案。Velocity将解析其中的VTL并render模闆。

    #parse( “me.vm” )

    就像#include,#parse接受一個變量而不是一個模闆。任何由#parse指向的模闆都必須包含在TEMPLATE_ROOT目錄下。與#include不同的是,#parse隻能指定單個對象。

    你可以通過修改velocity.properties檔案的parse_direcive.maxdepth的值來控制一個template可以包含的最多#parse的個數――預設值是10。#parse是可以遞歸調用的

  2. Range Operator

#foreach ( $bar in [2…-2] ) $bar #end

結果:2 1 0 -1 -2

#set ( $arr = [0…1] )

#foreach ( $i in $arr ) $i #end

結果:0 1

  1. 内置對象

velocity内置了一些對象,在vm模版裡可以直接調用,列舉如下:

r e q u e s t 、 request、 request、response、$session,另外,模闆内還可以使用 $msg内的消息工具通路 Struts 的國際化資源,達到簡便實作國際化的方法。

  1. 四則運算

直接進行四則運算将會預設為字元串連接配接,是以運算應該是如下的方式解決。

如果 f o o = 2. 則 foo=2.則 foo=2.則foo + 1 結果是21,而不是3.

需要先#set ( $value = f o o + 1 ) , 然 後 foo + 1 ) ,然後 foo+1),然後value 結果才是3

  1. 解析步驟

當Velocity應用在應用程式時,一般分一下幾步:

初始化Velocity==>建立context對象==>添加資料到context==>選擇模闆==>合并模闆和資料,産生輸出頁面

  1. velocity.properties檔案詳解(在spring內建的時候主要是配置在prop标簽中)
  1. tools.view.servlet.error.template = error.vmzd

處理錯誤資訊的模闆路徑

  1. tools.view.servlet.layout.directory = /WEB-INF/layout/ 所有布局檔案的預設路徑
  2. tools.view.servlet.layout.default.template = defauzlt.vm

預設的布局檔案

  1. #模闆編碼:

input.encoding=ISO-8859-1 //模闆輸入編碼

output.encoding=ISO-8859-1 //模闆輸出編碼

  1. velocimacro.library=/WEB-INF/vm/macro.vm,/WEB-INF/vm/tuanmacro.vm

是一個逗号分隔的所有Velocimacro 模闆庫的清單

(3)如何把VTL內建到spring的項目架構中?

① 需要的jar包

commons-collections.jar

velocity-1.5.jar

velocity-dept.jar

velocity-tool-view1.4.jar

下載下傳位址:http://jakarta.apache.org/velocity/

② 引入Velocity包

在application-context.xml配置檔案裡配置VelocityConfigurer,當然也可以在dispatcher-servlet(application-springmvc.xml)裡面配置,這完全取決于你自己的想法。

下面的配置使Spring能夠知道我們的模闆檔案是放在哪裡的

在dispatcher-servlet裡配置VelocityViewResolver

下面的配置則是針對一個模闆檔案使用的是什麼字尾。

本項目例子:

Velocity模闆學習表現層的三種主要技術
Velocity模闆學習表現層的三種主要技術
Velocity模闆學習表現層的三種主要技術

格式化時間:

d a t e . f o r m a t ( ′ y y y y − M M − d d H H : m m : s s ′ , date.format(&#x27;yyyy-MM-dd HH:mm:ss&#x27;, date.format(′yyyy−MM−ddHH:mm:ss′,element.createTime)

補充:

Velocity 頁面中

! o b j ! 符 号 表 示 如 果 可 以 取 到 值 則 顯 示 值 , 如 果 取 不 到 值 或 值 為 n u l l , 則 輸 出 空 字 符 串 即 &quot; &quot; ! !{obj} !符号表示如果可以取到值則顯示值,如果取不到值或值為null,則輸出空字元串即 &quot;&quot; ! !obj!符号表示如果可以取到值則顯示值,如果取不到值或值為null,則輸出空字元串即""!{obj} !表示取反,和java中含義一樣。

判斷:

#if{! KaTeX parse error: Expected 'EOF', got '}' at position 4: var}̲判斷var為空 #elseif…var}判斷var不為空

#else{}

#end

記此前面試中被面試老師吐槽我的學習筆記記錄方式太過落伍,特此注冊了一個CSDN的部落格發表了此篇文章,内容基本來自于在前輩的部落格中看到的東西和自己的一些見解,第一篇部落格,希望自己越走越遠。