velocity的开发指南 (四)

2014-11-24 11:27:38 · 作者: · 浏览: 49
ring p2 = "Velocity";

Vector vec = new Vector();
vec.addElement( p1 );
vec.addElement( p2 );

context.put("list", vec );

Template template = null;

try
{
template = getTemplate("sample.vm");
}
catch( ResourceNotFoundException rnfe )
{
// couldn't find the template
}
catch( ParseErrorException pee )
{
// syntax error : problem parsing the template
}
catch( Exception e )
{}

return template;
}
}

看起来好熟悉吧 除过处理一些异常,基本的功能Velocity都己为你准备好了, 就连在应用程序中要你写的merge() 这一步,VelocityServlet自己也己处理,这就是基本的用法:取得context, 加入我们自己的对象最后返回模板 template.
默认的 Context是作为 handleRequest() 传入的. 可以使用以下常量直接访问 request和response对象,VelocityServlet.REQUEST (value = 'req') and VelocityServlet.RESPONSE (value = 'res') ,如下是java例程 :
public Template handleRequest( Context context )
{
HttpServletRequest request = (HttpServletRequest) context.get( REQUEST );
HttpServletResponse response = (HttpServletResponse) context.get( RESPONSE );

...
}
可以在模板中如下访问:
#set($name = $req.getParameter('name') )

一些更高级的用法,如VelocityServlet base class 可以在处理请求时重写更多的签名方法 : Properties loadConfiguration( ServletConfig )
这可以重写常规的配置方法. 这常用在修改日志路径或运行时改写webapp root的绝对路径.

Context createContext(HttpServletRequest, HttpServletResponse )
你可以创建自己的Context object. 这可以使用更高级的技术, 如数据链或预载数据和工具类. 默认的实理仅返回一个己内置request and response 对象的VelocityContext.你直以在模板中直接访问他们的命令。

void setContentType( HttpServletRequest,HttpServletResponse )
你可以自己定义contentType, 或提取client定义的. 默认的contentType类型在velocity.properties文件中配置, 一般来说,默认的"text/html" 类型是不够详细的.

void mergeTemplate( Template, Context, HttpServletResponse )
你可以生成输出流(output stream). VelocityServlet使用含有多种输出对象的池, 在特定情形下,重写这个命令是有用的.

void requestCleanup( HttpServletRequest, HttpServletResponse , Context )
这个调用一般在处理完后做资源的清理工作,如有需要,在这个命令的重写内容中加上你的代码.

protected void error( HttpServletRequest, HttpServletResponse, Exception )
在处理中,当错误发生时,这个方法会被调用. 默认的实现是将发送一个简单的HTML格式的错误内容到客户端. 你可以重写以定制错误处理.
更多的信息,请参考 API documentation.


2.Deployment
发布基于Velocity的servlets 时,需要参数来配置 Velocity runtime. 在Tomcat上, 一个简单的方法是将velocity.properties文件放到你的webApp root目录下 (webapps/appname ) 然后在 WEB-INF/web.xml 文件中加上以下几行 :

MyServlet
com.foo.bar.MyServlet

properties
/velocity.properties



以上配置将确保MyServlet 可以被载入,Velocity也将会使velocity.properties来初始化.
注意: Velocity 在运行时使用的是单实例模式, 因此将 velocity-XX.jar放到YourWebAPP/WEB-INF/lib目录即可. 但当多个webApp要使用时,放入CLASSPATH 或Servlet容器的顶层 lib是最好的选择.
7. Using Velocity In General Applications
Velocity被设计为一个通用的功具包,它也常用于一般的应用程序中. 如这篇指南开始所讨论的那样, 另外,这里还有一些对一般应用程序来说很有用的工具类:
1.The Velocity Helper Class
Velocity 提供一个 utility class ( org.apache.velocity.app.Velocity ). 这个类中提共一个初始化Velocity所必需的方法, 具体的细节可以到文档中查看.
Velocity runtime engine在运行时是单实便模式,它可以给 Velocity的用户通过同一个jvm提供日志,资源访问方法. 这个engine运行时仅初始化一次. 当然,你可以尝初对init()进行多次调用, 但只有第一次有效. The Velocity utility class 目前提供5个命令来配置运行时engine:
这5个配置方法是 :
setProperty( String key, Object o ) 这么简单,不用解释了吧.
Object getProperty( String key ) 嗯,也不说了
init() 用默认的参数文件初始化
init( Properties p ) 用一个特定的java.util.Properties对象初始化.
init( String filename ) 用指定名字的参数文件初始化
注意:除非你指定了,否则初始时会使用默认参数. 仅当在调用init()时的配置会对系统生