记录得很凌乱,反正这东西是给自己看的,建议有需要了解的道友,翻其他博客文档吧 http://velocity.apache.org/engine/devel/user-guide.html http://ifeve.com/apache-velocity-dev/ ## set指令 ## 用“指令”这个词可能不太准确 #set($a = "Velocity") ## $取值 #set($foo = "Velocity") Hello $foo World ## 单行注释 #* 多行注释 *# VTL中有三种引用 变量variable、属性properties、方法methods 合法变量名:字母、数字、连字符、下划线,以字母开头 属性访问方式:$customer.Address、$purchase.Total 方法调用方式:$person.setAttributes(["Strange"]) 使用属性更简洁,使用方法可以传递参数 正式reference标记 在非正式语句$vice中不便取值时考虑用正式reference标记${vice} 空白处理 $!email $!{email} 转义处理 #set($email = "foo") \\\$email => \$email #set($foo = "gibbous") $moon = $foo => $moon = gibbous ## 因为$moon并没有使用#set指令,等号也不是在赋值环境中,所以没有把$moon视为一个变量,也没有把等号视为赋值 ## 语法简写 属性(解释为对应get方法而不是同名属性)=>方法=>get方法 $foo.getBar()等同于$foo.Bar $data.User("jon")等同于$data.getUser("jon") ${data.Request.ServerName}等同于$data.Request.ServerName等同于$data.getRequest().getServerName() #set($customer.Behavior = $primate) set指令左边必定是变量或者属性 右边必定是变量、字符串、属性、方法、数字、数组、简单算术表达式 注意数组取值:$arr.get(0) 注意右边方法返回null的时候,将指向一个已经存在的reference 如:#set($result = $query.getName("return jock")) $result #set($result = $query.getName("return null")) $result 结果将会是: jock jock 也就是说set指令右边返回的null是不会覆盖原来的值的 这可能会在for循环中导致下次循环受上次循环影响,解决方法是循环开始后马上赋一个默认值,覆盖上次循环的值 注意set指令不存在结束标记end set指令赋值字符串的时候可以使用单引号也能使用双引号,区别在于双引号中可以使用表达式取值,单引号中的取值语句不会被解析 if指令 已知null视为false,待测试返回空串或者数值0的情况 比较数值的时候还要求两边的值,类型相同,不存在JS中的默认转换 与或非 使用的是短路与&&、短路或||、! foreach指令 #foreach($x in $xs) ## 默认从1开始 $velocityCount #end include指令 必须存在于TEMPLATE_ROOT目录下 #include("file1","file2",$file3) parse指令 与include类似,区别在于一个文件中有使用次数限制,默认10,可以递归包含 stop指令 停止执行模板引擎并立即返回,开发调试中用的比较多 macro指令 定义可复用的模板代码,类似组件化 可以实现行内定义也可以定义在Velocimacros模板库中 可以将方法调用作为参数 语法缩进 这貌似是一个跟tab/space,2space/4space类似的圣战问题 个人喜欢在html缩进不变的前提下,尽量与标签平级的格式 算术函数 +-*/%默认返回整形,其它数据类型将作为null 范围指令 [1...5] 只能在set/foreach指令中使用 转移符\(为啥作者翻译为逃逸符) 对$符号!符号无用 如\$foo => \$foo 杂记 指令嵌套?不允许,但是可以嵌套另一个指令字符串如 #center(#bold("")) ## 错误 #center("#bold('')") ## 正确 注意方法作为参数传递的情况,会导致方法执行多次,避免方法为,外部先计算方法返回值,使用返回值作为参数
文章来源: velocity模板引擎杂记