四、在Servlets中使用Velocity
Servlet编程
Velocity的一个主要的应用领域就是JAVA Servlet。有很多理由可以说明Velocity适合这个领域,最关键的是Velocity强制视图层(VIEW)和代码分离!
在servlet中使用velocity非常的简单。基本上你要做的就是继承VelocityServlet基类和实现handRequest()方法。
从Velocity1.1开始,有两个handRequest()方法:
public Template handRequest(Context)
这是旧的方法。这个方法要求返回一个有效的Template对象。如果无效或者为空,将会产生异常!同时error()方法会被调用!如果你希望产生异常后做一些其他的事情(比如重定向)可以重写这个方法。强烈建议您使用新的方法!
public Template handRequest(HttpServletRequest,HttpServletResponse,Context)
这是新方法。与旧的方法不同,它可以返回一个null来说明方法已经执行,并且Velocity什么都不做。
下面是一个简单的例子:
public class SampleServlet extends VelocityServlet { public Template handleRequest( HttpServletRequest request, HttpServletResponse response, Context context ) {
String p1 = "Jakarta"; String 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; } }
|
是不是觉得很面熟?除了创建context对象,这已经由VelocityServelt帮你做了,并且VelocityServlet也帮你实现了merge()方法,这和我们开始部分的编码方式基本上是一样的。我们获得context和应用程序数据,并反回一个template。
默认传递给handleRequest()方法的context对象包含当前的HttpServletRequest和HttpServletResponse对象。他们分别被放置在常量VelocityServlet.REQUEST和VelocityServlet.RESPONSE中。你可以在JAVA代码中获得并使用他们:
public Template handleRequest( Context context ) { HttpServletRequest request = (HttpServletRequest) context.get( REQUEST ); HttpServletResponse response = (HttpServletResponse) context.get( RESPONSE );
...
|
也可以在template中使用
#set($name = $req.getParameter('name') ) |
VelocityServelt允许开发者重写它的一些方法,以更好的使用它。
Properties loadConfiguration(ServletConfig)
这个方法允许重写通常的配置机制,增加或修改配置属性。
Context createContext(HttpServletRequest,HttpServletResponse)
这个方法允许你创建自己的Context对象。默认的实现只是简单的包含request和response的VelocityContext对象。为了避免在一些servlet容器中发生内省缓存问题,这个resquest和response对象被一个简单的包裹器类包装了。你可以正常的使用他们,但是请注意他们并不是javax.servlet.XXX !
void mergeTemplage(Template,Context,HttpServletResponse)
这个方法允许你产生输出流。VelocityServlet提供了一个有效的Writer类的池,所以只有在特殊的情况下才重写这个方法。
protected void error(HttpServletResquest,HttpServletResponse,Exception)
用于处理在处理请求过程中产生的异常。默认的实现将发送一个包含错误信息的简单HTML给用户。可以重写这个方法实现更高级的处理。
部署
当你部署基于Velocity的Servlet时,请确保你的属性文件被用来配置Velocity运行时刻环境。在Tomcat中,一个不错的方法就是放置你的velocity.properties文件在你的web应用的根目录下,并在web.xml文件中如下配置:
<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.foo.bar.MyServlet</servlet-class> <init-param> <param-name>properties</param-name> <param-value>/velocity.properties</param-value> </init-param> </servlet>
|
Velocity在核心运行时刻类中使用了单例模式,为了确保web应用的classloader会管理你的运行时刻实例,把velocity-xx.jar包放在WEB-INF/lib目录下是一个好主意!不要放在CLASSPATH或容器的根路径下。