《2022年Java的模板引擎Velocity初体验 .pdf》由会员分享,可在线阅读,更多相关《2022年Java的模板引擎Velocity初体验 .pdf(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、不少人看过或了解过Velocity ,名称字面翻译为:速度、速率、迅速,用在Web 开发里,用过的人可能不多,大都基本知道和在使用Struts ,到底 Velocity 和 Struts 是如何联系,怎么看待Velocity 呢?让我们来尝试一下,了解Velocity 的概念,通过在这里的介绍,强调在技术选择上的问题,让大家在选择项目开发时,可以考虑Velocity ,另外也让大家了解它的思想,毕竟它提供了一个很好的思维方式,给大家换换筋骨,换一种思考的方式。本文基于你对Java 开发有一定基础,知道MVC ,Struts 等开发模式。Velocity 是一种 Java 模版引擎技术,该项目由
2、Apache 提出,由另外一种引擎技术Webmacro引深而来。那什么是官方的Velocity 定义呢? Apache 对它的定义是:一种基于Java 的模板引擎,但允许任何人使用简单而强大的模板语言来引用定义在Java 代码中的对象。目前最新的版本是1.4,可以在http:/jakarta.apache.org/velocity/index.html查找更多信息。其实说白了 Velocity 也就是 MVC 架构的一种实现,但它更多的是关注在Model 和 View 之间,作为它们的桥梁。对于 MVC 的最流行架构Struts 来说,相信大家都不陌生, 很多开发人员已经大量在使用Struts
3、架构,包括 IBM 的 Websphere 5以上的管理平台版本, Struts 技术很好的实践了MVC , 它有效的减少Java代码在 View (Jsp)中的出现,但在Model 和 View 之间还是依靠Struts 的 Taglib 技术来实现,试想如果前台开发的网页设计师对Struts 乃至 Taglib 不熟(相信也挺难熟的,包括后期的维护人员也一样),将会对网页设计师和前台开发工程师的相互协作开发带来很大的难度,现实开发中也还是存在这样事实,网页设计师和前台开发之间的工作或多或少还是存在一定的耦合,怎样最大限度的解决这个难题呢?还是让我们来看看 Velocity 或者说这个概念吧
4、。先做一个最简单的Velocity 开发例子,让大家看看Velocity 是怎样工作的:1、创建 1 个文件,文件名为:hellovelocity.vm,即 velocity 模版(其实和html 一样),内容:Welcome $name to J! today is $date. 2、创建 1 个 java 文件, HelloVelocity.java,内容:package com.javayou.velocity; import java.io.StringWriter; import java.util.*; import org.apache.velocity.app.Velocity
5、Engine; import org.apache.velocity.Template; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 9 页 - - - - - - - - - import org.apache.velocity.VelocityContext; /* * author Liang.xf 2004-12-14 */ public class HelloVelocity public static void main(String args) thro
6、ws 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(); /
7、为后面的展示,提前输入List 数值List temp = new ArrayList(); temp.add(1); temp.add(2); context.put(list, temp); /输出流名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 9 页 - - - - - - - - - StringWriter writer = new StringWriter(); /转换输出t.merge(context, writer); System.out.printl
8、n(writer.toString(); 3、 在 http:/jakarta.apache.org/site/binindex.cgi上下载 Velocity 1.4 zip , 解压后获取velocity-1.4.jar ,用它来编译上面的类HelloVelocity.java。4、把 1 上的 hellovelocity.vm copy到运行的当前目录下,运行HelloVelocity还需要其他类包,可以从下载后的 velocity1.4.zip来, velocity-1.4buildlib,把 commons-collections.jar、logkit-1.0.1.jar引入后运行
9、java -cp .bin; -Djava.ext.dirs=.lib2 com.javayou.velocity.HelloVelocity,假设 class 编译到 .bin目录,而我们所需的类包放到.lib2 目录内,运行结构如下:Welcome Liang to J! today is Tue Dec 14 19:26:37 CST 2004. 以上是最简单的运行结果,怎么样,知道个大概吧,模版hellovelocity.vm里的 2 个定义变量 $name和$date 分别被 context.put(name, Liang)和 context.put(date, (new Date(
10、).toString()所设的值替代了。由此看来业务流程处理包括业务结果基本在model 这层全部解决, 而 view 这一层基本只用使用简单的 VTL(Velocity Template Language)来展示。这样, Jsp 岂不是不用了么?是的,这样的使用模式有点象早前的 CGI 方式:)由Velocity 自动输出代码,并且Velocity 在这方面的能力也很强,Turbine 里就采用了 Velocity 来产生很多代码。在 Velocity 中,变量的定义都是使用“$”开头的, $作为 Velocity 的标识符。字母、数字、中划和下划线都可以作为Velocity 的定义变量。此
11、外我们还需要注意的是Velocity 特色的变量定义,如:$student.No 、$student.Address,它有 2层含义:第 1 种是如果 student 是 hashtable ,则将从 hashtable中提取 key 为 No 和 Address 的值,另外第 2 种就是它有可能是调用方法,即上面2 个变量将被转换为student.getNo()和 student.getAddress()。Velocity 对在 servlet 中的 java code 返回的值有对象,还可以调用对象的方法,如$ student.getAddress()等等,在此就不一一举例和深入了。名师资
12、料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 9 页 - - - - - - - - - 上面的例子只是简单的举例,现在当然不少人已经不满足这样的例子了,实际的应用中我们还常常需要作些选择性展示和列举一些迭代数据,如List 列表,当然 Velocity (具体来说应该是VTL 模版语言)也支持这项功能,此外还支持其他一些常用的展示,如模版内部的变量(如Jsp 内的变量),还有强大一些的如创建宏以实现自动化,让我们继续接着往下看吧。我们还是使用上面的例子,把模版hellove
13、locity.vm中的内容改为:#set( $iAmVariable = good! ) Welcome $name to J! today is $date. $iAmVariable 重新执行上面的运行命令,结果:Welcome Liang to J! today is Tue Dec 14 22:44:39 CST 2004. good! 可以看得模版中的变量定义为# set 开头的语句,不是很难理解,执行后模版中的变量$iAmVariable都转换成定义的值:good! 再来看看简单的选择,把模版hellovelocity.vm中的内容改为:#set ($admin = admin)
14、#set ($user = user) #if ($admin = = $user) Welcome admin! #else Welcome user! #end 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 9 页 - - - - - - - - - 执行运行命令,结果:Welcome user! 可以看到判断语句只是简单的#if () 、#else 、#end ,不是很复杂。接着继续来看看迭代数据吧,把模版hellovelocity.vm中的内容改为:#forea
15、ch( $product in $list ) $product #end 执行运行命令,结果:1 2 把在例子中预先保存在VelocityContext的 List 中的值列举了出来,是不是很方便啊?仅仅只是用了#foreach ($variable in xx ) 而已,如果上面的List 换成 Hashtable ,则可以用下面的语法:#foreach($key in $hashVariable.keySet() ) $key ,s value: $ hashVariable.get($key) #end 一点不觉得这些脚本很复杂。还有不少人还会问,如果是javabean 怎么办?好的,
16、我们增加一个bean :package com.javayou.velocity; /* * author Liang.xf 2004-12-14 */ public class Student /注意 class 的属性是 public 的名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 9 页 - - - - - - - - - public String no = ; public String address = ; public Student(String _n
17、o, 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 ,常见的用来装载数据的类,然后我们修改HelloVelo
18、city.java,把:temp.add(1); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 9 页 - - - - - - - - - temp.add(2); 替换成:temp.add(new Student(123, Guangzhou); temp.add(new Student(456, Zhuhai); 再把 hellovelocity.vm的内容改为:#foreach ($s in $students) Address: $s.address #end
19、重新编译和执行运行命令,结果如下: Address: Guangzhou Address: Zhuhai 这样把 list 中 Student 的数据打印了出来,大功告成!这里用了 Velocity 的内建变量 $velocityCount ,指的是默认的列举序号,从1 开始,也可以改成0 开始,但需要在Velocity.properties中更改,Velocity.properties位于 velocity-1.4.jar包内的目录orgapachevelocityruntimedefaults 下。再复杂一些的迭代怎么处理呢?我们看看下面的模版例子就清楚了:#foreach ($eleme
20、nt in $list) - inner foreach - #foreach ($element in $list) This is $element. $velocityCount #end - inner foreach - - outer foreach - 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 9 页 - - - - - - - - - This is $element. $velocityCount - outer foreach - #end 看出
21、来了吧, Velocity 是支持标签嵌套的,这个可是很强大的功能,这里就不深入演示了,如果有兴趣,自己试试吧。其实,稍为深入思考刚刚我们举的例子,就已经可以看出来,Velocity 的用处在哪里?即Servlet + Velocity 的模式,另外,还记得我们早期Jsp 开发的模式Jsp+JavaBean吗?在这里,我们更改为Servlet+JavaBean+Velocity,想想,是不是已经替代了Jsp+JavaBean ,并更彻底的把Java 代码去除在Jsp (vm)外,如果光使用Struts (Servlet+Jsp ),那么带来的代价是Java 代码总或多或少出现在Jsp上,即使可
22、以做到不出现Java 代码,但做过复杂架构系统的开发者都知道,代价也是很昂贵的,并且在可维护性、和网页设计师的集成开发上存在一定的困难,所以我们在这里能感觉到,Servlet+JavaBean+Velocity的模式较好的实现了OOD 的概念。而在效率上,大家也不用担心,此种结合方式比 Servlet+Jsp的方式要高效一些。愿意了解 Velocity 的人应该不少, 但真正实用到项目的,也许不多 (还是有些项目在使用,如 Jute),毕竟和 Jsp 比起来, Jsp 更标准、更广泛使用和有不少开发工具已经支持Jsp 开发。但 Velocity 的功能不会仅仅局限在和Jsp 竞争的局面,由上可
23、看出它在自动代码输出方面功能很强,前面提到Turbine 就是采用 Velocity 来生成很多代码,你也可以稍加改动就可以做成代码生成器,或其他模版生成上,都是很不错的想法。好了,我们再来看看要深入Velocity 来做项目,还需要注意的一些常见问题吧,首先是国际化的问题,Velocity 本身支持模版的国际化编码转换,看看Velocity 提供的方法:Public Template getTemplate (Stirng template, String encoding),由此推测这样做其实不能彻底的做到国际化。最简单的在 Struts 中国际化的概念,即在Jsp 上使用国际化语言标签的
24、方式来做到,而每种语言采用不同的语言标签库的方式,引申到这里,其实手工来做一样可以做到,只不过需要稍加手工处理而已。好在已经有人处理了上面所说问题,做成了Velocity 的 tools: MessageTool,提供了变量text 包含国际化标签,这样只需要简单的编写标签代码即可,如:$text.get(,title?) ,更多具体的内容还可在http:/jakarta.apache.org/velocity/tools/struts/MessageTool.html 中了解。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名
25、师精心整理 - - - - - - - 第 8 页,共 9 页 - - - - - - - - - 好了,基于 Velocity 的介绍我们就说这么多,再说说其他引伸方面的内容吧。有人评论Velocity 不是标准的 MVC 结构,没错,刚开始我们就说过Velocity 只是 Model 和 View 之间的良好结合, 只是个好的模版引擎,毕竟还没有形成MVC 三者良好的结合。好在Apache 又基于 Struts 和 Velocity 的结合,推出了 VelocityStruts,这部分的陈述我们可以在后面的专题里再推出,这里简单介绍它的概念,它是在Struts的结构上, 在业务逻辑处理的Action 后,把业务流程转向基于Velocity 的显示层, 从而代替Jsp 作为 View层。以上我们也看到了所举的例子基本上只是基于原理和演示,没有和 Web 开发紧密结合起来,这方面内容我们在讲述VelocityStruts的内容时再来结合吧。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 9 页 - - - - - - - - -