一、Velocity
Velocity是一個基於java的模板引擎(template engine)。它允許任何人僅僅使用簡單的模板語言(template language)來引用由java代碼定義的對象。
當Velocity應用於web開發時,界面設計人員可以和java程序開發人員同步開發一個遵循MVC架構的web站點,也就是說,頁面設計人員可以只關注頁面的顯示效果,而由java程序開發人員關注業務邏輯編碼。Velocity將java代碼從web頁面中分離出來,這樣為web站點的長期維護提供了便利,同時也為我們在JSP和PHP之外又提供了一種可選的方案。
1. 變量定義
#set($name =“velocity”)
等號后面的字符串 Velocity 引擎將重新解析,例如出現以$開始的字符串時,將做變量的替換。
#set($hello =“hello $name”)
上面的這個等式將會給$hello 賦值為“hello velocity”
${name} ,也可以寫成:$name。提倡用前面的寫法。應該使用規范的格式書寫 : Jack is a ${vice}maniac
2. 循環
#foreach($element in $list) This is $element $velocityCount #end
Velocity 引擎會將 list 中的值循環賦給 element 變量,同時會創建一個$velocityCount 的變量作為計數,從 1 開始,每次循環都會加 1.
#foreach ( $key in $list.keySet()) Key: $key -> Value: $list.get($key) <br> #end
提示:velocity中大小寫敏感。
3. 判斷
#if(condition) ... #elseif(condition) … #else … #end
4.注釋
單行注釋:## This is a single line comment. 多行注釋:#*
5.Velocity 也具有邏輯AND, OR 和 NOT 操作符。
#if($foo && $bar) #end
6.轉義字符'\' 使用:如果reference被定義,兩個’\’意味着輸出一個’\’,如果未被定義,剛按原樣輸出。
7.Velocity內置了一些對象,在vm模版里可以直接調用,列舉如下:$request、$response、$session
二、Freemarker
FreeMarker是一個用Java語言編寫的模板引擎,它基於模板來生成文本輸出。FreeMarker與Web容器無關,即在Web運行時,它並不知道Servlet或
HTTP。它不僅可以用作表現層的實現技術,而且還可以用於生成XML,JSP或Java 等。
<html> <head> <title>freemarker測試</title> </head> <body> <h1>${message},${name}</h1> </body> </html>
FreeMarker的模板文件並不比HTML頁面復雜多少,FreeMarker模板文件主要由如下4個部分組成:
1,文本:直接輸出的部分
2,注釋:<#-- ... -->格式部分,不會輸出
3,插值:即${...}或#{...}格式的部分,將使用數據模型中的部分替代輸出
1,文本:直接輸出的部分
2,注釋:<#-- ... -->格式部分,不會輸出
3,插值:即${...}或#{...}格式的部分,將使用數據模型中的部分替代輸出
4,FTL指令:FreeMarker指定,和HTML標記類似,名字前加#予以區分,不會輸出
下面是一個FreeMarker模板的例子,包含了以上所說的4個部分
1. FTL指令規則
在FreeMarker中,使用FTL標簽來使用指令,FreeMarker有3種FTL標簽,這和HTML標簽是完全類似的.
1,開始標簽:<#directivename parameter>
2,結束標簽:</#directivename>
<html> <head> <title>Welcome!</title> </head> <body> <#-- 注釋部分 --> <#-- 下面使用插值 --> <h1>Welcome ${user} !</h1> <p>We have these animals: <u1> <#-- 使用FTL指令 --> <#list animals as being> <li>${being.name} for ${being.price} Euros< <#list> <u1> </body> </html>
在FreeMarker中,使用FTL標簽來使用指令,FreeMarker有3種FTL標簽,這和HTML標簽是完全類似的.
1,開始標簽:<#directivename parameter>
2,結束標簽:</#directivename>
3,空標簽:<#directivename parameter/>
<#assign age=23> <#if (age>60)>老年人 <#elseif (age>40)>中年人 <#elseif (age>20)>青年人 <#else> 少年人 </#if>
輸出結果是:青年人
缺點:
1、freemarker的變量必須有值,沒有被賦值的變量就會拋出異常,那個黃黃的freemarker出錯頁面,真是讓人看了太難過了。
2、freemarker的map限定key必須是string,其他數據類型竟然無法操作
3、freemarker為了編程方便把不可序列化的東西往session里面放!