`
ckf53390
  • 浏览: 27614 次
文章分类
社区版块
存档分类
最新评论

velocity模板学习

 
阅读更多

一:先看一个例子

其实挺简单,先以一个例子说明。 

建立一个项目velocity_app

建立一个模板文件:example.vm,该文件放到项目的根目录。内容是:
<html>
<body>
Hello $name, this is Velocity working!
</body>
</html>

建立一个java文件,Example.java,内容如下:

package velocity;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.Template;
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import java.io.*;

public class Example{
    public Example(){   
     try {
   VelocityEngine engine = new VelocityEngine(); 
   engine.init(); 
   Template template = engine.getTemplate( "example.vm" ); 
   VelocityContext context = new VelocityContext(); 
   context.put("name", "wangxiaoxue"); 
   StringWriter writer = new StringWriter(); 
   template.merge( context, writer ); 
   System.out.println( writer.toString() );
  } catch (ResourceNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (ParseErrorException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (MethodInvocationException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } 
    }


    public static void main(String[] args){
        new Example();
    }
}

运行后,控制台输出:

<html>
<body>
Hello wangxiaoxue, this is Velocity working!
</body>
</html>

二:详细的介绍

 

Velocity,名称字面翻译为:速度、速率、迅速,用在Web开发里,用过的人可能不多,大都基本知道和在使用Struts,到底VelocityStruts(TaglibTiles)是如何联系?在技术上Velocity要比Struts Struts(TaglibTiles)先进,单从技术上考虑可以考虑Velocity;而Struts用的非常普遍,这样的人才也很多,所以对于公司来说,选择Struts的人才容易点。毕竟Velocity提供了一个很好的思维方式,给大家换了一种思考的方式。

 

Velocity是一种Java模版引擎技术,该项目由Apache提出,由另外一种引擎技术Webmacro引深而来。那什么是官方的Velocity定义呢?Apache对它的定义是:一种基于Java的模板引擎,但允许任何人使用简单而强大的模板语言来引用定义在Java代码中的对象。目前最新的版本是1.4,可以在http://jakarta.apache.org/velocity/index.html查找更多信息。

 

其实Velocity就是MVC架构的一种实现,但它更多的是关注在ModelView之间,作为它们的桥梁。对于MVC的最流行架构Struts来说,相信大家都不陌生,很多开发人员已经大量在使用Struts架构,包括IBMWebsphere 5以上的管理平台版本,Struts技术很好的实践了MVC,它有效的减少Java代码在ViewJsp)中的出现,但在ModelView之间还是依靠StrutsTaglib技术来实现,试想如果前台开发的网页设计师对Struts乃至Taglib不熟(相信也挺难熟的,包括后期的维护人员也一样),将会对网页设计师和前台开发工程师的相互协作开发带来很大的难度,现实开发中也还是存在这样事实,网页设计师和前台开发之间的工作或多或少还是存在一定的耦合,怎样最大限度的解决这个难题呢?还是让我们来看看Velocity或者说这个概念吧。

 

下面是一个简单的Velocity例子:

 

1、创建velocity模版(其实和html一样),文件名为:hellovelocity.vm

 

<html> 
<title>Hello Velocity</title> 
<body> 
Welcome  $name  to Javayou.com! 
today is  $date. 
</body>
</html>

 

 

 

2、创建java文件,HelloVelocity.java 

 

package com.fasttalk. velocity; 
import java.io.StringWriter; 
import java.util.*; 
import org.apache.velocity.app.VelocityEngine; 
import org.apache.velocity.Template; 
import org.apache.velocity.VelocityContext;

 

public class HelloVelocity { 
public static void main(String[] args) throws Exception {
//初始化并取得Velocity引擎
VelocityEngine ve = new VelocityEngine();
ve.init();
//取得velocity的模版 
Template t = ve.getTemplate("hellovelocity.vm"); 
//取得velocity的上下文context 
VelocityContext context = new VelocityContext();
//把数据填入上下文 
context.put("name", "Liang"); 
context.put("date", (new Date()).toString());
//为后面的展示,提前输入List数值 
List temp = new ArrayList();
temp.add("1"); 
temp.add("2"); 
context.put("list", temp); 
//输出流 

StringWriter writer = new StringWriter();
//转换输出 
t.merge(context, writer); 
System.out.println(writer.toString());

}

 

 

 

 

 

http://jakarta.apache.org/site/binindex.cgi上下载Velocity 1.4 zip

 

4、把1上的hellovelocity.vm copy到运行的当前目录下,运行结构如下:

 

<html> 
<title>Hello Velocity</title> 
<body> 
Welcome Liang to Javayou.com! 
today is Tue Dec 14 19:26:37 CST 2004. 
</body> 
</html>

 

 

 

以上是最简单的运行结果,怎么样,知道个大概吧,模版hellovelocity.vm里的2个定义变量$name$date分别被context.put("name", "Liang")context.put("date", (new Date()).toString())所设的值替代了。

 

由此看来业务流程处理包括业务结果基本在model这层全部解决,而view这一层基本只用使用简单的VTLVelocity Template Language)来展示。这样,Jsp岂不是不用了么?是的,这样的使用模式有点象早前的CGI方式:)由Velocity自动输出代码,并且Velocity在这方面的能力也很强,Turbine里就采用了Velocity来产生很多代码。

 

Velocity中,变量的定义都是使用“$”开头的,$作为Velocity的标识符。字母、数字、中划和下划线都可以作为Velocity的定义变量。

 

还需要注意的是Velocity特色的变量定义,如:$student.No$student.Address,它有2层含义:

 

l         1种是如果studenthashtable,则将从hashtable中提取keyNoAddress的值,

 

l         另外第2种就是它有可能是调用方法,即上面2个变量将被转换为student.getNo()student.getAddress()

 

Velocity对在servlet中的java code返回的值有对象,还可以调用对象的方法,如$ student.getAddress()等等,在此就不一一举例和深入了。

 

上面的例子只是简单的举例,现在当然不少人已经不满足这样的例子了,实际的应用中我们还常常需要作些选择性展示和列举一些迭代数据,如List列表,当然Velocity(具体来说应该是VTL模版语言)也支持这项功能,此外还支持其他一些常用的展示,如模版内部的变量(如Jsp内的变量),还有强大一些的如创建宏以实现自动化,让我们继续接着往下看吧。

 

我们还是使用上面的例子,把模版hellovelocity.vm中的内容改为:

 

#set( $iAmVariable = "good!" )
Welcome $name to csdn.net! 
today is $date. 
$iAmVariable

 

 

 

重新执行上面的运行命令,结果:

 

Welcome Liang to csdn.net! 
today is Tue Dec 14 22:44:39 CST 2004.
good!

 

 

 

可以看得模版中的变量定义为# set开头的语句,不是很难理解,执行后模版中的变量$iAmVariable都转换成定义的值:good!

 

再来看看简单的选择,把模版hellovelocity.vm中的内容改为:

 

#set ($admin = "admin") 
#set ($user = "user")  
#if ($admin = = $user) 
Welcome admin! 
#else  
Welcome user! 
#end

 

 

 

执行运行命令,结果:

 

Welcome user!

 

 

 

可以看到判断语句只是简单的#if ()#else#end,不是很复杂。

 

接着继续来看看迭代数据吧,把模版hellovelocity.vm中的内容改为:

 

#foreach( $product in $list ) 
<li>$product</li> 
#end

 

 

 

执行运行命令,结果:

 

<li>1</li>

 

<li>2</li>

 

把在例子中预先保存在VelocityContextList中的值列举了出来,是不是很方便啊?仅仅只是用了#foreach$variable in xx 而已,如果上面的List换成Hashtable,则可以用下面的语法:

 

#foreach($key in $hashVariable.keySet() ) 
<li> $key ‘s value: $ hashVariable.get($key) </li> 
#end

 

 

 

一点不觉得这些脚本很复杂。

 

还有不少人还会问,如果是javabean怎么办?好的,我们增加一个bean

 

package com.fasttalk.velocity; 

public class Student {  
//
注意class的属性是public
  
public String no = "";  
public String address = ""  
public Student(String _no, String _address) { 
no = _no; 
address = _address; 
}  
public String getAddress() {  
return address; 
}  
public void setAddress(String address) {  
this.address = address; 
}  
public String getNo() {  
return no; 
}  
public void setNo(String no) {  
this.no = no; 
}  
}

 

 

 

这个Student是实足的javabean,或者说是data bean,常见的用来装载数据的类,然后我们修改HelloVelocity.java,把:

 

temp.add("1");

 

temp.add("2");

 

 

 

 

 

替换成:

 

temp.add(new Student("123", " Guangzhou"));  
temp.add(new Student("456", "Zhuhai"));

 

 

 

再把hellovelocity.vm的内容改为:

 

#foreach ($s in $students) 
<$velocityCount> Address: $s.address  
#end

 

 

 

重新编译和执行运行命令,结果如下:

 

<1> Address: Guangzhou  
<2> Address: Zhuhai

 

 

 

这样把listStudent的数据打印了出来,大功告成!这里用了Velocity的内建变量$velocityCount,指的是默认的列举序号,从1开始,也可以改成0开始,但需要在Velocity.properties中更改,Velocity.properties位于velocity-1.4.jar包内的目录org/apache/velocity/runtime/defaults 下。

 

再复杂一些的迭代怎么处理呢?我们看看下面的模版例子就清楚了:

 

#foreach ($element in $list)
 -- inner foreach -- 
#foreach ($element in $list) 
This is $element. 
$velocityCount 
#end
-- inner foreach -- 
-- outer foreach -- 
This is $element. 
$velocityCount 
-- outer foreach -- 
#end

 

 

 

看出来了吧,Velocity是支持标签嵌套的,这个可是很强大的功能,这里就不深入演示了,如果有兴趣,自己试试吧。

 

其实,稍为深入思考刚刚我们举的例子,就已经可以看出来,Velocity的用处在哪里?即Servlet + Velocity的模式,另外,还记得我们早期Jsp开发的模式Jsp+JavaBean吗?在这里,我们更改为Servlet+JavaBean+Velocity,想想,是不是已经替代了Jsp+JavaBean,并更彻底的把Java代码去除在Jspvm)外,如果光使用StrutsServlet+Jsp),那么带来的代价是Java代码总或多或少出现在Jsp上,即使可以做到不出现Java代码,但做过复杂架构系统的开发者都知道,代价也是很昂贵的,并且在可维护性、和网页设计师的集成开发上存在一定的困难,所以我们在这里能感觉到,Servlet+JavaBean+Velocity的模式较好的实现了OOD的概念。而在效率上,大家也不用担心,此种结合方式比Servlet+Jsp的方式要高效一些。

 

愿意了解Velocity的人应该不少,但真正实用到项目的,也许不多(还是有些项目在使用,如Jute),毕竟和Jsp比起来,Jsp更标准、更广泛使用和有不少开发工具已经支持Jsp开发。但Velocity的功能不会仅仅局限在和Jsp竞争的局面,由上可看出它在自动代码输出方面功能很强,前面提到Turbine就是采用Velocity来生成很多代码,你也可以稍加改动就可以做成代码生成器,或其他模版生成上,都是很不错的想法。

 

好了,我们再来看看要深入Velocity来做项目,还需要注意的一些常见问题吧,首先是国际化的问题,

 

Velocity本身支持模版的国际化编码转换,看看Velocity提供的方法:

 

Public Template getTemplate (Stirng template, String encoding)

 

由此推测这样做其实不能彻底的做到国际化。

 

最简单的在Struts中国际化的概念,即在Jsp上使用国际化语言标签的方式来做到,而每种语言采用不同的语言标签库的方式,引申到这里,其实手工来做一样可以做到,只不过需要稍加手工处理而已。

 

好在已经有人处理了上面所说问题,做成了Velocitytools: MessageTool,提供了变量text包含国际化标签,这样只需要简单的编写标签代码即可,如:$text.get(‘title’),更多具体的内容还可在http://jakarta.apache.org/velocity/tools/struts/MessageTool.html 中了解。

 

好了,基于Velocity的介绍我们就说这么多,再说说其他引伸方面的内容吧。有人评论Velocity不是标准的MVC结构,没错,刚开始我们就说过Velocity只是ModelView之间的良好结合,只是个好的模版引擎,毕竟还没有形成MVC三者良好的结合。好在Apache又基于StrutsVelocity的结合,推出了VelocityStruts,这部分的陈述我们可以在后面的专题里再推出,这里简单介绍它的概念,它是在Struts的结构上,在业务逻辑处理的Action后,把业务流程转向基于Velocity的显示层,从而代替Jsp作为View层。以上我们也看到了所举的例子基本上只是基于原理和演示,没有和Web开发紧密结合起来,这方面内容我们在讲述VelocityStruts的内容时再来结合吧。

 

谈到Velocity,在这里要顺便提提FreeMarkerFreeMarker也是一种模版引擎,和Velocity功能基本类似,都是简单和轻量级的工具,但功能上较Velocity有不少增强的地方,这我们也在以后的文章中再来深入了解吧。

 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=398059

 

分享到:
评论

相关推荐

    velocity模板使用指南中文版

    velocity是一个很实用的页面工具,相对于jsp更便于开发维护,本文档是他的一个基础使用工具,便于比更快学习使用velocity!

    Java进阶教程Velocity快速掌握模板引擎视频

    本课程的定位是velocity的系统教学课程 , 从基础到进阶 , 所以只要对velocity感兴趣 , 想系统学习velocity的开发人员都可以学习本课程 ! 学习本课程对你有如下要求 : l 有一定的JAVA编程基础(velocity engine要求) l...

    JAVA的Velocity语法学习

    JAVA的Velocity语法学习 内涵《Velocity_java开发指南》《Java的模板引擎Velocity初体验》 以及所必须的jar ,和大家一块学习,很好哦

    Velocity文档中文版

    Velocity 是一个基于 Java 的模板引擎(template engine),它允许任何人仅仅简单的使用模板语言(template language)来引用由 Java 代码定义的对象。 Velocity 的能力远不止 web 站点开发这个领域,例如,它可以从...

    velocity学习资料.zip

    Velocity学习资料,从网上找到的其中学习笔记由个人编写,希望大家借鉴,后续继续完善中。

    Velocity1.4 学习指南中文版

    Velocity 的主要目标是通过模板生成格式文档. 因此, Velocity自身不提供任何Web相关的功能. 当你需要开发Web应用时, 需要一个框架来接收 HTTP请求和, 处理用户认证,执行业务逻辑调用,最后生成应答内容返回给客户端...

    Velocity学习指南(中文版).rar

    Velocity用户指南旨在帮助页面设计者和内容提供者了解Velocity和其简单而又强大的脚本语言(Velocity Template Language (VTL))。...Velocity+Turbine 方案提供的模板服务将允许web 应用按真正的mvc模式进行开发。

    velocity document

    velocity使用文档,系统了解velocity模板技术,系统讲述velocity的使用,可以结合freemarker的思想学习这种视图模板技术

    velocity_中文手册

    velocity_中文手册,是学习velocity模板编程不可多得的入门级教程。

    velocity学习文档

    《velocity Java开发指南中文版》 《Velocity Web应用开发指南中文版》 《Velocity模板使用指南中文版》

    velocity学习指南

    velocity学习指南 Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。

    velocity入门基础

    想学习velocity模板语言的可以看一看,内容比较简洁,适合初学者使用。

    velocity中文版教程

    很不错的velocity学习资料 Velocity 是一个基于java 的模板引擎(template engine)。它允许任何人仅仅简单的使 用模板语言(template language)来引用由java 代码定义的对象。 当Velocity 应用于web 开发时,界面...

    velocity学习笔记

    6.Parse(解析模板) 7.Stop 8.Velocimacros(宏调用) 13.注掉 VTL Directives 14.VTL: 一般使用的格式 15.Other Features and Miscellany(其它特性和细节) 1.数学计算 2.Range Operator 3.Advanced Issues: Escaping ...

    基于RCP和velocity的java代码生成器

    基于RCP和velocity的java代码生成器 该代码生成器只可用于mysql数据库 版权公司所有 仅供交流学习 注意:请把templates文件下的模板拷贝到C:根目录下 各类都有注释 JDK6 Myeclipse6开发

    velocity

    Velocity 是一个基于java 的模板引擎(template engine),它允许任何人仅仅简单的使用模板语言(template language)来引用由java 代码定义的对象。压缩包内有我当初学习时,向网络上一位同仁要的ppt,还有一个简明...

    viocity学习资料

    内涵:Velocity_Java开发指南中文版,Velocity教程_天马行空,Velocity模板使用指南中文版,VTL语法参考指南中文版

    NVelocity中文文档以及NVelocity.dll 1.0(适用用.net环境下)

    NVelocity是Java模板引擎...要使用NVelocity模板技术需要学习VTL语言。网络上关于NVelocity的VTL语言介绍的比较少,不过没有关系,由于NVelocity是有Velocity移植过来的所以Velocity的VTL语言完全适用于NVelocity。

    Thymeleaf3模版开发中文手册.zip

    类似JSP,Velocity,FreeMaker等, 它也可以轻易的与Spring MVC等Web框架进行集成作为Web应用的模板引擎。与其它模板引擎相比, Thymeleaf最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个...

    springboot学习

    chapter3-1-4:使用Velocity模板引擎渲染web视图 chapter3-1-5:使用Swagger2构建RESTful API chapter3-1-6:统一异常处理 chapter3-1-7:使用Java 8中LocalDate等时间日期类的问题解决 chapter3-1-8:扩展XML请求和...

Global site tag (gtag.js) - Google Analytics