MVC框架显示层——Velocity技术

Posted 冷月枯枝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MVC框架显示层——Velocity技术相关的知识,希望对你有一定的参考价值。

官网:http://velocity.apache.org

Velocity是一个基于Java的模板引擎。它允许任何人使用简单而强大的模板语言来引用Java代码中定义的对象。

当Velocity用于Web开发时,Web设计人员可以与Java程序员并行工作,以根据模型 - 视图 - 控制器(MVC)模型开发Web站点,这意味着网页设计人员可以专注于创建一个看起来很好的站点,程序员可以专注于编写一流的代码。Velocity将Java代码与网页分开,使网站在其生命周期内更加可维护,并为Java Server Pages(JSP)或php提供了可行的替代方案。

Velocity的功能远远超出了网络的范围; 例如,它可以用于从模板生成SQL,PostScript和XML。它可以用作生成源代码和报告的独立实用程序,也可以用作其他系统的集成组件。例如,Velocity为各种Web框架提供模板服务,使他们能够根据真正的MVC模型,使视图引擎促进Web应用程序的开发。


下面是一个简单的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 


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层含义:

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

另外第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的方式要高效一些。


以上是关于MVC框架显示层——Velocity技术的主要内容,如果未能解决你的问题,请参考以下文章

springMvc集成Velocity

mvc框架

spring mvc 如何配置最简洁的

Android MVC框架模式

ssm(spring,spring mvc,mybatis)框架

Struts MVC 框架 (让你一步步成为高手)