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

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

 

分享到:
评论

相关推荐

    哈尔滨工程大学833社会研究方法2020考研专业课初试大纲.pdf

    哈尔滨工程大学考研初试大纲

    基于ASP酒店房间预约系统(源代码+论文)【ASP】.zip

    基于ASP酒店房间预约系统(源代码+论文)【ASP】

    毕业设计基于机器学习的DDoS入侵检测python源码+设计文档.zip

    毕业设计基于机器学习的DDoS入侵检测python源码(高分项目).zip个人经导师指导并认可通过的高分毕业设计项目,评审分98分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。

    NewNormal.txt

    NewNormal

    re2-0.2.14.tar.gz

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    哈尔滨工程大学《常微分方程》2020考研专业课复试大纲.pdf

    哈尔滨工程大学考研复试大纲

    grpcio-1.14.0-cp35-cp35m-macosx_10_7_intel.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    哈尔滨工程大学《化工原理》2020考研专业课复试大纲.pdf

    哈尔滨工程大学考研复试大纲

    基于 STM32 U575 芯片组

    头 microSWIFT V2 固件,基于 STM32 U575 芯片组。作为项目导入到STM32CubeIDE中

    bailando 网络 smpl pkl 数据+ blendershape csv数据集训练代码

    bailando 网络 smpl pkl 数据+ blendershape csv数据集训练代码

    cryptography-2.0-cp34-cp34m-manylinux1_x86_64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    Arthas测试使用-ThreadDeadLock代码

    Arthas测试使用

    re2-0.2.21.tar.gz

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于Java的基于流媒体的vod视频点播网(源码+论文+需求分析+数据库文件+演示视频).zip

    本系统最大的特点是使用操作简单、友好的提示信息。本系统将实现以下基本功能: (1) 系统具有简洁大方的页面,使用简便,友好的错误操作提示 (2) 管理员用户具有系统信息管理、班级信息管理、教师信息管理、学生信息管理、公告管理、留言管理、资料管理、点播视频管理等功能。 (3) 具有较强的安全性,避免用户的恶意操作 本基于Web技术的B/S结构的系统采用jsp技术进行开发设计,开发环境是MyEclipse,服务器采用tomcat,通过jdbc驱动和数据库进行无缝连接,具有较高的完整性,一致性和安全性。

    基于Python+PyQt5的网上书店管理系统源码+项目说明(含登录功能+课设报告).zip

    基于Python+PyQt5的网上书店管理系统源码+项目说明(含登录功能+课设报告).zip 基于Python+PyQt5的网上书店管理系统源码+项目说明(含登录功能+课设报告).zip 基于Python+PyQt5的网上书店管理系统源码+项目说明(含登录功能+课设报告).zip 【优质项目推荐】 1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 2.项目主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、项目初期立项演示等用途。 4.如果基础还行,或热爱钻研,可基于此项目进行二次开发,DIY其他不同功能。 基于Python+PyQt5的网上书店管理系统源码+项目说明(含登录功能+课设报告).zip 功能 - 智能检查:检查书店存在此图书以及电话号码是否合法 - 采用下拉框智能补全,通过出售书名来补全,作者信息栏,通过出售书名来补全出版社,以确保书名,作者,出版社一一对应;通过买方手机号来补全默认配送地址,配送地址可随改 - 智能提示:提示书名与电话号码填写问题 - 第二遍确认 ### 修改图书页 ![](https://gowi-picgo.oss-cn-shenzhen.aliyuncs.com/picgo/20200607204627.png) 功能: - 修改图书信息(按下修改,使其一行可以修改,其余行不可修改,且不同行按钮处于冻结状态,按下完成按钮修改内容同步至数据库) - 翻页 - 返回上一级 - 查询 ### 查看会员信息 ![](https://gowi-picgo.oss-cn-shenzhen.aliyuncs.com/picgo/20200607205033.png) 功能: - 不可编辑 - 分页 - 查询 - 返回主页 ### 查看购买记录 ![](https://gowi-picgo.oss-cn-shenzhen.aliyuncs.com/picgo/20200607205146.png) 功能 - 查询 - 分页 - 按时间排序 - 不可编辑

    华为OD机试(A卷+B卷+C卷+D卷)2024真题目录(全、新、准)

    2024版华为OD机试题库,包含C、D卷所有真题,粉丝可领取体验卡免费看题,包含面试手撕代码等等内容

    平台通过测量手簿批量制作外业记录表

    铁路工程管理平台通过测量手簿批量转外业记录表,生成之后通过wps js宏批量应用样式

    基于协同过滤的就业信息分析及个性化推荐微信小程序+源代码+文档说明

    - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

    基于C语言+stm32和esp8266通过点灯科技实现的智能台灯设计系统+源码+设计思维导图+PCB设计(毕业设计&课程设计)

    基于C语言+stm32和esp8266通过点灯科技实现的智能台灯设计系统+源码+设计思维导图+PCB设计,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于C语言+stm32和esp8266通过点灯科技实现的智能台灯设计系统+源码+设计思维导图+PCB设计,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于C语言+stm32和esp8266通过点灯科技实现的智能台灯设计系统+源码+设计思维导图+PCB设计,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 项目简介: 使用stm32和esp8266通过点灯科技实现的智能台灯设计。 硬件平台:STM32 + ESP8266 + BH1750 + OLED12864 + W25Q64 ; 使用STM32接收esp8266的串口数据。 ESP8266接入BLINKER平台,控制数据传输。 通过PWM控制RGB 和白光,黄光的亮度开关等数据。

    pyzmq-25.1.2-cp311-cp311-macosx_10_15_universal2.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

Global site tag (gtag.js) - Google Analytics