1.什么是Velocity
Velocity是一个基于Java的模板引擎,通过特定的语法,Velocity可以获取在java语言中定义的对象,从而实现界面和java代码的真正分离,这意味着可以使用velocity替代jsp的开发模式了(实际上笔者所在的公司已经这么做了)。这使得前端开发人员可以和 Java 程序开发人员同步开发一个遵循 MVC 架构的 web 站点,在实际应用中,velocity还可以应用于很多其他的场景.
2.velocity介绍
Velocity是一个基于Java的模板引擎,其提供了一个Context容器,在java代码里面我们可以往容器中存值,然后在vm文件中使用特定的语法获取,这是velocity基本的用法,其与jsp、freemarker并称为三大视图展现技术,相对于jsp而言,velocity对前后端的分离更加彻底:在vm文件中不允许出现java代码,而jsp文件中却可以.
在这里我们以一个HelloVelocity作为Velocity的入门实例.首先在官网下载velocity的最新发布包,新建普通java项目,引入其中的velocity-1.7.jar和lib文件夹下的所有jar包即可. 然后分为如下两步。
4.velocity变量
在Velocity中也有变量的概念,使用$符声明变量,可以声明变量也可以对变量进行赋值(变量是弱类型的)。另外还可以使用$取出在VelocityContext容器中存放的值
#set($!{name} = "velocity") #set($!{foo} = $bar) #set($foo =“hello”) #set($foo.name = $bar.name) #set($foo.name = $bar.getName($arg)) #set($foo = 123) #set($foo = [“foo”,$bar])
使用$vari获取变量时,如果变量不存在,Velocity引擎会将其原样输出, 通过使用$!{}的形式可以将不存在的变量变成空白输出.
5.velocity循环
#foreach($item in $list) $item $velocityCount #end
$item代表遍历的每一项,elocityCount是Velocity提供的用来记录当前循环次数的计数器,默认从1开始计数,可以在velocity.properties文件中修改其初始值
6.velocity条件控制语句
#if(condition) ...dosonmething... #elseif(condition) ...dosomething... #else ...dosomething... #end
7.velocity宏
## 声明宏 #macro(sayHello $name) hello $name #end ## 使用宏 #sayHello("NICK")
8.velocity网页嵌套
在Velocity中可以通过parse或者include指令引入外部vm文件,
二者存在区别:include指令会将外部文件原样输出,而parse指令会先对其进行解析再输出(即对外部文件中的vm语法解析)
#parse("header.vm") #include("footer.vm")
9.vm文件
vm文件是作为jsp的替代来展示给用户
在vm文件中可以获得在Context域或request等域中存放的值。
默认情况下,会在资源根路径下搜索vm文件,所以直接将vm放在根路径下即可(也可以通过配置velocity.properties指定加载路径)
如下:
#set($greet = "hello") <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <p>$!{greet} $!{fullName}</p> <p>my another name is $!{anotherName}</p> </body> </html>
10.布局母版vm文件
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>${page_title}</title> #if($!{CSS}) #foreach($_css in ${CSS}) <link type="text/css" rel="stylesheet" href="${ContextPath}/$_css"> #end #end </head> <body> <div class="header"> #parse("/templates/layout/header.vm") </div> <div class="container"> <div class="sub"> #parse($sub) </div> <div class="main"> $screen_content </div> </div> #if($!JS) #foreach($_js in $JS) <script type="text/javascript" src="${CntextPath}/${_js}"> #end #end </body> </html>
其中,有个特殊的变量 screen_content,这是Velocity内置的变量,代表将要转发的页面