Velocity 语法详解
Velocity是基于Java的模板引擎,它允许页面设计者引用Java中定义的方法。页面设计者和Java开发者能够同时使用MVC的模式开发网站,这样网页设计者能够把精力放在页面的设计上,程序员也可以把精力放在代码开发上。Velocity把Java代码从Web页面中分离, 使网站可维护性更强,同时也在Java服务器页面(JSPs)或者PHP中提供了可视化交互的选择。
Velocity 可以被用在以下场景中:
Web 应用:开发者在不使用 JSP 的情况下,可以用 Velocity 让 HTML 具有动态内容的特性。
源代码生成:Velocity 可以被用来生成 Java 代码、SQL 或者 PostScript。有很多开源和商业开发的软件是使用 Velocity 来开发的。
自动 Email:很多软件的用户注册、密码提醒或者报表都是使用 Velocity 来自动生成的。使用 Velocity 可以在文本文件里面生成邮件内容,而不是在 Java 代码中拼接字符串。
转换 xml:Velocity 提供一个叫 Anakia 的 ant 任务,可以读取 XML 文件并让它能够被 Velocity 模板读取。一个比较普遍的应用是将 xdoc 文档转换成带样式的 HTML 文件。
一、变量
1. 变量定义
velocity 中的变量是弱类型,大小写敏感。
- #set($name="velocity")
当使用 set 指令时,等号后面引号中的字面字符串将解析和重新解析,例如出现以 $ 开始的字符串时,将做变量的替换。
- #set($hello="hello $name")
上面的这个等式将会给 $hello 赋值为“hello velocity”
2. 变量使用
在模板文件中使用 $name 或者 ${name} 来使用定义的变量。推荐使用 ${name} 这种格式,因为在模板中同时可能定义了类似 $name 和 $names 的两个变量,如果不选用大括号的话,引擎就没有办法正确识别 $names 这个变量。
对于一个复杂对象类型的变量,例如 $person,可以使用 ${person.name} 来访问 person 的 name 属性。值得注意的是,这里的 ${person.name} 并不是直接访问 person 的 name 属性,而是访问 person 的 getName() 方法,所以 ${person.name} 和${person.getName()} 是一样的。
3. 变量赋值
对于 Velocity 来说,变量是弱数据类型的,可以在赋了一个 String 给变量之后再赋一个数字或者数组给它。
赋值的左边必须是一个变量或者属性引用。
赋值的右边可以是以下6种类型之一:
- 变量引用
- 字面字符串
- 属性引用
- 方法引用
- 字面数字
- 数组列表
- #set($foo = $bar)
- #set($foo ="hello")
- #set($foo.name = $bar.name)
- #set($foo.name = $bar.getName($arg))
- #set($foo = 123)
- #set($foo = ["foo",$bar])
注:(1)如果上述例子中右值为 null,则左值不会被赋值,也就是说会保留以前的值。
(2)Velocity 模板中未被定义的变量将会认为是字符串。例如:
- #set($foo = $bar)
- $foo
- 输出结果:
- $foo
二、循环语句
- #set($list=["velocity","freemarker","jsp"])
- #foreach($element in $list)
- <p>${velocityCount}. This is ${element}</p>
- #end
- 输出结果:
- 1. This is velocity
- 2. This is freemarker
- 3. This is jsp
Velocity 引擎会将 list 中的值循环赋给 element 变量,同时会创建一个 $velocityCount 的变量作为计数,从 1 开始,每次循环都会加 1。
另外,Velocity 中还提供了得到循环次数的方法, $velocityCount 变量的名字是 Velocity 默认的名字。
- #foreach($i in [1..3])
- $i
- #end
- 输出结果:
- 1 2 3
三、条件语句
- #if($condition > 5)
- <p>condition > 5</p>
- #elseif($condition == 5)
- <p>condition = 5</p>
- #else
- <p>condition < 5</p>
- #end
- 输出结果:
- condition = 5
四、关系操作符
Velocity 引擎提供了 AND、OR 和 NOT 操作符,分别对应 && 、|| 和 ! 。
- #set($a=true)
- #set($b=false)
- #if($a && $b)
- This is all true.
- #end
五、宏
Velocity 中的宏可以理解为函数定义。
(1)宏的定义:
- #macro(宏的名称 $参数1 $参数2 ...)
- 语句体(即函数体)
- #end
(2)宏的调用:
- #宏的名称($参数1 $参数2 ...)
注意:参数之间用空格隔开
(3)示例:
- #macro(func $args1 $args2)
- This is a macro. The argument have ${args1} and ${args2}.
- #end
- #func("hello" "world")
- 输出结果:
- This is a macro. The argument have hello and world.
六、#parse 与 #include
#parse 与 #include 指令的功能都是在外部引用文件,而两者的区别是,#parse 会将引用的内容当成类似于源码文件,会将内容在引入的地方进行解析,#include 是将引入文件当成资源文件,会将引入内容原封不动地以文本输出。
示例:
foo.vm 文件:
- #set($name="velocity")
$name
(1)parse.vm 文件:
- #parse("foo.vm")
输出结果:
velocity
(2)include.vm 文件
- #include("foo.vm")
输出结果:
#set($name="velocity") $name
Velocity 语法详解的更多相关文章
- Velocity魔法堂系列二:VTL语法详解
一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...
- Hive笔记--sql语法详解及JavaAPI
Hive SQL 语法详解:http://blog.csdn.net/hguisu/article/details/7256833Hive SQL 学习笔记(常用):http://blog.sina. ...
- Hadoop Hive sql语法详解
Hadoop Hive sql语法详解 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件 ...
- Thymeleaf3语法详解和实战
Thymeleaf3语法详解 Thymeleaf是Spring boot推荐使用的模版引擎,除此之外常见的还有Freemarker和Jsp.Jsp应该是我们最早接触的模版引擎.而Freemarker工 ...
- Xpath语法详解
1.简介 XPath是一门在XML和HTML文档中查找信息的语言,可以用来在XML和HTML文档中对元素和属性进行遍历 XPath的安装 Chrome插件XPath Helper 点Chrome浏览器 ...
- mysql用户授权、数据库权限管理、sql语法详解
mysql用户授权.数据库权限管理.sql语法详解 —— NiceCui 某个数据库所有的权限 ALL 后面+ PRIVILEGES SQL 某个数据库 特定的权限SQL mysql 授权语法 SQL ...
- Java8的Stream语法详解(转载)
1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel agg ...
- [持续交付实践] pipeline使用:语法详解
一.引言 jenkins pipeline语法的发展如此之快用日新月异来形容也不为过,而目前国内对jenkins pipeline关注的人还非常少,相关的文章更是稀少,唯一看到w3c有篇相关的估计是直 ...
- Java 8系列之Stream的基本语法详解
本文转至:https://blog.csdn.net/io_field/article/details/54971761 Stream系列: Java 8系列之Stream的基本语法详解 Java 8 ...
随机推荐
- IOS 多线程-NSThread 和线程状态
@interface HMViewController () - (IBAction)btnClick; @end @implementation HMViewController - (void)v ...
- 20145238-荆玉茗 《Java程序设计》第五次实验报告
实验五 Java网络编程及安全 一.实验内容 1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码,一人加密后通过TCP ...
- EF Database first 中,实现 多个表对应一个 实体的 查询
1.首先 创建好 数据 库. hobby表 major 表 student 表 外键 关系如下 2. 实现将 数据库 映射到EDM中 视图如下 在VS中 生成了 3个实体类 ,对应的是 数据库中的3 ...
- macOS Sierra系统偏好设置->安全性和隐私->通用中的“任何来源” 选项开与关
显示"任何来源"选项在控制台中执行: sudo spctl --master-disable 不显示"任何来源"选项(macOS 10.12默认为不显示)在控制 ...
- input或其他元素的左上角和左下角单独圆角实现
border-bottom-left-radius:6px;/*左下角圆角*/ border-top-left-radius: 6px;/*左上角圆角*/
- iOS接入微信登录可能遇到的问题
前言:记录一下接入微信登录的过程中可能遇到的问题 如果是出现明明已经安装了微信但是显示出来的是没有安装微信,可能出现的问题的地方有: 1.TARGETS->Info->URL Types处 ...
- Django 单元测试
mock 测试 mock 是辅助单元测试的模块,用于测试不方便调用的别人的接口.举个简单的例子,比如说,我们测试django 写的微信登录接口,正常流程下,我们需要前端拉起授权窗口,获取jscode或 ...
- python核心编程2 第八章 练习
8–2. 循环. 编写一个程序, 让用户输入三个数字: (f)rom, (t)o, 和 (i)ncrement . 以 i为步长, 从 f 计数到 t , 包括 f 和 t . 例如, 如果输入的是 ...
- xml解析之stax
博文引自:http://zangweiren.iteye.com/blog/647334 Java 6.0对XML支持的新特性有许多方面.比如StAX.针对XML-Web服务的Java架构(JAX-W ...
- JAVA实现RSA加密,非对称加密算法
RSA.java package org.icesnow.jeasywx.util.security; import java.security.Key; import java.security.K ...