Velocity學習(二)之語法


基本語法

在 hellovelocity.vm 里面可以看到很多以 # 和$符開頭的內容,這些都是 Velocity 的語法,在 Velocity 中所有的關鍵字都是以 # 開頭的,而所有的變量則是以$開頭

一、變量

變量定義

#set($name="velocity")

等號后面的字符串 Velocity 引擎將重新解析,例如出現以$開始的字符串時,將做變量的替換。以 "$" 開頭,第一個字符必須為字母

變量可以包含的字符有以下內容:

  • alphabetic (a .. z, A .. Z) 

  • numeric (0 .. 9) 

  • hyphen ("-") 

  • underscore ("_")

變量使用

${name}

$name

在模板文件中使用$name 或者${name} 來使用定義的變量。推薦使用${name} 這種格式,因為在模板中同時可能定義了類似$name 和$names 的兩個變量,如果不選用大括號的話,引擎就沒有辦法正確

識別$names 這個變量。

對於一個復雜對象類型的變量,例如$person,可以使用${person.name} 來訪問 person 的 name 屬性。值得注意的是,這里的${person.name} 並不是直接訪問 person 的 name 屬性,而是訪問 person 的

getName() 方法,所以${person.name} 和${person.getName()} 是一樣的,即${person.name}=${person.getName()}【1】

變量賦值

在第一小點中,定義了一個變量,同時給這個變量賦了值。對於 Velocity 來說,變量是弱數據類型的,可以在賦了一個 String 給變量之后再賦一個數字或者數組給它。可以將以下六種數據類型賦給一

個 Velocity 變量:變量引用, 字面字符串, 屬性引用, 方法引用, 字面數字, 數組列表。

  • #set($foo = $bar)

  • #set($foo =“hello”)

  • #set($foo.name = $bar.name)

  • #set($foo.name = $bar.getName($arg))

  • #set($foo = 123)

  • #set($foo = [“foo”,$bar])

注意

1、右值是null, 則左值不會被賦值,也就是說會保留以前的值。

#set( $monkey = "monica" ) #set( $monkey = $monkey_a ) $monkey 

結果輸出:monica,因為右邊的$monkey_a並沒有定義過

2、velocity模板中不會將reference解釋為對象的實例變量,詳情見上方【1】

3、變量的作用域 是從上而下往后的都會有

A $monkey 
<div class="list">
    <div class="item">
        <div class="inner-title”>
            #set( $monkey = “jerry" )
            <span class="color_bg point"></span>保障額度高
            B $monkey 
        </div>
        <div class="inner-list">
            <p>年度基礎免賠額:<span class="color bold">1萬元</span>&nbsp;</p>
        </div> C $monkey 
    </div>
    <div class="item"> D $monkey 
        <div class="inner-title">
            <span class="color_bg point"></span>住院醫療金
        </div>
        <div class="inner-list">
            <p>重症監護費用:不設單項最高年限額</p>
        </div>
    </div> E $monkey 
</div>

// 以上ABCDE的輸出結果是
// 輸出結果: 除了A是字符串顯示$monkey , 其余的都是:jerry

二、循環

#foreach($element in $list) This is $element $velocityCount #end

Velocity 引擎會將 list 中的值循環賦給 element 變量,同時會創建一個$velocityCount 的變量作為計數,從 1 開始,每次循環都會加 1.

#foreach循環得到的是值,和es6中的for...of相似

velocityCount變量在配置文件中定義:

# Default name of the loop counter

# variable reference.

directive.foreach.counter.name = velocityCount

# Default starting value of the loop

# counter variable reference.

directive.foreach.counter.initial.value = 1

自帶方法:

$foreach.index //自帶方法 : 計數從0開始 相當於index

$foreach.hasNext //自帶方法 : 等於false代表是最后一個

$foreach.count //自帶方法 : 計數 從1開始 相對於$velocityCount

$foreach.first //自帶方法 : 是否是第一個

$foreach.last //自帶方法 : 是否是最后一個

#break:

使用 #break指令在任何時候停止循環

#if( $foreach.count > 3 )
        #break     
#end 

三、條件語句

形式一:#if #elseif #else #end

#if(condition) ... #elseif(condition) … #else … #end

形式二:#if #else #end

#if(condition) ... #else … #end

形式二:#if  #end

#if(condition) … #end

四、關系操作符

Velocity 引擎提供了 AND、OR 和 NOT 操作符,分別對應&&、||和!

#if($foo && $bar) #end #if($foo || $bar) #end #if(!$bar) #end

五、宏

Velocity 中的宏可以理解為函數定義。

定義

#macro(macroName arg1 arg2 …)
...
#end

macroName:宏的名字

arg1 / arg2:宏的參數

調用

#macroName(arg1 arg2 …)

這里的參數之間使用空格隔開

宏的例子

#macro(sayHello $name) hello $name #end #sayHello(“velocity”) // 輸出的結果為 hello velocity

⚠️不推薦在界面模板中大量使用,經過測試,宏不支持方法重載

六、#parse 和 #include

#parse 和 #include 指令的功能都是在外部引用文件,而兩者的區別是,#parse 會將引用的內容當成類似於源碼文件,會將內容在引入的地方進行解析#include 是將引入文件當成資源文件,會將

入內容原封不動地以文本輸出。分別看以下例子:

// foo.vm 文件:
#set($name =“velocity”) // parse.vm:
#parse(“foo.vm”) // 輸出結果為:velocity // include.vm:
#include(“foo.vm”) // 輸出結果為:#set($name =“velocity”)

⚠️包含文件#inclue("模板文件名")或#parse("模板文件名"),主要用於處理具有相同內容的頁面,比如每個網站的頂部或尾部內容。

七、注釋

單行注釋:##

多行注釋:#*  *#

文檔格式注釋:#**  *#

八、單引號和雙引號

#set ($var="helo")

test"$var" 返回testhello:雙引號解析變量

test'$var' 返回test'$var':單引號不解析變量

可以通過設置 stringliterals.interpolate=false改變默認處理方式

補充

讀取不同數據的方法:

.get()

.getString()

.getJSONArray()

.getJSONObject()

.getBooleanValue()

數組的常用方法操作:

$myarray.isEmpty()數組是否為空

$myarray.size()獲取數組元素個數

$myarray.get(2)獲取數組指定下標的元素

$myarray.add()增加元素

參考

官網

使用 Velocity 模板引擎快速生成代碼

《Apache Velocity用戶指南》官方文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM