<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    lovefish
    其實不想走,其實想做車! 不想隨波逐流 就只能逆流而上!前方有什么,我們無法預見。但是路就在眼前,走還是不走,自己決定。
    posts - 11,comments - 10,trackbacks - 0

      Velocity手冊

    英文源文件:http://jakarta.apache.org/velocity/user-guide.html


    1. About this Guide
    2. What is Velocity?
    3. What can Velocity do for me?
    1. The Mud Store example
    4. Velocity Template Language (VTL): An Introduction
    5. Hello Velocity World!
    6. Comments
    7. References
    1. Variables
    2. Properties
    3. Methods
    8. Formal Reference Notation
    9. Quiet Reference Notation
    10. Getting literal
    1. Currency
    2. Escaping Valid VTL References
    11. Case Substitution
    12. Directives
    1. Set
    2. String Literals
    3. If-Else Statements
    1. Relational and Logical Operators
    4. Foreach Loops
    5. Include
    6. Parse
    7. Stop
    8. Velocimacros
    2. Escaping VTL Directives
    3. VTL: Formatting Issues
    4. Other Features and Miscellany
    1. Math
    2. Range Operator
    3. Advanced Issues: Escaping and !
    4. Velocimacro Miscellany
    5. String Concatenation
    5. Feedback
    Velocity
    是什
    Velocity
    是一個基于java的模板引擎(template engine)。它允任何人僅僅簡單的使用模板言(template language)來引用由java象。
    Velocity用于web開發時,界面設計可以和java程序開發步開發一個遵循MVC架構的web站點,也就是設計可以只面的示效果,而由java程序開發員關業務邏輯編碼Velocityjavaweb面中分離出來,這樣為web站點的維護提供了便利,同JSPPHP之外又提供了一的方案。
    Velocity
    的能力不止web站點開發這域,例如,它可以從模板(templateSQLPostScriptXML,它也可以被當作一個獨立工具來生源代告,或者作其他系的集成件使用。Velocity也可以Turbine web開發架構提供模板服template service)。Velocity+Turbine提供一個模板服的方式允一個web用以一個真正的MVC模型開發
    Velocity
    作什
    The Mud Store Example                                                  
    你是一家專門出售Mud的在商店的設計們暫且稱它"MUD商店"。你業務很旺,客下了各種類型和數量的mud訂單。他都是通過輸入用名和密后才登到你的網站,登后就允們查訂單購買更多的mud在,一非常流行的mud正在打折售。另外有一些客戶規律性的購買另外一也在打折但是不是很流行的Bright Red Mud,由于購買人并不多所以它被安置在面的邊緣。所有用的信息都是被跟蹤并存放于數據中的,所以某天有一個問題可能會冒出來:不使用velocity來使用更好的瀏覽趣的商品呢?
    Velocity
    使得web面的客化工作非常容易。作一個web site設計,你希望個用陸時有自己的面。
    你會了一些公司內的件工程,你發現們每個人都同意客戶應該擁有具有個性化的信息。那件工程師應該作的事情在一,看一看你應該作些什吧。
    你可能在面內嵌套如下的VTL聲明:
    <html>
    <body>
    Hello  $customer.Name!
    <table>
    #foreach( $mud  in  $nudsOnSpecial )
        #if ( $customer.hasPurchased( $mud )  )
            <tr>
                <td>
                    $flogger.getPromo( $mud )
                <td>
            <tr>
        #end
    #end
    </table>
    Velocity Template Language(VTL):AN introduction
    VTL
    意味著提供最簡單、最容易并且最整的方式合并動態內容。
    VTL
    使用references來在web site內嵌套動態內容,一個量就是一種類型的reference量是某種類型的refreence,它可以指向java中的定,或者從當前面內定VTL statement得到。下面是一個VTL statement的例子,它可以被嵌套到HTML中:
     #set ( $a = "Velocity" )
    和所有的VTL statementstatement以#字符始并且包含一個directiveset。當一個在戶請求你的Velocity Templating Engine查詢整個面以便發現所有#字符,然后確定哪些是VTL statement,哪些不需要VTL作任何事情。
    #字符后跟一個directivesetset directive使用一個表達式(使用括號封――一個方程式分配一個值給變量。量被列在左,而它的被列在右,最后他使用=號分割。
    在上面的例子中,量是$a,而它的Velocity。和其他的references$字符始,而值總是以雙引號封VelocityString可以被賦值給變量。
    住以下的規則
    使用$字符始的references用于得到什;使用#字符始的directives用于作些什
    Hello Velocity World!
    一旦某個量被分配了一個,那你就可以在HTML文件的任何地方引用它。在下面的例子中,一個被分配$foo量,并在其后被引用。
     <html>
     <body>
      #set ( $foo = "Velocity" )
      Hello $foo World!
     </body>
     </html>
    上面的實現結果是在面上打印"Hello Velocity World"
    了使包含VTL directivesstatement更具有可性,我鼓勵你在新行VTL statement,盡管你不是必須這么作。Set directive將在后面詳細描述。

    行注
     ## This is a single line comment.
    多行注
     #*
       Thus begins a multi-line comment. Online visitors won't
       see this text because the Velocity Templating Engine will
          ignore it.
     *#
    文檔格式:
     #**
       This is a VTL comment block and
       may be used to store such information
          as the document author and versioning
       information:
       @version 5
       @author
     *#
    References
    VTL中有三種類型的references(variables)、屬性(properties)、方法(methods)。作一個使用VTL設計者,你和你的工程references的名稱達成共,以便你可以在你的template中使用它
    Everything coming to and from a reference
    被作一個String理。如果有一個$foo是一個Integer象,那Velocity調用它的toString()方法將String型。
     
                                                                          
     
    格式要求同java
     
    屬性                                                                      
     
    例子:
      $customer.Address
      $purchase.Total
    $customer.Address
    有兩。它可以表示:hashtablecustomer中以Address為關鍵字的;也可以表示調customer象的getAddress()方法。當你的面被Velocity將確定以上兩方式用那,然后返回適當的
    方法                                                                      
    一個方法就是被定java中的一段代,并且它有完成某些有用工作的能力,例如一個算和判斷條件是否成立、滿足等。方法是一個由$始并跟隨VTL標識成的References,一般包括一個VTL方法體。例如:
     $customer.getAddress()
     $purchase.getTotal()
     $page.setTitle( "My Home Page" )
     $person.setAttributes( ["Strange", "Weird", "Excited"] )
    前兩個例子$customer.getAddress()$purchase.getTotal()看起來挺想上面的屬性$customer.Address $purchase.Total。如果你得他有某種聯系的,那你是正確的。
    VTL
    屬性可以作VTL方法的寫。$customer.Address屬性和使用$customer.getAddress()方法具有相同的效果。如果可能的使用屬性的方式是比合理的。屬性和方法的不同點在于你能夠給一個方法指定一個參數列表。
    正式reference標記
    reference
    的正是格式如下:
     ${mudSlinger}    

     ${customer.Address}  
    屬性
     ${purchase.getTotal()}  
    方法
    非正是格式更常用,但是有時還是使用正是格式比適合。例如:你希望通一個$vice動態組織一個字符串。
     Jack is a $vicemaniac.
    本來量是$vice在卻成了$vicemaniac這樣Veloctiy就不知道您到底要什了。所以,應該使用正是格式
     Jack is a ${vice}maniac
    Velocity知道量是$vice而不是$vicemaniac
    Quiet reference notation
    例如:
     <input  type="text"  name="email"  value="$email" />
    面的form被初始加載時$email沒有這時你肯定是希望它能夠顯示一個blank text來代替"$email"這樣的字段。那使用quiet reference notation就比合適。
     <input  type="text"  name="email"  value="$!email"/>
    這樣文本框的初始就不會是email而是空了。
    正式和quiet格式的reference notation也可一同使用,像下面這樣
     <input  type="text"  name="email"  value="$!{email}"/>
    Getting literal                                                             
    Velocity
    使用特殊字符$#來幫助它工作,所以如果要在template里使用些特殊字符要格外小心。本討論$字符。
     
    貨幣字符                                                                  
    VTL中使用$2.5這樣貨幣標識是沒有問題得的,VTL不會將它錯認為是一個reference,因VTL中的reference是以一個大寫或者小寫的字母始。
    Escaping valid VTL reference                                             
    VTL
    中使用"\"逃逸符。
    例如:
     #set( $email = "foo" )
     $email
     \$email
     
    \\$email
     \\\$email
    render
     foo
     $email
     \foo
     
    \\$email
    如果email量沒有被定義則
     $email
     \$email
     
    \\$email
     \\\$email
    將被render
     $email
     \$email
     
    \\$email
     \\\$email
    注意:VTL中未被定量將被認為是一個字符串,所以以下例子:
     #set( $foo = "gibbous" )
     $moon = $foo
    果是:
    $moon = gibbous
    Case substitution
    在你已經對reference熟悉了,你可以將他高效的用于你的template了。Velocity利用了很多java范以方便了設計的使用。例如:
     $foo
     $foo.getBar()
     ## is the same as
     $foo.Bar

     $data.getUser("jon")
     ## is the same as
     $data.User("jon")

     $data.getRequest().getServerName()
     # is the same as
     $data.Request.ServerName
     ## is the same as
     ${data.Request.ServerName}
    但是,注意VTL中不會將reference釋為對象的量。例如:$foo.Name將被解釋為Foo象的getName()方法,而不是Foo象的Name量。
    Directives
    Reference
    許設計者使用動態的內容,而directive使得你可以java來控制你的邏輯,從而達到你所期望的示效果。
     #set                                                                      
     #set directive
    被用于置一個reference。例如:
      #set ( $primate = "monkey" )
      #set ( $customer.Behavior = $primate )
    賦值的(LHS)必是一個量或者屬性reference。右RHS)可以是以下型中一
      
    reference
      String literal
      
    屬性reference
      
    方法reference
      number literal
      ArrayList
    下面是用各種類型的RHS的例子:
     
    set ( $monkey = $bill ) ##reference
     
    set ( $monkey.Friend = "monica" ) ##String literal
     
    set ( $monkey.Blame = $whitehouse.Leak )##屬性reference
     
    set ( $monkey.Plan = $spindoctor.weave($web) )##方法reference
     
    set ( $monkey.Number = 123 )##Number literal
     
    set ( $monkey.Say = ["Not", $my, "fault"] )##ArrayList
    注意:最后一個例子的取方法$monkey.Say.get(0)
    RHS
    也可以是一個簡單的算表達式:
     #set ( $value = $foo + 1 )
     #set ( $value = $bar -1 )
    #set ( $value = $foo * $bar )
    #set ( $value = $foo / $bar )
    如果你的RHS是一個nullVTL理將比特殊:它將指向一個已存在的reference這對初學者來可能是比較費解的。例如:
     #set ( $resut = $query.criteria("name") )
     The result of the first query is $result

     #set ( $resut = $query.criteria("address") )
     The result of the second query is $result
    如果$query.criteria("name")返回一個"bill",而$query.criteria("address")返回的是null則顯示的果如下:
     The result of the first query is bill
     The result of the first query is bill
    看看下面的例子:
     #set( $criteria = ["name", "address"] )
    #foreach( $criterion in $criteria )
        #set( $result = $query.criteria($criterion) )
         #if( $result )
             Query was successful
          #end
    #end
    在上面的例子中,程序將不能智能的根據$result決定查詢是否成功。在$result#set后(added to the context),它不能被置回nullremoved from the context)。打印的果將示兩次查詢結果都成功了,但是實際上有一個查詢是失的。
    了解決以上問題可以通過預先定的方式:
     #set( $criteria = ["name", "address"] )
     #foreach( $criterion in $criteria )
      #set( $result = false )
      #set( $result = $query.criteria( $criterion ) )
      #if( $result )
       Query was successful
      #end
     #end
     String Literals                                                        
     
    當你使用#set directiveString literal在一雙引號內。
      #set ( $directoryRoot = "www" )
      #set ( $templateName = "index.vm" )
      #set ( $template = "$directoryRoot/$tempateName" )
      $template
     
    上面段代www/index.vm
     
    但是,當string literal被封裝在引號內,它將不被解析:
      #set ( $foo = "bar" )
      $foo
      #set ( $blargh = '$foo' )
     
    果:
      bar
      $foo
     
    上面個特性可以通修改velocity.properties文件的stringliterals.interpolate = false來改上面的特性是否有效。
    條件
     if/elseif/else                                                              
    當一個web面被生成使用Velocity#if directrive,如果條件成立的可以在面內嵌入文字。例如:
     #if ( $foo )
      <strong>Velocity!</strong>
     #end
    上例中的條件句將在以下兩條件下成立:
      $foo
    是一個boolean型的量,且它的值為true
      $foo
    量的null
    里需要注意一點:Velocity context僅僅包含象,所以當我們說"boolean"時實際上代表的一個Boolean象。即便某個方法返回的是一個booleanVelocity也會利用內省機制將它轉換為一個Boolean的相同
    如果條件成立,那#if#end的內容將被示。
    #elseif
    #else元素可以同#if一同使用。例如:
     #if( $foo < 10 )
      <strong> Go North </strong>
     #elseif( $foo == 10 )
      <strong> Go East </strong>
     #elseif( $foo == 6 )
      <strong> Go South </strong>
     #else
      <strong> Go West </strong>
     #end
    注意里的Velocity的數字是作Integer來比――其他型的象將使得條件false,但是與java不同它使用"=="來比兩個,而且velocity要求等號兩值類型相同。
    系、邏輯運算符                                                          
    Velocity
    中使用等號操作符判斷兩個量的系。例如:
     #set ( $foo = "deoxyribonucleic acid" )
     #set ( $bar = "ribonucleic acid" )
     #if ( $foo == $foo )
      In this case it's clear they aren't equivalent.So…
     #else
      They are not equivalent and this will be the output.
     #end
    Velocity
    ANDORNOT邏輯運算符。下面是一些例子:
     ## logical AND
     #if( $foo && $bar )
      <strong> This AND that </strong>
     #end

     ## logical OR
     #if ( $foo || $bar )
      <strong>This OR That </strong>
     #end

     ##logical NOT
     #if ( !$foo )
      <strong> NOT that </strong>
     #end
                                                                          
     Foreach
                                                                  
     
    例子:
      <ul>
       #foreach ( $product in $allProducts )
        <li> $product </li>
       #end
      </ul>
     
    次循$allProducts中的一個都會賦給$product量。
    $allProducts
    可以是一個VectorHashtable或者Array。分配$product是一個java象,并且可以通過變量被引用。例如:如果$product是一個javaProduct,并且品的名字可以通過調用他的getName()方法得到。
    在我$allProducts是一個Hashtable,如果你希望得到它的key應該像下面這樣
     <ul>
      #foreach ( $key in $allProducts.keySet() )
       <li>Key: $key -> Value: $allProducts.get($key) </li>
      #end
     </ul>
    Velocity
    提供了得到循次數的方法,以便你可以像下面這樣作:
     <table>
     #foreach ( $customer in $customerList )
      <tr><td>$velocityCount</td><td>$customer.Name</td></tr>
     #end
     </table>
    $velocityCount
    量的名字是Velocity的名字,你也可以通修改velocity.properties文件來改它。默情況下,數從"1"始,但是你可以在velocity.properties置它是從"1"是從"0"始。下面就是文件中的配置:
     # Default name of loop counter
     # variable reference
     directive.foreach.counter.name = velocityCount

     # Default starting value of the loop
     # counter variable reference
     directive.foreach.counter.initial.value = 1
    include
    #include script element
    模板設計者引入本地文件。被引入文件的內容將不會通模板引擎被render了安全的原因,被引入的本地文件只能在TEMPLATE_ROOT下。
     #inclued ( "one.txt" )
    如果您需要引入多個文件,可以用逗號分隔就行:
     #include ( "one.gif", "two.txt", "three.htm" )
    在括號內可以是文件名,但是更多的候是使用量的:
     #inclue ( "greetings.txt", $seasonalstock )
    parse
    #parse script element
    模板設計者一個包含VTL的本地文件。Velocity將解析其中的VTLrender模板。
     #parse( "me.vm" )
    就像#include#parse接受一個量而不是一個模板。任何由#parse指向的模板都必包含在TEMPLATE_ROOT下。與#include不同的是,#parse只能指定象。
    你可以通修改velocity.properties文件的parse_direcive.maxdepth來控制一個template可以包含的最多#parse的個數――認值10#parse是可以遞歸調用的,例如:如果dofoo.vm包含如下行:
     Count down.
     #set ( $count = 8 )
     #parse ( "parsefoo.vm" )
     All done with dofoo.vm!
    parsefoo.vm模板中,你可以包含如下VTL
     $count
     #set ( $count = $count - 1 )
     #if ( $count > 0 )
      #parse( "parsefoo.vm" )
     #else
      All done with parsefoo.vm!
     #end

     Count down.
     8
     7
     6
     5
     4
     3
     2
     1
     0
     All done with parsefoo.vm!
    All done with dofoo.vm!
    Stop
    #stop script element
    模板設計者停止行模板引擎并返回。把它用于debug是很有幫助的。
     #stop
    Velocimacros
    #macro script element
    模板設計者定一段可重用的VTL template。例如:
     #macro ( d )
     <tr><td></td></tr>
     #end
    在上面的例子中Velocimacro被定義為d,然后你就可以在任何VTL directive中以如下方式調用它:
     #d()
    當你的template調Velocity將用<tr><td></td></tr>換為#d()
    Velocimacro可以有任意數量的參數――甚至0個參數,然定義時可以隨意置參數數量,但是調Velocimacro指定正確的參數。下面是一個有兩個參數的Velocimacro,一個參數是color另一個參數是array
     #macro ( tablerows $color $somelist )
     #foreach ( $something in $somelist )
      <tr><td bgcolor=$color>$something</td</tr>
     #end
     #end
    調#tablerows Velocimacro
     #set ( $greatlakes = [ "Superior", "Michigan", "Huron", "Erie", "Ontario" ] )
     #set ( $color = "blue" )
     <table>
      #tablerows( $color $greatlakes )
     </table>
    經過以上的調用將生如下的果:
     <table>
      <tr><td bgcolor=" blue"> Superior </td></tr>
      <tr><td bgcolor=" blue"> Michigan </td></tr>
      <tr><td bgcolor=" blue"> Huron </td></tr>
      <tr><td bgcolor=" blue"> Erie </td></tr>
      <tr><td bgcolor=" blue"> Ontario </td></tr>
     </table>
    Velocimacros
    可以在Velocity模板內實現行內定inline),也就意味著同一個web site內的其他Velocity模板不可以Velocimacros的定。定一個可以被所有模板共享Velocimacro然是有很多好的:它減少了在一大堆模板中重的數量、省了工作時間、減少了出的幾率、保點修改。
    上面定#tablerows( $color $list )Velocimacro被定在一個Velocimacros模板(velocity.properties中定)里,所以macro可以在任何范的模板中被調用。它可以被多次用并且可以用于不同的目的。例如下面的調用:
     #set ( $parts = [ "volva", "stipe", "annulus", "gills", "pileus" ] )
     #set ( $cellbgcol = "#CC00FF" )
     <table>
      #tablerows( $cellbgcol $parts )
     </table>
    上面VTL生如下的出:
     <table>
      <tr><td bgcolor="#CC00FF"> volva </td</tr>
      <tr><td bgcolor="#CC00FF"> stipe </td</tr>
      <tr><td bgcolor="#CC00FF"> annulus </td</tr>
      <tr><td bgcolor="#CC00FF"> gills </td</tr>
      <tr><td bgcolor="#CC00FF"> pileus </td</tr>
     </table>
     Velocimacro arguments                                                  
     Velocimacro
    可以使用以下任何元素作參數:
      Reference
    :任何以$開頭reference
      String literal

      Number literal

      IntegerRange
    [1….3]或者[$foo….$bar]
      
    象數["a","b","c"]
      boolean
    truefalse
    當將一個reference參數傳遞給Velocimacro注意reference參數是以名字的形式傳遞的。就意味著參數的Velocimacro才會被生。個特性使得你可以將一個方法調用作參數傳遞給Velocimacro,而Velocimacro都是通過這個方法調生不同的行的。例如:
     #macro ( callme $a )
      $a $a $a
     #end
     #callme( $foo.bar() )
    行的果是:reference $foobar()方法被行了三次。
    如果你不需要這樣的特性可以通以下方法:
     #set ( $myval = $foo.bar() )
     #callme ( $myval )
    Velocimacro properties                                                  
    Velocity.properties
    文件中的某幾行能使Velocimacros實現更加靈活。注意更多的內容可以看Developer Guide
    Velocity.properties
    文件中的velocimacro.libraary:一個以逗號分隔的模板列表。默情況下,velocity找唯一的一個VM_global_library.vm。你可以通配置個屬性來指定自己的模板
    Velocity.properties
    文件中的velocimacro.permissions.allow.inline屬性:有兩個可true或者false,通它可以確定Velocimacros是否可以被定regular template內。默認值ture――許設計者在他自己的模板中定Velocimacros
    Velocity.properties
    文件中的
    velocimacro.permissions.allow.inline.replace.global
    屬性有兩個可選值truefalse個屬性允使用者確定inlineVelocimacro是否可以替代全局Velocimacro(比如在velocimacro.library屬性中指定的文件內定Velocimacro)。默情況下,此值為false這樣就阻止本地Velocimacro覆蓋全局定
    Velocity.properties
    文件中的
    velocimacro.permissions.allow.inline.local.scale
    屬性也是有truefalse兩個可選值,默false。它的作用是用于確定你inlineVelocimacros是否僅僅在被定template內可話說,如果個屬性true,一個inlineVelocimacros只能在定它的template內使用。你可以使用此實現一個奇妙的VMa template can define a private implementation of the second VM that will be called by the first VM when invoked by that template. All other templates are unaffected
    Velocity.properties
    文件中的velocimacro.context.localscope屬性有truefalse兩個可選值,默認值為false。當true,任何在Velocimacro內通#set()context的修改被認為針對velocimacro的本地置,而不會永久的影響內容。
    Velocity.properties
    文件中的velocimacro.library.autoreload屬性控制Velocimacro的自。默false。當ture于一個Velocimacro調用將自動檢查原始是否生了化,如果化將重新加它。個屬性使得你可以不用重新啟servlet容器而達到重新加的效果,就像你使用regular模板一個屬性可以使用的前提就是resource loader存是offfile.resource.loader.cache = false)。注意個屬性實際上是針對開發而非品的。
    Velocimacro Trivia                                                        
    Velocimacro
    被定在他被使用之前。也就是,你的#macro()聲明應該在使用Velocimacros之前。
    要注意的是,如果你試圖#parse()一個包含#macro()的模板。因#parse()生在運行期,但是解析器在parsetiem決定一個看似VM元素的元素是否是一個VM元素,這樣#parse()-ingVM聲明將不按照期的子工作。了得到期的果,只需要你簡單的使用velocimacro.library使得Velocity在啟動時你的VMs
    Escaping VTL directives
    VTL directives can be escaped with "\"
    號,使用方式跟VTLreference使用逃逸符的格式差不多。
     ## #include( "a.txt" ) renders as <ontents of a.txt>(
    )
     #include( "a.txt" )

     ## \#include( "a.txt" ) renders as \#include( "a.txt" )
     \#include( "a.txt" )

     ## \\#include ( "a.txt" ) renders as \<contents of a.txt>
     
    \\#include( "a.txt" )
    在一個directive內包含多個script元素的VTL directives使用逃逸符要特小心(比如在一個if-else-end statement內)。下面是VTLif-statement的典型用:
     #if ( $jazz )
      Vyacheslav Ganelin
     #end
    如果$jazzture出將是:
     Vyacheslav Ganelin
    如果$jazzfalse,將沒有出。使用逃逸符將改變輸出。考一下下面的情況:
     \#if ( $jazz )
      Vyacheslav Ganelin
     \#end
    在無$jazztruefalse果都是:
     #if ( $jazz )
      Vyacheslav Ganelin
     #end
    上,由于你使用了逃逸符,$jazz根本就沒有被解析boolean。在逃逸符前使用逃逸符是合法的,例如:
     
    \\#if ( $jazz )
      Vyacheslav Ganelin
     
    \\#end
    以上程序的
     \ Vyacheslav Ganelin
     \
    但是如果$jazzfalse,那將沒有出。(會沒有出,但是我應該還有有"\"字符被出。)
    VTL
    Formatting issues
    盡管在此用手冊中VTL通常都始一個新行,如下所示:
     #set ( $imperial = [ "Munetaka", "Koreyasu", "Hisakira", "Morikune" ] )
     #foreach ( $shogun in $imperial )
      $shogun
     #end
    但是像下面這種寫法也是可以的:
     Send me #set($foo = ["$10 and","a cake"])#foreach($a in $foo)$a #end please.
    上面的代可以被改寫
     Send me
     #set ( $foo = ["$10 and ","a cake"] )
     #foreach ( $a in $foo )
      $a
     #end
     please.
    或者
     Send me
     #set($foo      = ["$10 and ","a cake"])
        #foreach        
    $a in $foo $a
       #end please.
    構將一
    其他特性和雜項
     math                                                                       
    在模板中可以使用Velocity內建的算函數,如:加、減、乘、除
      #set ( $foo = $bar + 3 )
      #set ( $foo = $bar - 4 )
      #set ( $foo = $bar * 6 )
      #set ( $foo = $bar / 2 )
     
    行除法將返回一個Integer型的果。而余數你可以使用%來得到:
      #set ( $foo = $bar % 5 )
    Velocity內使用數學算公式,只能使用像-n,-2,-1,0,1,2,n這樣的整數,而不能使用其它型數據。當一個非整型的象被使用它將被logged并且將以null為輸果。
    Range Operator
    Range operator
    可以被用于與#set#foreach statement合使用。理一個整型數它是很有用的,Range operator具有以下構造形式:
     [n..m]
    m
    n都必是整型,而m是否大于n關緊要。例子:
     First example:
     #foreach ( $foo in [1..5] )
      $foo
     #end

     Second example:
     #foreach ( $bar in [2..-2] )
      $bar
     #end

     Third example:
     #set ( $arr = [0..1] )
     #foreach ( $i in $arr )
      $i
     #end

     Fourth example:
     [1..3]
    上面四個例子的
     First example

     1 2 3 4 5

     Second example
     2 1 0 -1 -2

     Third example
     0 1

     Fourth example
     [1..3]
    注意:range operator只在#set#foreach中有效。
    Advanced Issue
    Escaping and
    當一個reference""分隔,并且在它之前有逃逸符reference將以特殊的方式理。注意這種方式與準的逃逸方式不同的。照如下:
    #set ( $foo = "bar" )
    特殊形式 準格式
    Render
     Render Render Render
    $\!foo $!foo \$foo \$foo
    $\!{foo} $!{foo} \$!foo \$!foo
    $\\!foo $\!foo \$!{foo} \$!{foo}
    $\\\!foo $\\!foo 
    \\$!{foo} \bar
    Velocimacro
    雜記
     Can I user a directive or another VM as an argument to a VM?     
     
    例如:#center ( #bold( "hello" ) )
     
    不可以。一個directive的參數使用另外一個directive是不合法的。
     
    但是,是有些事情你可以作的。最簡單的方式就是使用雙引號:
      #set ( $stuff = "#bold( 'hello' )" )
      #center ( $stuff )
     
    上面的格式也可以一行:
      #center ( "#bold( 'hello' ) )
    注意在下面的例子中參數被evaluatedVelocimacro內部,而不是在calling level。例子:
     #macro ( inner $foo )
      inner : $foo
     #end

     #macro ( outer $foo )
      #set ( $bar = "outerlala" )
      outer : $foo
     #end
     
     #set ( $bar = 'calltimelala' )
     #outer( "#inner($bar)" )

     outer : inner : outerlala
    Veloctiy的特性:參數的傳遞By Name的。例如:
     #macro ( foo $color )
      <tr bgcolor = $color ><td>Hi</td></tr>
      <tr bgcolor = $color ><td>There</td></tr>
     #end

     #foo ( $bar.rowColor() )
    以上代rowColor()方法兩次調用,而不是一次。了避免這種現象的出,我可以按照下面的方式行:
     #set ( $color = $bar.rowColor() )
     #foo ( $color )
    can I register velocimacros via #parse()?                                
    目前,Velocimacros在第一次被模板調用前被定就意味著你的#macro()聲明應該在使用Velocimacros之前。
    如果你試圖#parse()一個包含#macro() directive的模板,一點是需要牢的。因#parse()生在運行期,但是解析器在parsetiem決定一個看似VM元素的元素是否是一個VM元素,這樣#parse()-ingVM聲明將不按照期的子工作。了得到期的果,只需要你簡單的使用velocimacro.library使得Velocity在啟動時你的VMs
    What is velocimacro autoreloading
                                          
    velocimacro.library.autoreload
    專門為開發而非品使用的一個屬性。此屬性的默認值false
    String concatenation
    開發最常問題是我如何作字符拼接?在java中是使用""號來完成的。
    VTL里要想實現的功能你只需要將需要合的reference放到一起就行了。例如:
    #set ( $size = "Big" )
    #set ( $name = "Ben" )
    The clock is $size$name.
    果將是:The clock is BigBen.。更有趣的情況是:
     #set ( $size = "Big" )
     #set ( $name = "Ben" )
     #set ( $clokc = "$size$name" )
     The clock is $clock.
    上例也會得到同果。最后一個例子,當你希望混合固定字段到你的reference,你需要使用準格式:
     #set ( $size = "Big" )
     #set ( $name = "Ben" )
     #set ( $clock = "${size}Tall$name" )
     The clock is $clock.
    果是:The clock is BigTallBen.。使用這種格式主要是了使得$size不被解釋為$sizeTall

     

    posted on 2007-05-21 13:27 砸你家玻璃 閱讀(1303) 評論(1)  編輯  收藏 所屬分類: Velocity

    FeedBack:
    # re: Velocity用戶手冊.. 英文源文件:http://jakarta.apache.org/velocity/user-guide.html
    2007-11-14 16:00 | jangill
    謝謝共享  回復  更多評論
      
    主站蜘蛛池模板: 国产亚洲精品无码成人| 亚洲国产精品人久久电影| 免费黄网站在线看| 亚洲国产成人在线视频| 免费久久精品国产片香蕉| 成人无码视频97免费| 亚洲免费在线观看视频| 亚洲国产一级在线观看 | 国产亚洲综合久久| 国产亚洲无线码一区二区| 成人人观看的免费毛片| a级黄色毛片免费播放视频| 亚洲日韩一区二区一无码| 国产AV无码专区亚洲AV男同 | 日韩免费无码一区二区三区| 在线观看日本亚洲一区| 亚洲自偷自偷偷色无码中文| 中文字幕无码视频手机免费看 | 老司机午夜在线视频免费| 久久久亚洲AV波多野结衣| 又大又硬又爽免费视频| 国产h肉在线视频免费观看| 国产大片免费天天看| 亚洲18在线天美| 久久久久久a亚洲欧洲AV| 男人的天堂亚洲一区二区三区 | 亚洲av麻豆aⅴ无码电影| 国产精品色拉拉免费看| 三级毛片在线免费观看| 亚洲AV色欲色欲WWW| 亚洲国产精品综合久久2007| 亚洲国产第一站精品蜜芽| 亚洲AⅤ优女AV综合久久久| 久久不见久久见中文字幕免费 | 国产日韩在线视频免费播放| 亚洲精品蜜夜内射| 亚洲视频免费一区| 亚洲av永久无码制服河南实里| 无码欧精品亚洲日韩一区夜夜嗨 | 精品国产_亚洲人成在线高清| 国产一区二区三区无码免费|