java Velocity 程序问题

近期正在学习Spring框架使用Spring MVC。显示使用Velocity找到一篇相关的文档作为参考资料

exposeRequestAttributes:默认值false,设置是否所有的request属性在与模板进行合并之前添加到model中(可以理解为request范围内包含的所囿对象,而不是一个真正的Request对象)

}

  Velocity是一个基于java的模板引擎(template engine)它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。   当Velocity应用于web开发时界面设计人员可以和java程序开发人员同步开發一个遵循MVC架构的web站点,也就是说页面设计人 员可以只关注页面的显示效果,而由java程序开发人员关注业务逻辑编码Velocity将java代码从web页面中分離出来,这样为web站点的长 期维护提供了便利同时也为我们在JSP和PHP之外又提供了一种可选的方案。   Velocity的能力远不止web站点开发这个领域例洳,它可以从模板(template)产生SQL和PostScript、XML它也 可以被当作一个独立工具来产生源代码和报告,或者作为其他系统的集成组件使用Velocity也可以为Turbine Example   假设你是一家专门出售Mud的在线商店的页面设计人员,让我们暂且称它为“在线MUD商店”你们的业务很旺,客户下了各种类型和数量的mud订 单他们都是通过输入用户名和密码后才登陆到你的网站,登陆后就允许他们查看订单并购买更多的mud现在,一种非常流行的mud正在打折销售另外有一 些客户规律性的购买另外一种也在打折但是不是很流行的Bright Red Mud,由于购买的人并不多所以它被安置在页面的边缘所有用户的信息嘟是被跟踪并存放于数据库中的,所以某天有一个问题可能会冒出来:为什么不使用 velocity来使用户更好的浏览他们感兴趣的商品呢   Velocity使得web頁面的客户化工作非常容易。作为一个web site的设计人员你希望每个用户登陆时都拥有自己的页面。   你会见了一些公司内的软件工程师伱发现他们每个人都同意客户应该拥有具有个性化的信息。那让我们把软件工程师应该作的事情发在一边看一看你应该作些什么吧。   你可能在页面内嵌套如下的VTL声明: 

site内嵌套动态内容一个变量就是一种类型的reference。变量是某种类型的refreence它可以指向java代码中的定义,或者从當前 页面内定义的VTL statement得到值下面是一个VTL statement的例子,它可以被嵌套到HTML代码中: 

directive使用一个表达式(使用括号封闭)――一个方程式分配一个值给變量变量被列在左边,而它的值被列在右边最后他们之间使用=号分割。 在上面的例子中变量是$a,而它的值是Velocity和其他的references一样以$字苻开始,而值总是以双引号封闭Velocity中仅有String可以被赋值给变量。 记住以下的规则: 使用$字符开始的references用于得到什么;使用#字符开始的directives用于作些什么 Hello Velocity World! 一旦某个变量被分配了一个值,那么你就可以在HTML文件的任何地方引用它在下面的例子中,一个值被分配给$foo变量并在其后被引用。 

  方法 一个方法就是被定义在java中的一段代码并且它有完成某些有用工作的能力,例如一个执行计算和判断条件是否成立、满足等方法昰一个由$开始并跟随VTL标识符组成的References,一般还包括一个VTL方法体例如: 

方法 非正是格式更见常用,但是有时还是使用正是格式比较适合例洳:你希望通过一个变量$vice来动态的组织一个字符串。   Jack is a

context)打印的结果将显示两次查询结果都成功了,但是实际上有一个查询是失败的 为叻解决以上问题我们可以通过预先定义的方式: 

context仅仅能够包含对象,所以当我们说“boolean”时实际上代表的时一个Boolean对象即便某个方法返回的昰一个boolean值,Velocity也会利用内省机制将它转换为一个Boolean的相同值 如果条件成立,那么#if和#end之间的内容将被显示 #elseif和#else元素可以同#if一同使用。例如: 


注意这里的Velocity的数字是作为Integer来比较的――其他类型的对象将使得条件为false但是与java不同它使用“==”来比较两个值,而且velocity要求等号两边的值类型相同 

关系、逻辑运算符 Velocity中使用等号操作符判断两个变量的关系。例如: 

通过变量被引用例如:如果$product是一个java的Product类,并且这个产品的名芓可以通过调用他的getName()方法得到 现在我们假设$allProducts是一个Hashtable,如果你希望得到它的key应该像下面这样: 

Velocity还特别提供了得到循环次数的方法以便你可以像下面这样作: 


$velocityCount变量的名字是Velocity默认的名字,你也可以通过修改velocity.properties文件来改变它 默认情况下,计数从“1”开始但是你可以在velocity.properties设置咜是从“1”还是从“0”开始。下面就是文件中的配置: 


如果您需要引入多个文件可以用逗号分隔就行: 


在括号内可以是文件名,但是更哆的时候是使用变量的: 

site内的其他Velocity模板不可以获得Velocimacros的定义定义一个可以被所有模板共享的Velocimacro显然是有很多好处 的:它减少了在一大堆模板Φ重复定义的数量、节省了工作时间、减少了出错的几率、保证了单点修改。 上面定义的#tablerows( $color $list )Velocimacro被定义在一个Velocimacros模板库(在velocity.properties中定义)里所以这个macro可以茬 任何规范的模板中被调用。它可以被多次应用并且可以应用于不同的目的例如下面的调用: 

boolean值:true、false 当将一个reference作为参数传递给Velocimacro时,请注意reference作为参数时是以名字的形式传递的这就意味着参数 的值在每次Velocimacro内执行时才会被产生。这个特性使得你可以将一个方法调用作为参数传遞给Velocimacro而每次 Velocimacro执行时都是通过这个方法调用产生不同的值来执行的。例如: 

执行的结果是:reference $foo的bar()方法被执行了三次 如果你不需要这样嘚特性可以通过以下方法: 

个属性使得你可以不用重新启动servlet容器而达到重新加载的效果,就像你使用regular模板一样这个属性可以使用的前提僦是resource loader缓存是off状态(file.resource.loader.cache = false)。注意这个属性实际上是针对开发而非产品的 

Velocimacro必须被定义在他们被使用之前。也就是说你的#macro()声明应该出现在使用Velocimacrosの前。 特别要注意的是如果你试图#parse()一个包含#macro()的模板。因为#parse()发生在运行期但是解析器在 parsetiem决定一个看似VM元素的元素是否是一个VM元素,这样#parse()-ing┅组VM声明将不按照预期的样子工作为了得到预期的结 果,只需要你简单的使用velocimacro.library使得Velocity在启动时加载你的VMs 


如果$jazz是false,将没有输出使用逃逸苻将改变输出。考虑一下下面的情况: 


事实上由于你使用了逃逸符,$jazz根本就没有被解析为boolean型值在逃逸符前使用逃逸符是合法的,例如: 


但是像下面这种写法也是可以的: 


上面的代码可以被改写为: 

and! 当一个reference被“!”分隔时并且在它之前有逃逸符时,reference将以特殊的方式处悝注意这种方式与标准的逃逸方式时不同的。对照如下: #set ( $foo = “bar”

以上代码将导致rowColor()方法两次调用而不是一次。为了避免这种现象的出现峩们可以按照下面的方式执行:  

directive的模板,这一点是需要牢记的因为#parse()发生在运行期,但是解析器在parsetiem决定一个看似VM元素的元素是否是一

concatenation 开发囚员最常问的问题是我如何作字符拼接在java中是使用“+”号来完成的。 在VTL里要想实现同样的功能你只需要将需要联合的reference放到一起就行了例如: 


上例也会得到同样的结果。最后一个例子当你希望混合固定字段到你的reference时,你需要使用标准格式: 

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信