文档章节

MVC框架显示层——Velocity技术

飞翼
 飞翼
发布于 2016/12/09 11:26
字数 2794
阅读 20
收藏 1
点赞 0
评论 0

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

 

 

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

 

 

其实Velocity就是MVC架构的一种实现,但它更多的是关注在Model和View之间,作为它们的桥梁。对于MVC的最流行架构Struts来说,相信大家都不陌生,很多开发人员已经大量在使用Struts架构,包括IBM的Websphere 5以上的管理平台版本,Struts技术很好的实践了MVC,它有效的减少Java代码在View(Jsp)中的出现,但在Model和View之间还是依靠Struts的Taglib技术来实现,试想如果前台开发的网页设计师对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这一层基本只用使用简单的VTL(Velocity Template Language)来展示。这样,Jsp岂不是不用了么?是的,这样的使用模式有点象早前的CGI方式:)由Velocity自动输出代码,并且Velocity在这方面的能力也很强,Turbine里就采用了Velocity来产生很多代码。

 

 

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

 

 

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

 

 

l         第1种是如果student是hashtable,则将从hashtable中提取key为No和Address的值,

 

 

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>

 

 

把在例子中预先保存在VelocityContext的List中的值列举了出来,是不是很方便啊?仅仅只是用了#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

 

 

这样把list中Student的数据打印了出来,大功告成!这里用了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代码去除在Jsp(vm)外,如果光使用Struts(Servlet+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上使用国际化语言标签的方式来做到,而每种语言采用不同的语言标签库的方式,引申到这里,其实手工来做一样可以做到,只不过需要稍加手工处理而已。

 

 

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

 

 

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

 

 

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

本文转载自:

共有 人打赏支持
飞翼
粉丝 3
博文 63
码字总数 2835
作品 0
北京
程序员
SpringMVC入门demo

为什么要学习SpringMVC呢? Spring框架号称是JavaEE应用的一站式解决方案,Spring本身有提供了一个设计优良的MVC框架,SpringMVC。由于Spring框架拥有极高的市场占有率,因此越来越多的Sprin...

武小猪
06/26
0
0
SpringMvc基础知识

1.SpringMvc是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-...

王念博客
2016/03/27
78
0
Chair:支付宝前端团队推出的Node.js Web框架

Chair是支付宝前端团队推出的,基于Node.js的Web框架,适用于大部分的Web应用。 本文简要介绍Chair的设计思想、功能架构和开发状况。 一、Chair的由来和设计思想 历史上,支付宝前端项目都是...

小云栖
2016/01/15
22K
55
Struts的网友评论

Struts 是 Apache软件基金会(ASF)赞助的一个开源项目。它最初是 Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。它通过采用 Java Servlet/JSP 技术,实现了基于Java EE Web...

红薯
2009/12/11
232
5
MVC 框架--Apache Struts

Struts 是 Apache软件基金会(ASF)赞助的一个开源项目。它最初是 Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。它通过采用 Java Servlet/JSP 技术,实现了基于Java EE Web...

匿名
2008/09/07
126.9K
8
使用 Velocity 实现客户端和服务器端模板

Velocity 是一种通用的、开放源代码的模板解决方案,可以在报告生成/数据转换应用程序中独立使用,也可以在 MVC 模型框架中作为视图组件。本文中,Sing Li 介绍了 Velocity,并说明如何将其模...

红薯
2008/10/05
1K
1
用 JAX-RS 和 JSR 371 规范设计一个 MVC 框架(一)开篇

最近做几个项目都是 SSM 的,也就是 Spring MVC + MyBatis。Spring MVC 不是说不好,而是覺得整个 Spring 框架太重了,而且受框架限制遇到一些小 case 也不好处理(想着这么顺应或“突破”框...

zhangxin09
2016/06/26
0
0
OSChina 技术周刊第二十一期 —— 下一代 ECharts

每周技术抢先看,总有你想要的! 移动开发 【博客】Android ListView 复杂列表优化实践 前端开发 【翻译】100 行代码实现的 JavaScript MVC 样式框架 服务端开发/管理 【翻译】使用 React.js...

OSC编辑部
2015/02/08
3.2K
0
Spring基础知识——是什么、为什么用以及体系结构

一、Spring是什么 Spring是分层的Java SE/EE应用一站式的轻量级开源框架,以IoC(Inverse of Control:反转控制)和AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层S...

littleant2
2016/01/06
87
0
【Java模板语言】TinyTemplate 实战 :Serlvet集成

Writer :BYSocket(泥沙砖瓦浆木匠) 一、什么是TinyTemplate 什么是模板语言? 模板语言是为了使用户界面与业务数据(内容)分离而产生的,并能生成特定格式的文档。 什么是TinyTemplate?...

泥沙砖瓦浆木匠
2015/11/04
0
4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaEE——JavaScript

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 JavaScript 内置对象 String对象方法: date对象...

凯哥学堂
10分钟前
0
0
Git 远程代码回滚master

方式一(推荐): git revert commit-id 方式二(不推荐):不推荐原因:推送到线上后,其它开发人员需要重新clone git reset --hard commit-id git push origin HEAD --force...

浮躁的码农
10分钟前
0
0
Elasticesearch学习(7)—— ES查询与Java API的对应关系

1、普通查询 类型 ES查询语句 Java查询实现 结果 查询格式 { "query": { "bool": { "must": [], "must_not": [], "should": [], "filter": [] } }, "from": 0, "size": 10, "sort": [] } Que......

叶枫啦啦
10分钟前
4
0
getElementsByClassName()与getElementById()区别

1.document.getElementsByClassName() 返回的是数组 使用:document.getElementsByClassName("className")[0].innerText='具体内容' 2.document.getElementById() 返回的是单个元素 使用:d......

botkenni
21分钟前
0
0
MyBatis入门

一、安装 <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>x.x.x</version></dependency> 二、从 XML 中构建 SqlSessionFactory String r......

一个yuanbeth
22分钟前
0
0
聊聊spring cloud的LoadBalancerAutoConfiguration

序 本文主要研究一下spring cloud的LoadBalancerAutoConfiguration RibbonAutoConfiguration spring-cloud-netflix-ribbon-2.0.0.RC2-sources.jar!/org/springframework/cloud/netflix/ribb......

go4it
24分钟前
0
0
【转】使用Lombok来优雅的编码

前言 Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注解实现这一目的。 正文 添加依赖 在 pom.xml 文件中添加相关依赖:...

HAVENT
27分钟前
0
0
Dubbo 源码解读 —— 可支持序列化及自定义扩展

一、概述 从源码中,我们可以看出来。目前,Dubbo 内部提供了 5 种序列化的方式,分别为 fastjson、Hessian2、Kryo、fst 及 Java原生支持的方式 。 针对不同的序列化方式,对比内容如下: 名...

Ryan-瑞恩
34分钟前
0
0
MySQL内存设置—— MySQL server has gone away

set global max_allowed_packet=268435456

一梦心草
43分钟前
0
0
推导式

列表、集合和字典推导式 列表推导式是Python最受喜爱的特性之一。它允许用户方便的从一个集合过滤元素,形成列表,在传递参数的过程中还可以修改元素。形式如下: [expr for val in collect...

火力全開
49分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部