junctioner

Velocity之首次研究

    与Velocity的第一次见面,是03年,有个新同事推荐使用,因当时我在做别的项目,也没怎么仔细了解,简单的知晓类似如模板一类的东西。之后有过几次接触,但,都没花时间仔细看,前段时间,帮朋友做一个小东西,觉得用个模板做,会省很多事,想到Velocity。东西很小,做完了都没时间看Velocity,今天正好有时间,研究研究。
    Velocity是apache下的一个开源项目,其网址:http://velocity.apache.org/;下载地址:http://velocity.apache.org/download.cgi,可直接下载源码,也可通过SVN获取源码。
    在eclipse中创建一个web应用工程,把Velocity的源码拷到java资源目录下,自动编译后,报几个错,拷贝下载的Velocity源码lib目录下的commons-collections-3.1.jar、oro-2.0.8.jar、commons-lang-2.1.jar这个三类包到web应用工程的lib目录下即可。
    准备就绪,就写个例子跑跑试试。写一个hello.vm的模板文件,创建一个对应的Servlet,就可以运行了。两文件源码贴出如下:
    hello.vm
<html>
    
<body>
    #set($greet = "你好哇!")
        Hello!$name, $greet
    
</body>
</html>
    HelloServlet.java
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Properties;

import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.velocity.Template;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.context.Context;
import org.apache.velocity.servlet.VelocityServlet;

public class HelloServlet extends VelocityServlet {

    
protected Properties loadConfiguration(ServletConfig config)
            
throws IOException, FileNotFoundException {

        Properties p 
= new Properties();

        String path 
= config.getServletContext().getRealPath("/");

        
if (path == null) {
            path 
= "/";
        }

        p.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path);
        p.setProperty(
"runtime.log", path + "velocity.log");
        p.setProperty(Velocity.INPUT_ENCODING, 
"GBK");
        p.setProperty(Velocity.OUTPUT_ENCODING, 
"GBK");
        
return p;
    }

    
public Template handleRequest(HttpServletRequest request,
            HttpServletResponse response, Context ctx) {
        Template template 
= null;
        
try {
            ctx.put(
"name","Velocity");
            template 
= Velocity.getTemplate("/hello.vm");
        } 
catch (Exception e) {
            e.printStackTrace();
        }
        
return template;
    }
}
    创建servelt要注意的几个地方。
    1、新建的Servlet要扩展Velocity的VelocityServlet
    2、在servlet中要实现 public Template handleRequest(HttpServletRequest request,HttpServletResponse response, Context ctx)
       A)把要返回到页面上的数据放到context中对应到指定键值(键值名为对应模板中定义的变量名)
       B)引入指定模板文件
    3、导入配置文件的方法protected Properties loadConfiguration(ServletConfig config),是否实现,是可选的 ,其作用在后面说明。

发布运行后,访问http://localhost:8080/vt/HelloServelt,就可看到结果了。

运行起来,看到结果,是觉得很简单,其运行过程,就要跟踪看源码才能知道了。

    看源码,先看的,肯定是VelocityServlet.java。发现源码注释中,这个类已不推荐使用,推荐使用Velocity的一个子项目tool中的VelocityViewServlet.java,我没有当tool子项目,就先看这个“过时的”实现。
     VelocityServlet.java,扩展了HttpServlet,实现了doGet、doPost、init基本方法,前两个方法都直接调用新实现的doRequest方法,这些都是很常规的操作。
    doRequest方法做如下几件事:创建上下文、设置响应内容文件类型、获取模板(调用每个请求中的具体实现)、合并数据做出响应、出错处理及资源清理。看到这儿,整个请求和响应过程很清晰,并没什么特别的处理。
    接下来,看看它的初始化做了些什么事。就做了三件事,超类初始化、自己的初始化、缓存内容类型数据。自己的初始化,也就是(i)导入配置信息,(ii)根据配置信息做初始化设置。导入配置信息,是根据指定的几个地方,获取配置数据(在提供的样例中,重载了它的获取配置数据的方法,自己灵活的写入一些配置信息);根据配置信息做初始化的工作,应用单例设计模式,保证初始化工作的处理唯一。
    VelocityServlet自已的初始化,调用另一个类org.apache.velocity.app.Velocity的init( Properties p )方法,就看看Velocity里做了些什么。Velocity里全是静态方法。主要有如下几个方法:
    1、初始化;2、预演传入的数据(发现在应用中没有使用,只在单元测试代码中引用到);3、合并数据和模板;4、设置/获取属性;5、操作信息提示(不过,都不推荐使用了),整个的看下来,有两点:1、主要的还是初始化和数据合并了;2、这个类只是一个中转类,所有的方法,最终都是调另一个类org.apache.velocity.runtime.RuntimeSingleton的方法。
    打开RuntimeSingleton的代码,看一看,发现它同Velocity类差不多,类本身不做实际的处理操作。它与Velocity不同的是,它是申明一个静态的实例,再调用这个实例,个别地方(init())加了同步控制。如此处理体现它这个类的名字--单例,核心的还是这个静态实例org.apache.velocity.runtime.RuntimeInstance。
    到RuntimeInstance,就开始接触到Velocity的处理核心了。

    写到这儿,突然没有写下去的冲动了,暂切休息一下。
   
    抽时间看了一下Velocity子项目tool下的VelocityViewServlet的源码,比VelocityServlet要实现的好多了,与struct接合的比较好。
    Velocity,不仅仅适合于web应用,还可以作生成SQL、XML的模板,内容比较多,待一一挖掘。

posted on 2007-05-30 15:49 junctioner 阅读(2901) 评论(3)  编辑  收藏 所属分类: 技术之路

评论

# re: Velocity之首次研究 2007-05-30 21:28 yinfei.L

初次见面觉得比较简洁轻量级
用过之后才感觉到是那么的不方便...
不知道什么时候能够增加对浮点运算的支持

  回复  更多评论   

# re: Velocity之首次研究 2007-05-31 09:34 sclsch

不错  回复  更多评论   

# re: Velocity之首次研究 2007-05-31 17:29 killer->

我想Freemarker是你想要的  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2007年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

常用链接

留言簿(8)

随笔分类

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜