浏览 2147 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-09-27
一. 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><ww:iterator>遍历数组</h3> #foreach ($value in $array) $value<br> #end <h3><ww:iterator>遍历Collection</h3> #foreach ($value in $list) Name: $value.name Password: $value.password <br> #end <h3><ww:iterator>遍历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><ww:iterator>遍历数组</h3> #foreach ($value in $array) $value<br> #end <h3><ww:iterator>遍历Collection</h3> #foreach ($value in $list) $stack.push($value) Name: $name Password: $password <br> #set ($trash = $stack.pop()) #end <h3><ww:iterator>遍历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><ww:iterator>遍历数组</h3> #foreach ($value in $array) $value<br> #end <h3><ww:iterator>遍历Collection</h3> #foreach ($value in $list) #if($velocityCount % 2 == 0) <font color="black"> #else <font color="red"> #end Name: $value.name Password: $value.password <br> </font> #end <h3><ww:iterator>遍历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() ,那么移出的对象就会被打印出来。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |