Velocity語言的介紹


Velocity語言的介紹

                                                    2016-09-06 15:39:25     

語言介紹            

Velocity是一種Java模版引擎技術,是一個基於Java的模板引擎(template engine)。她允許任何人簡簡單單的使用模板語言類引用由Java代碼定義的對象。

當Velocity應用於web開發時,界面設計人員可以和Java程序開發人員同步開發一個遵循MVC架構的web站點,也就是說,頁面設計人員可以只關注頁面的顯示效果,而由java程序員關注業務邏輯編碼。Velocity將Java代碼從web頁面中分離出來,這樣web站點的長期維護提供了便利,同時也為我們在JSP和PHP之外又提供了一種可選的方案。

 

基礎使用             

Velocity中,變量的定義都是使用“$”開頭的,$作為Velocity的標識符。字母、數字、中划和下划線都可以作為Velocity的定義變量。

 

Velocity——注釋

  單行注釋,使用##           如:##<div class="tt">$shopUser.username</div> 會隱藏此div

  多行注釋,使用 #* comment *#      如: #* <div class="tt">$shopUser.username</div> *#

 

Velocity——引用

注意:規范的引用寫法應該是${Foo},也可以使用下面的形式; 規范的肯定是不會錯的。

如果沒有對應的引用,VTL會作為普通的字符串處理。

在Velocity Template Language(VTL)中,有三種類型的引用: 變量,屬性,方法。

所有的引用都被看做是字符串,如果某個引用是一個整型值,Velocity會調用toString()方法,將她轉換為String。

 

變量:(如:$username)

變量是由$和緊跟其后的VTL標識符組成的。

VTL標識符必須以字母開頭,后面可以包含並且僅能包含字母數字下划線以及減號

像$2.4這樣的字符串,是不會被識別為變量的,因為2.4不是一個VTL標識符。

 

屬性:(如:$shopUser.username)

屬性是由四部分組成,依次是$+VTL標識符+“.”+VTL標識符。

這個標識符有兩個含義,它可以表示在shopUser標記的hashtable中尋找並返回這個key對應的value,也可以表$shopUser.getUsername這個方法(方法在java程序中定義)。如:{'$!shopUser.getUsername()'}。

 

方法:如($shopUser.getPass("test"))

方法是由四部分組成,依次是$+VTL+'.'+函數調用。這里的函數調用是可以帶參數的。

很顯然,屬性有時是方法的一種簡寫,$Foo.bar和$Foo.getbar()是等價的,這種情況下,盡量使用屬性的形式。但是方法有參數的話,就沒有和它等價的屬性了。

 

屬性的搜索規則:

屬性可以表示為調用方法,也可表示從hashtable中找值,對於$Foo.bar來說,Velocity會按照以下順序解析:

$Foo.getbar()>$Foo.getBar()> $Foo.get("bar")>$Foo.isBar()

而對於$Foo.Bar來說,Velocity會按照以下順序解析:

$Foo.getBar() > $Foo.getbar() > $Foo.get("Bar") > $Foo.isBar()

所以,前兩個是尋找方法,第三個是在hashtable中找值,第四個是一個is判斷。

另外需要注意的是,屬性不會被解析為對象的實例變量。$Foo.bar可以表示$Foo.getbar()或者$Foo.get("bar"),但是它不表示Foo這個java對象的bar屬性。

 

Velocity——指令

引用可以讓模板設計者生成動態內容,而指令允許設計者真正的負責頁面的展現和內容。

 

#Include和#Parse都是用於將本地文件引入當前文件的指令,而且被引入的文件必須位於TEMPLATE_ROOT(配置Velocity視圖文件時設置的路徑,稍后再SpringMvc整合Velocity時介紹)。

 

#Include

被#Include引入的文件,其內容不會被Velocity引擎解析,所以這些文件應該是靜態模板,即不含有VTL的模板。使用#Include()指令時,參數是被雙引號括起來的文件名或者是表示文件名的變量。如果有多個文件,以逗號隔開即可。比如#Include("mode.vm", "b.html", $file)。

 

#Parse

#Parse用來在當前模板中引入並執行另一個(本地的)模板——可以是靜態的,也可以是動態的——並把結果嵌入到當前位置。#Parse()指令的參數,可以是一個雙引號括起來的文件名,也可以是一個變量,但是它不能接受多個參數

被#Parse引入的文件仍然可以使用#Parse指令。在velocity.properties文件中有一個屬性directive.parse.max.depth,默認值是10,它指定了#Parse嵌套的最大層次。既然#Parse嵌套是允許的,#Parse遞歸也是允許的。

假如a.vm #Parse b.vm,那么a.vm中定義的變量$v,在b.vm中可以隨便使用。如果b.vm也定義了$v,那么b.vm中用到的將會是自己的$v,而不是a.vm中的$v。

 

#set

#set指令用於向一個變量或者屬性賦值。

  其格式為 #set($username="chen")或者#set($username.bar=$test) 。

 

#if

#if指令用於判斷某個條件是否為true。形式: #if()  #elseif()  #else  #end,和java中的用法基本相同。如下:

#if($userNameMap.get("name") == 'zhangsna')
    <div class='tt'>$userNameMap.get("name")</div>
#elseif($userNameMap.get("name") == 'zhangsan')
    <div class='tt'>不是zhangsna</div>
#else
     <div class='tt'>什么都不是</div>
#end

 

#foreach  

 

#foreach($userName in $userNames)
      $userName</br>
#end

 

上面這個例子中,$userNames可以是一個Vector,一個HashTable,一個數組。

在Velocity中,有一個變量$velocityCount用作循環計數,初始值是1。這個變量的名字和初始值是在velocity.properties文件里配置的。

 

Velocity——運算

判斷是否為null

1、#if (! $userName) 判斷$userName為空,判斷非空為 #if ($userName) 

2、使用null工具判斷 

    #if($null.isNull($userNames)) 

    在需要這個判斷作為一個判斷字句時,比如我要你判斷一個集合為null或為空時只能使用這種方式了: 

    $if ($null.isNull($userNames) || $userNames.size()==0) 

 

3、判斷為空的方法 

#if("" == $變量名) 或 #if("" != $變量名) 

 

"!"的使用

“!”用來強制把不存在的變量或變量值為null的對象顯示為空白。

如當頁面中包含$userName,如果userName對象有值,將顯示msg的值,如果不存在msg對象,則在頁面中顯示$userName字符。

 

Velocity——宏

#macro(d)

#macro指令用於定義一個VTL模板的重復代碼塊——宏。如:

#macro(d)
<tr><td>宏</td><tr>
#end

Velocity中寫入#d或者#d(),則會替換為‘<tr><td>宏</td><tr>’。

 

#macro(d $name)

宏也可以帶參數,而且是任意多個參數。不過,宏定義時有幾個參數,宏調用時就要提供同樣數目的參數。

#macro( d $name)
<tr><td>$name</td></tr>
#end
#d("name1")

宏的參數可以是以下VTL元素中的任意一種:引用、字符串字面值、數值字面值、整數范圍(比如[1 .. 10]、[$start .. $end])、數組、布爾值true或者false。

 

SpringMVC整合Velocity        

Velocity現在應用非常廣泛,現在嘗試將SpringMVC項目與Velocity整合

 

整合過程

1、主要涉及改變的文件:
  pom.xml(引入velocity的jar包)
  pbqshop-servlet.xml(視圖配置,配置velocity)
  velocity.properties(velocity配置文件)

  1)pom.xml中引入Velocity是由的jar包

<!-- Velocity 模板 -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity</artifactId>
            <version>1.7</version>
        </dependency>
        <dependency>
            <groupId>velocity-tools</groupId>
            <artifactId>velocity-tools-generic</artifactId>
            <version>1.2</version>
        </dependency>         
View Code

  2)pbqshop-servlet.xml中視圖配置

 <!-- 視圖模式配置,Velocity配置文件 -->
    <bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
        <property name="resourceLoaderPath" value="template"></property>
        <property name="configLocation" value="classpath:velocity.properties"></property>
    </bean>
    <!-- 配置后綴 -->
    <bean id="velocityViewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
        <property name="contentType" value="text/html;charset=UTF-8"></property>
        <property name="suffix" value=".vm"></property>
    </bean>
View Code

  3)velocity.properties(velocity配置文件)

#encoding
input.encoding=UTF-8
output.encoding=UTF-8
contentType=text/html;charset=UTF-8
#autoreload when vm changed
file.resource.loader.cache=true
file.resource.loader.modificationCheckInterval=1
resource.manager.defaultcache.size=0
parser.pool.size=100
velocimacro.library.autoreload=false
View Code

 


免責聲明!

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



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