Velocity Notes

变量名$name

为空时打印变量本身。

$!name

为空时打印空字符串(不打印任何内容)。

${name}

类似 $name,为空时原样打印。但可以将变量和连续的字符串分隔,例如:${name}space。

$!{name}

类似 $!name,为空时打印空字符串,但可以将变量和连续的字符串分隔。例如: $!{name}space。$name$!name${name}$!{name}

为空时打印:"$name""""${name}"""

带花括号的属性/方法调用方式,属性/方法需要在花括号之内:${cookie.name}${request.getCookies()}

#set()  中,赋值符号左边的变量名不能加感叹号。#set($idx = 0)#foreach($!item in $!list)    #set($idx = $!idx + 1)#end

注:jQuery 的 $.ajax() 之类的代码会导致 Velocity 解析异常,好在 Javascript 语法的灵活性,可以增加无效空白 $ .ajax(),当然也可以使用 jQuery.ajax()

#set()#set($list = ["pine", "oak", "maple"])

注: 如果右侧的值为 null,则赋值失败,左侧变量仍保持原值。

#if()#if(true)    TRUE.#elseif(false)    FALSE.#end

其实不仅仅是变量名可以使用花括号,保留字同样可以使用,这在内联 Velocity 脚本的时候 非常有用。 例如:

#foreach()#foreach($item in $list)    ${velocityCount}. $item.#end

#break

可用于中断 #foreach() 循环。

#parse()

例如:a.vm 中包含如下代码#parse("b.vm")

则在解析 a.vm 页面的这行代码时,先将 b.vm 插入到其所在的位置,并解析执行, 而且 b.vm 可以共享 a.vm 中的变量。

如果 a.vm #parse("b.vm"),b.vm 可以直接使用 a.vm 中定义的变量。 注意:如果 b.vm 定义了同名变量,则 b.vm 中使用自身的定义。

#evaluate()

动态执行一串字符串的值:#evaluate('string with VTL #if(true)will be displayed#end')

#include()

将文件原文包含进当前文档中。#include("a.vm" "readme.txt")

#define()

类似于 C 语言的 #define 命令。#define($hello)        Hello ${who}!    #end    #set($who = "World")    $hello

## 显示 "Hello World!"

数组 & 访问

Velocity 访问数组对象,无法通过类似 arr[2] 来访问特定位置的元素。#set($arr = [0, 1, 2, 3])$arr.get(2)

注:Velocity 中的数组对应 Java 中的 List 对象。对于 Java 原生 Array 对象, 只能够 #foreach 进行遍历,无法使用 $arr[0] 和 $arr.get(0) 方法。

范围(range)#foreach($item in [10..20])    $item#end

对象 & 访问#set($obj = {"key":"value", "name":"space"})$obj.get("key")#foreach(#item in $obj)    $item#end

上面的 $item 取到的是 values,如果需要在遍历对象过程中,同时取到对象的 keys, 可以使用 entrySet() 或 keySet() 方法。#foreach($item in $!obj.entrySet())    $!item.key : $!item.value#end#foreach($item in $obj.keySet())    $item : $obj.get($item)#end

注: 这种集合的遍历是无序的,即遍历顺序可能不同于 $obj 中元素的定义顺序 (据目前所知,是根据键的字母排序的)。

另外有两种不完美解决方法:I:#set($obj = [    {"key":"key", "value":"value"},    {"key":"name", "value":"space"}    ])#foreach($item in $obj)    $item.key : $item.value#end

II:#set($obj = [    ["key","value"],    ["name","space"]    ])#foreach($item in $obj)    $item.get(0) : $item.get(1)#end

之所以说 不完美 是因为:对于已知的 key,本可以直接$obj.get("key")

现在只能遍历并进行比较取得,而且较早的 Velocity 版本无法使用 #break, 以便在找到匹配项之后立即退出循环。#foreach($item in $obj)    #if("key" == $!obj.get(0))        #set($myKey = $!type.get(1))        ##break    #end#end

#macros()#macro(macroName)    #subMacro("name", "value")#end#macro(subMacro $param1 $param2)    this is sub macro($param1, $param2).#end

注意:如果 a.vm 和 b.vm 都在页面级存在同名,参数数量相同的宏,则后访问的页面 的宏不被加载。

参考:

#stop

停止模板引擎,在 Debug 时比较有用。

条件比较

在 Velocity 中可以使用大于(>)/小于(1) 要修改为 if($num > 1) 或 if(${num}>1)。

转义$\name

$\{name}

不解析执行的内容#[[    这段内容将不被 Velocity 引擎解析,原文打出。    * #define()    * ${blah]]#

内置对象

$request, $response, $session#foreach($cookie in $request.getCookies())    $cookie.name : $cookie.value#end

获得 URL 中的参数:#set($n = $!request.getParameter('n'))

另外还可以使用 $msg 内的消息工具访问 Struts 的国际化资源。

参考:

注释## 单行注释。#* * 多行注释。 *##** * 文档风格的注释。 * @version 2010/12/27 *#

据说 vm 页面的末尾写注释,会导致解析异常 (SofaMVC )。

Tips

Velocity 在表单中添加 name="action" 的文本/隐藏域,可以调用对应 Java 类 (submit 按钮的 name 则指定对应的方法名称,如 event_submit_do_save ), 但是此时 IE 浏览器通过 js 获得 form 元素本身的 action 属性值的方式, 和其他浏览器稍有不同。

例如对于如下 HTML DOM 结构:

IE 中需要使用form.attributes["action"].value

非 IE 浏览器还可以使用:form.getAttribute("action")

以下是些详细的对照:// codes                            //  IE          !IEform.action.value                   // elem         elemform.getAttribute("action")         // [object]     attrform.getAttribute("action").value   // elem         undefinedform.attributes["action"].value     // attr         attr

Form 本身的 action 属性和 action 隐藏域在提交时,浏览器本身不受影响, action 隐藏域被当作正常的参数附在 Form 的 action 属性值所对应 URL 之后。

延伸阅读

java velocity 语法_Velocity 语法相关推荐

  1. velocity模板的语法简要汇总

    velocity模板的语法简要汇总 What's velocity Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template ...

  2. Java的12个语法糖【转】

    本文转载自公众号  Hollis 原创: 会反编译的 Hollis 侵权删 本文从 Java 编译原理角度,深入字节码及 class 文件,抽丝剥茧,了解 Java 中的语法糖原理及用法,帮助大家在学 ...

  3. java基础知识——基础语法

    java的基本语法格式 [修饰符] class 类名{程序代码 } 方法的定义 一般情况下,定义一个方法包含以下语法: 修饰符 返回值类型 方法名(参数类型 参数名){...方法体...return ...

  4. Java高级语法笔记-语法支持的异常

    语法支持的异常 Java对异常支持得很彻底,举例来说: (java.lang.*下面,语法自带的异常类) 数组越界 ArrayIndexOutOfBoundsException 除0异常 Arithm ...

  5. Java解析SQL生成语法树_Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python...

    Atitit.sql ast 表达式 语法树 语法 解析原理与实现java php c#.net js python 1.1.Sql语法树ast如下图锁死 2.SQL语句解析的思路和过程 2.1.le ...

  6. 二-Java基础-作业-基础语法

    文章目录 前言 二-Java基础-环境搭建-Eclipse下载步骤和安装步骤2 二-Java基础-环境搭建-创建工程3 Java-环境搭建 总结 前言 # 二-Java基础-环境搭建-JDK-11.0 ...

  7. 【ssl认证、证书】java中的ssl语法API说明(SSLContext)、与keytool 工具的联系

    文章目录 1. 前言 java中的ssl语法与keytool 工具的联系 2. SSLContext的体系 2.1 KeyStore 2.1.1 通过证书库文件创建: 2.1.2 随机生成自签名证书库 ...

  8. 编译原理实验:Java实现SLR(1)语法分析器

    首先如果有熟悉Python的童鞋也可以看一看Python实现SLR(1)语法分析器,编译原理yyds!__FF_Y的博客-CSDN博客_python语法分析器,是我一个特别好的学长写的,这波属于传承了 ...

  9. (Java零基础学习笔记)第二章 Java中的基本语法

    前言: 大家好! 我是BA unravel .如果你想和我一起学习JAVA,欢迎大家一起来学习这个世界上最好的语言! 学习目标: 一周掌握 Java 入门知识 学习内容: 1. 搭建 Java 开发环 ...

  10. Python同Java同Js语言语法区别之四判断字符串列表字典是否相等

    字符串列表字典是否相等 前言 Python 字符串or数字 列表 字典 总结 Java 字符串 数组 Map 总结 JS 字符串 数组 对象 总结 前言 作为一枚测开工程师,需要的技能是全栈的,项目中 ...

最新文章

  1. graphviz绘制决策树
  2. 用html5的canvas画布绘制贝塞尔曲线
  3. 【Flutter】Flutter 拍照示例 ( Flutter 插件配置 | Flutter 插件源码示例 | iOS 应用配置 | Android 应用配置 )
  4. 微信小程序 详解 小程序支付
  5. python学习-列表解析、字典解析
  6. 无法生成部件汇总表_RFID在汽车零部件企业仓储物流中的应用
  7. 解决http://localhost:3000/favicon.ico 的404 问题(含案例解析)
  8. 如何删除集合(数组)中指定的元素
  9. 网站安全之设置HttpOnly的方法
  10. [转]Flex是什么?flex和flash是什么关系 ?
  11. 最全的Vim操作快捷键
  12. H+ Hplus html解决contabs.js未加载完毕时 点击会跳转至菜单框架外的bug
  13. Android studio 打包 uni App 修改apk名称,app名称及图标
  14. 【应用】Android平台最佳健身
  15. Java时间处理第三方包:Joda-Time
  16. 『 文件操作 』文件批量改名
  17. 树莓派2model B 通过蓝牙实现A2DP协议连接手机播放音乐
  18. Ubuntu 阿里源更新 amp;amp; nvidia驱动安装 amp;amp; cuda 安装
  19. ret2csu ROP Emporium
  20. 模特赛马java课程设计_Thinking in Java---Concurrent包下的新构件学习+赛马游戏仿真...

热门文章

  1. Windows手动搭建邮箱服务器教程,操作简单易上手
  2. 特征选择算法-Relief
  3. 如何安装.nupkg文件
  4. github开源项目大集合
  5. 宗成庆《文本数据挖掘》学习笔记:第二章 数据预处理和标注
  6. 测绘——利用CASS及数据库批量导出/修改/更新地籍信息
  7. 采集上市公司信息的10个经典方法
  8. UCINET软件使用简介 ——主菜单功能简介1
  9. 淘宝客公众号京东淘宝拼多多三合一源码三级代理系统网站源码
  10. tuxedo服务端访问oracle,tuxedo9.1与oracle10g互联