velocity
简介
Velocity是一个基于java的模板引擎(template engine),它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。它作为一款成熟的基于java的模板引擎,能够帮我们实现页面静态化,同时它将Java代码与网页分开,使网站在其生命周期内更加可维护,并为Java Server Pages(JSP)或PHP提供了可行的替代方案。
基本语法
#
Velocity关键字都是使用#开头的,如#set、#if、#else、#end、#foreach等
$
Velocity变量都是使$开头的,如:$name、$msg
!
如果某个Velocity变量不存在,那么页面中就会显示$xxx的形式,为了避免这种形式,可以在变量名称前加上!如页面中含有$!msg,如果msg有值,将显示msg的值;如果不存在就会显示为空白(建议使用)
变量
变量的定义
<body> #set($root = "www") //定义root变量值为www #set($name = "index") //定义name变量值为index #set($template = "$root/$name") //定义template变量值为www/index hello $template </body>
输出结果
hello www/index
变量的赋值
赋值的左边必须是一个变量,或者是属性的引用。右边可以是:变量引用、字面字符串、属性引用、方法引用、字面数字、数组
#set($name = $bill) ##变量引用 #set($name.pre = "monica") ##字符串 #set($name.last = $address.num) ##属性引用 #set($name.mid = $hotel.find($web)) ##方法引用 #set($name.num = 123) ##数字 #set($name.say = ["yes",$my,"yes"]) ##数组
velocity会将属性解释为属性的get方法,如:
$foo.Bar 等同于 $foo.getBar() $foo.User("join") 等同于 $foo.getUser("join") $foo.Request.ServerName 等同于 $foo.getRequest().getServerName()
循环
#foreach( 单个元素名称 in 集合) .... #end
$velocityCount
在foreach中velocityCount表示循环的次数
$velocityCount是循环的索引值
$velocityCount都是从1开始计数
示例:
#foreach($ofl in $!obj.ofls)
#if($velocityCount==1)
<h1><span class="fl">创建时间:<em>$!ofl.addTime</em></span></h1>
#end
注意:加1的情况可以正确计算出结果,并且能够正确显示,可是减1的语句直接作为一个字符串输出了,不能计算出结果。
解决方案:
v#set($temp=$velocityCount)
$temp-1
示例
#foreach( $num in [2..-2]) this is $num.</br> #end
输出
this is 2. this is 1. this is 0. this is -1. this is -2
条件
#if(condition) ...... #elseif(condition) ...... #else ...... #end
判断null或者false
#if( !$name)
something code
#end
判断null或者空字符串
#if( "$!name" == "")
something code
#end
关系和逻辑操作符
&& 并且 || 或者 ! 取反
注释
单行注释##
##这里写注释
多行注释#* *#
#*
这个写注释 可以写多行的注释
*#
基本的使用步驟
- 初始化Velocity。Velocity可以使用两种模式,作为“单独的运行时实例”的单例模式(在下面的内容会介绍),你仅仅只需要初始化一次。
- 创建一个Context对象(后面会介绍这是什么)。
- 把你的数据对象添加到Context(上下文)。
- 选择一个模板。
- ‘合并’ (merge)模板和你的数据输出。
结合springboot测试
<!--在高版本的springboot中是不支持velocity了。最高只到1.4.x版本支持-->
<!-- 引入velocity模板 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-velocity</artifactId>
</dependency>
<!--<dependency>-->
<!--<groupId>org.apache.velocity</groupId>-->
<!--<artifactId>velocity</artifactId>-->
<!--<version>1.7</version>-->
<!--</dependency>-->
<!--<dependency>-->
<!--<groupId>org.apache.velocity</groupId>-->
<!--<artifactId>velocity-tools</artifactId>-->
<!--<version>2.0</version>-->
<!--</dependency>-->
yml配置文件
spring.velocity.cache= false
spring.velocity.charset=UTF-8
spring.velocity.check-template-location=true
spring.velocity.content-type=text/html
spring.velocity.enabled=true
spring.velocity.resource-loader-path=/templates
spring.velocity.prefix=/templates/
spring.velocity.suffix=.vm
Controller层
@Controller
public class VelocityContoller {
@RequestMapping("/")
public String index(Map map){
User user = new User();
user.setAge(23);
user.setDate(new Date());
user.setId("1");
user.setName("张三");
map.put("message", "获取用户信息");
map.put("name", "张三");
//map.put("age", "24");
map.put("user",user);
return "index";
}
}
index.vm
<!DOCTYPE html>
<head lang="en">
<meta charset="UTF-8" />
<title>Insert title here</title>
</head>
<html>
<body>
$message
$name
$!age
<br>
$user.age
$user.getId()
$user.name
$user.date
<br>
#if($user.getId()==2)
id為:$user.getId()
#else
id為:null
#end
<br>
#set($ljk="luojiankang")
$ljk
</body>
</html>
输出页面上
总结
Velocity将Java代码从Web 页面中分离出来,使用Web站点从长远看更容易维护,并且提供了一种可行的JavaServer Pages替代解决方案。
Velocity是一种基于Java的模板引擎,但允许任何人使用简单而强大的模板语言来引用定义在Java代码中的对象。
Velocity就是MVC架构的一种实现,但它更多的是关注在Model和View之间,作为它们的桥梁。