论坛首页 入门技术论坛

《WebWork in action》第十章

浏览 2147 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-09-27  
第十章: Velocity

一. Velocity介绍

    Velocity是一种模板语言。
    . 模板是用做文档基础的文本,预先设置好固定的文档结构,部分内容可以替换;
    . 模板语言是一种标准的格式,用于定义文档中哪些变量需要被替换;
    Velocity不仅支持变量的替换,还支持简单的控制结构(循环和if/else语句等)。
    Velocity是一种运行期语言,JSP是一种静态的编译期语言。工具上对Velocity的支持通常是简陋的,甚至没有。

    Velocity是一种模板语言,它读入模板文件,将一些数据放入模板中,然后将最后的结果显示出来。
    . 数据来源:WebWork的值栈;

    额外设置:

    a. xwork.xml

       velocity result作为webwork-default.xml的一部分内容,如你的xwork.xml不包含该文件,那你必须显示定义
       名称为velocity的result类型:

       <result-type name="velocity" class="com.opensymphony.webwork.dispatcher.VelocityResult"/>
 
    b. webwork.properties

       如果想自行设定不同的velocity.properties文件,配置额外的Velocity Context,或支持其他JSP标签等,必须
       编辑webwork.properties文件,改写下面的值:

       #velocity.properties文件的位置
       webwork.velocity.configfile=velocity.properties
 
       #链接至WebWork VelocityContext的VelocityContext类名列表
       #列表使用逗号分隔
       webwork.velocity.contexts=

       #JSP标签包
       webwork.velocity.tag.path=com.opensymphony.webwork.views.velocity.ui

    c. velocity.properties

       Velocity的标准配置包含于velocipty.properties文件中,这个配置并不是与WebWork特定相关的。如果要指定自定义的Velocity
       宏或者改写Velocity模板装载的方式,那么可以指定自己的配置。

       另webwork.vm文件里定义了velocimacro库。我们亦可自行定义该文件。

二. 基本语法和操作

    1. 属性访问

       Velocity使用常见的点号语法(dot syntax)。
       如果某个Velocity表达式(如$fakeObject)返回null, 那么Velocity将直接把打表达式打印出来。如果此时不希望显示任何内容,
       可以使用$!fackeObject。

    2. 方法调用

       调用Collections的size()方法:

       Bids: $item.bids.size();

    3. 循环语句

       语法:

       #foreach ($bid in $item.bids)
        ...
       #end

       在velocity中,指令符(directives)通过井号(#)标识。循环使用内建的指令符:foreach,它通过指定一个用于循环的变量
       名称及需要循环迭代的值($item.bids)进行工作。

       示例:

    <html>
        <head>
            <meta contentType="gbk"/>
        </head>
        <body>
            <h3>&lt;ww:iterator&gt;遍历数组</h3>
            #foreach ($value in $array)
                $value<br>
            #end
            <h3>&lt;ww:iterator&gt;遍历Collection</h3>
            #foreach ($value in $list)
                Name: $value.name &nbsp;
                Password: $value.password <br>
            #end   
            <h3>&lt;ww:iterator&gt;遍历Map</h3>
            #foreach ($value in $map.entrySet())
                $value.key,$value.value <br>
            #end               
        </body>
    </html>

        . $value变量在foreach指令符的参数表中被定义,而velocity使用这个变量名引用迭代过程中被迭代的对象;
        . $velocityCount变量也被创建,它用于表示当前循环的计数,并且在其他任何foreach指令符中也同样适用。
        . 当iterator标签对Map进行循环迭代的时侯,在每次循环中被迭代的对象是Map.Entry,而在velocity中是map的值。
          如希望对 Map.Entry对象进行迭代,可使用 $map.entrySet()。

        velocity并没有将值栈的概念,不过也可以手动实现将对象直接压入栈中,模拟iterator标签将每个被迭代的对象压
        入值栈的现象:

    <html>
        <head>
            <meta contentType="gbk"/>
        </head>
        <body>
            <h3>&lt;ww:iterator&gt;遍历数组</h3>
            #foreach ($value in $array)
                $value<br>
            #end
            <h3>&lt;ww:iterator&gt;遍历Collection</h3>
            #foreach ($value in $list)
                $stack.push($value)
                Name: $name &nbsp;
                Password: $password <br>
                #set ($trash = $stack.pop())
            #end   
            <h3>&lt;ww:iterator&gt;遍历Map</h3>
            #foreach ($value in $map.entrySet())
                $value.key,$value.value <br>
            #end               
        </body>
    </html>
  
    4. 使用if/else指令符实现条件逻辑

       语法:

       #if($item.bids.size() > 0)
          ...
       #else
          ...
       #end

       示例:

    <html>
        <head>
            <meta contentType="gbk"/>
        </head>
        <body>
            <h3>&lt;ww:iterator&gt;遍历数组</h3>
            #foreach ($value in $array)
                $value<br>
            #end
            <h3>&lt;ww:iterator&gt;遍历Collection</h3>
            #foreach ($value in $list)
                #if($velocityCount % 2 == 0)
                <font color="black">
                #else
                <font color="red">
                #end
                Name: $value.name &nbsp;
                Password: $value.password <br>
                </font>
            #end   
            <h3>&lt;ww:iterator&gt;遍历Map</h3>
            #foreach ($value in $map.entrySet())
                $value.key,$value.value <br>
            #end               
        </body>
    </html>

        通过if/else指令在刚才代码基础上实现不同颜色字体显示;

    5. 变量赋值

       在简化模板的过程中经常需要创建自有的Velocity变量,例如你并不希望在所有地方都使用$some.long.expression,
       而是希望能够使用$sle作为它的别名,这时可以使用:

       #set ($seller = $item.seller)

       一旦采用这种方式进行变量赋值,那么对于剩下的页面,就可以直接引用$seller对象。这不仅免掉重复敲打键盘的烦恼,还
       避免表达式被多次重复求值。

       #set ($trash = $stack.pop())

       这一行代码把值栈中移出的对象赋给$trash变量。这样做的目的是需要将对象从值栈中移出,却不希望显示出来。如单纯
 
       $stack.pop()

       ,那么移出的对象就会被打印出来。
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics