Velocity

是一个基于Java的的模板引擎,通过特定的语法,速度可以获取在的Java语言中定义的对象,从而实现界面和Java的代码的真正分离,这意味着可以使用Velocity替代JSP的开发模式了(实际上笔者所在的公司正在开发基于Cayenne的Velocity产品)。

Cayenne O / R.

Cayenne是一个OpenSource Java对象关系套件,提供运行时O / R框架和Swing GUI映射/部署工具。Velocity用作GUI或Ant任务中基于模板的类生成的引擎。

这使得前端开发人员可以和Java程序开发人员同步开发一个遵循MVC架构的网站点,在实际应用中,Velocity还可以应用于很多其他的场景。

1. Velocity的介绍

Velocity是一个基于Java的的模板引擎,其提供了一个上下文容器,在Java的代码里面我们可以往容器中存值(MVC的模型中,我们往ActionForm里面进行set值,JSP页面自动映射form的数据),然后在虚拟机文件中使用特定的语法获取,这是Velocity基本的用法,其与JSP,freemarker并称为三大视图展现技术,相对于JSP而言,Velocity对前后端的分离更加彻底:在VM文件中不允许出现的java代码,而JSP文件中却可以。

2. Velocty的基本用法

在这里我们以一个HelloVelocity作为速度的入门实例。在首先apache官网下载velocity的最新发布包,新建普通的java项目,引入其中的速度-1.7.jar和LIB文件夹下的所有罐包即可。然后分为如下两步:

2.1初始化速度引擎

编写HelloVelocity.java文件如下:

public static void main(String[] args) {
// 初始化模板引擎
VelocityEngine ve = new VelocityEngine();
ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
ve.init();
// 获取模板文件
Template t = ve.getTemplate("hellovelocity.vm");
// 设置变量
VelocityContext ctx = new VelocityContext();
ctx.put(
"name", "Velocity");
List list = new ArrayList();
list.add("1");
list.add("2");
ctx.put("list", list);
// 输出
StringWriter sw = new StringWriter();
t.merge(ctx,sw);
System.out.println(sw.toString());
}

首先,我们在代码中初始化了VelocityEngine这个模板引擎,对其设置参数进行初始化,指定使用ClasspathResourceLoader来加载虚拟机文件。

然后我们就可以往VelocityContext这个Velocity容器中存放对象了,在虚拟机文件中我们可以取出这些变量,从而进行模板输出。

2.2编写hellovelocity.vm文件

其中,虚拟机文件放在类路径目录下即可,类加载器会进行加载
hellovelocity.vm文件如下:

#set($greet = 'hello')
$greet $name
#foreach($i in $list)
$i
#end

控制台输出如下:

hello Velocity
1
2

2.3 Velocity的基本语法

本文中只简单的介绍几个Velocity的基本语法,可以具体参考这篇文章

3.1变量

在速度中也有变量的概念,使用$符声明变量,可以声明变量也可以对变量进行赋值(变量是弱类型的)。​​另外还可以使用$取出在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引擎会将其原样输出,通过使用$!{}的形式可以将不存在的变量变成空白输出。

3.2循环

在Velocity中可以使用循环语法遍历集合,语法结构如下:

#foreach($item in $list)
$item
$velocityCount
#end

其中,$项目代表遍历的每一项,velocityCount是Velocity提供的用来记录当前循环次数的计数器,默认从1开始计数,可以在velocity.properties文件中修改其初始值

velocity.properties

counter.name = velocityCount

counter.initial.value = 1

3.3条件控制语法

Velocity中可以使用条件语法对流程进行控制

#if(condition)
...dosonmething...
#elseif(condition)
...dosomething...
#else
...dosomething...
#end

3.4宏

Velocity中也有宏的概念,可以将其作为函数来理解,使用#macro声明宏

## 声明宏
#macro(sayHello $name)
hello $name
#end
## 使用宏
#sayHello("NICK")

3.5解析和包含指令

Velocity中可以通过解析

parse

或者包括指令include引入外部VM文件,但是二者存在区别:包括指令会将外部文件原样输出,而解析指令会先对其进行解析再输出(即对外部文件中的VM语法解析)

#parse("header.vm")
#include("footer.vm")

4.在web项目中使用Velocity

velocity只是一个模板引擎,在web项目中使用Velocity还得添加一个HTTP框架来处理请求和转发,apache提供了velocity-tools,其提供了VelocityViewServlet,也可继承VelocityViewServlet,从而实现自己的HTTP框架
一般都是继承的VelocityViewServlet,重写的handleRequest方法,在其中存入公共的参数。

通过继承或直接使用VelocityViewServlet,可以在管理的vm文件中获得请求,会话与应用程序对象,也可以直接获取在这几个域对象中保存的值,获取的顺序与EL表达式获取的顺序类似:
${request}- - > ${session}- > ${application}
比如${testArr}获取testArr属性,速度会在速度的上下文中寻找没找到在请求域中找,没找到在会话中找。

下面将通过实例的方式讲解如何在网络项目中使用速度
首先引入速度的工具依赖及其的相关的jar包,然后分为如下4步:

4.1继承VelocityViewServlet

通过继承的VelocityViewServlet重写的handleRequest方法,可以自定义转发规则

public class MyVelocityViewServlet extends VelocityViewServlet {
@Override
protected Template handleRequest(HttpServletRequest request, HttpServletResponse response, Context ctx) {
// 往Context容器存放变量
ctx.put("fullName","lixiaolin");
// 也可以往request域中存值
request.setAttribute("anotherName","xlli");
// forward到指定模板
return getTemplate("test.vm");
}
}

4.2配置web.xml

对自定义的的VelocityViewServlet配置就像配置普通的Servlet的一样,如下:

<servlet>
<servlet-name>MyVelocityServlet</servlet-name>
<servlet-class>com.lxl.velocity.MyVelocityViewServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyVelocityServlet</servlet-name>
<url-pattern>/servlet/myVelocityServlet</url-pattern>
</servlet-mapping>

4.3编写vm文件

VM文件是作为JSP的替代来展示给用户,在VM文件中可以获得在上下文域或请求等域中存放的值。默认情况下,会在资源根路径下搜索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>

4.4配置velocity.properties

通过配置velocity.properties文件,可以自定义虚拟机文件加载方式,指定编码等。当然,也可以不配置velocity.properties,使用缺省的值即可。

## 设置模板文件加载器,webapp从应用根目录加载
resource.loader = webapp
webapp.resource.loader.class = org.apache.velocity.tools.view.WebappResourceLoader
## 模板路径,根目录下的vm文件夹
webapp.resource.loader.path = /vm
## 设置编码
input.encoding = UTF-8
output.encoding = UTF-8

最后,浏览在器中访问http://localhost:8080/VelocityApp/servlet/myVelocityServlet即可

5.使用VelocityLayoutServlet

在网络站点开发的过程中,经常会碰到几个页面的布局大致相同,比如引用相同的头部和尾部,左侧边栏相同等,在使用JSP开发时我们可以将头部等公共文件抽离出来,然后在实际页面中引入.Velocity也提供了类似的功能,并且该功能更加强大。

apache提供了VelocityLayoutServlet来实现页面布局,它是的VelocityViewServlet的子类,通过使用VelocityLayoutServlet可以简化Velocity下页面布局开发,可以使当向前到一个VM页面时,把该页面作为一个已有页面布局的一部分整体显示出来,比如访问资料页面,能够自动把头,尾部显示出来

Velocity的工具包中已经包含了这个类,其使用分为如下几步:

5.1配置velocity.properties

在/ WEB-INF /路径下配置velocity.properties文件,指定模板布局文件的位置

input.encoding=UTF-8
output.encoding=UTF-8
## 定义加载器
resource.loader=webapp
webapp.resource.loader.cache=false
## 布局文件夹位置
tools.view.servlet.layout.directory = /templates/layout
## 定义默认布局文件
tools.view.servlet.layout.default.template = layout.vm
## 错误模板文件
tools.view.servlet.error.template = err.vm

5.2布局母版vm文件

布局layout.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内置的变量,代表将要转发的页面

5.3编写转发的vm文件

#set($layout = "/templates/layout/layout.vm")
#set($CSS = ["scripts/css/index.css"])
#set($JS = ["scripts/js/jquery-1.11.3.js"])
#set($page_title = "主页")
#set($sub = "/templates/sub.vm") <div id="main-show">
this is main-show
</div>

5.4继承VelocityLayoutServlet

public class MyLayoutServlet extends VelocityLayoutServlet {
@Override
protected void doRequest(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 设置通用的变量
request.setAttribute("Request", request);
request.setAttribute("ContextPath", request.getContextPath());
request.setAttribute("BasePath", request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath()); long runtime = System.currentTimeMillis();
super.doRequest(request, response); if (request.getAttribute("close_comment") == null) {
Date cur_time = Calendar.getInstance(request.getLocale()).getTime();
PrintWriter pw = response.getWriter();
pw.print("\r\n<!-- Generated by VelocityApp Server(");
pw.print(cur_time);
pw.print(") Cost ");
pw.print(cur_time.getTime() - runtime);
pw.print(" ms -->");
pw.flush();
pw.close();
}
}
}

6.附录及参考文献

参考文献

Velocity的学习1的更多相关文章

  1. javascript动画:velocity.js学习

    第二章:基础知识 一.velocity和jQuery: Velocity函数是独立于jQuery的,但两者可以结合使用.通常这么做的好处是可以利用jQuery的链式操作:当你先用jQuery选择了一个 ...

  2. Velocity模板学习(一)

    一.Velocity是什么 Velocity是一个基于Java的模板引擎,允许任何人仅仅简单地使用模板语言就可以引用由Java代码编写的对象. 二.Velocity的基本语法 1.变量 变量的定义 在 ...

  3. jquery动画切换引擎插件 Velocity.js 学习02

    案例实践: 第一页会以动画形式进入页面: 点击进入按钮时,第一页以动画消失,第二页以动画形式进入,同时四张图片也定义从小到大的动画形式: 第二页关闭按钮点击时,先是四张图片以缩小动画消失,然后第二页以 ...

  4. jquery动画切换引擎插件 Velocity.js 学习01

    一.Velocity.js介绍 Velocity是一个jQuery插件,重新实现了$.animate() 来产生更高的性能(速度也比CSS动画库更快),而包括新的功能,以提高动画工作流程. Veloc ...

  5. 使用 Velocity 模板引擎快速生成代码(zhuan)

    http://www.ibm.com/developerworks/cn/java/j-lo-velocity1/ ****************************************** ...

  6. 使用Velocity 模板引擎快速生成代码

    Velocity 模板引擎介绍 在现今的软件开发过程中,软件开发人员将更多的精力投入在了重复的相似劳动中.特别是在如今特别流行的MVC架构模式中,软件各个层次的功能更加独立,同时代码的相似度也更加高. ...

  7. Velocity入门系列

    Velocity介绍 Velocity是一个java模板引擎,通过简洁的语法可以返回动态内容给浏览器使用,本系类是基于velocity官方文档(就是照着翻译,同时对不清楚的地方进行详细讲解),其实技术 ...

  8. velocity的基础使用

    velocity的基本使用要求:掌握jsp的jstl技术,因为velocity的用法和jstl非常相似.语法上差别不大,但是velocity的示例明显比jstl少,解释也少,所以使用velocity必 ...

  9. Velocity之初印象

    Velocity 模板引擎介绍 在现今的软件开发过程中,软件开发人员将更多的精力投入在了重复的相似劳动中.特别是在如今特别流行的 MVC 架构模式中,软件各个层次的功能更加独立,同时代码的相似度也更加 ...

随机推荐

  1. SSL Certificates深入理解

    http://www.littlewhitedog.com/content-71.html https://www.verisign.com/en_US/website-presence/websit ...

  2. 在 Azure VM 上安装 LAMP Web 服务器

    本文逐步讲解如何在 Azure 中的 Ubuntu VM 上部署 Apache Web 服务器.MySQL 和 PHP(LAMP 堆栈). 如果想要部署 NGINX Web 服务器,请参阅 LEMP ...

  3. [CENTOS7] 加入Windows域

    This following article is a snapshot from: https://www.rootusers.com/how-to-join-centos-linux-to-an- ...

  4. 在虚拟机里安装linux(centos 6.5)系统

    菜鸟一枚,也是接触linux系统没多长时间,前一阵子网上说有一个高级数据库工程师,因为rm -rf / 命令干掉了数据库-(nb),居然还跑路了!厉害了我的哥!也是闲的我蛋疼,在虚拟机里试了一批,本来 ...

  5. Linux 重定向详解

    常用的命令展示 >: 输出重定向             没有会创建文件echo hello > h.txt          也可以清空文件 >h.txt    >>: ...

  6. QQ邮箱验证码

    人的记忆有时候跟鱼一样,只有七秒钟,短暂的时间! .NET  Web窗体实现忘记密码,使用QQ邮箱验证修改 一.首先设置一下发送个人或企业发送的邮箱 二.登录邮箱进行设置,如图:  三.关闭邮箱 四. ...

  7. ZT 计算一个无符整数中1Bit的个数(1) 2010-04-20 10:52:48

    计算一个无符整数中1Bit的个数(1) 2010-04-20 10:52:48 分类: C/C++ [转]计算一个无符整数中1Bit的个数(1)   Count the number of bits ...

  8. Windows10 1709正式版WSL安装(以Ubuntu为例)

    因为最近要使用Linux搭服务器,但是用远程的话延迟很烦,用双系统切换很麻烦,用虚拟机又会有点卡,刚好Windows10最近更新了正式版的WSL(windows下的Linux子系统),所以就想尝试一下 ...

  9. iOS AOP框架Aspects实现原理

    总结: Aspects 是对 类的继承结构isa.mataclass结构的调整和维护:相当于链表的节点插入和删除: 同时使用method Swizzling 对方法统一重定向: 同时使用类似代理的机制 ...

  10. BZOJ2425:[HAOI2010]计数(数位DP)

    Description 你有一组非零数字(不一定唯一),你可以在其中插入任意个0,这样就可以产生无限个数.比如说给定{1,2},那么可以生成数字12,21,102,120,201,210,1002,1 ...