`
pavel
  • 浏览: 916017 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

velocity入门一续

阅读更多

四、在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对象包含当前的HttpServletRequestHttpServletResponse对象。他们分别被放置在常量VelocityServlet.REQUESTVelocityServlet.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对象。默认的实现只是简单的包含requestresponseVelocityContext对象。为了避免在一些servlet容器中发生内省缓存问题,这个resquestresponse对象被一个简单的包裹器类包装了。你可以正常的使用他们,但是请注意他们并不是javax.servlet.XXX

 

void mergeTemplage(Template,Context,HttpServletResponse)

这个方法允许你产生输出流。VelocityServlet提供了一个有效的Writer类的池,所以只有在特殊的情况下才重写这个方法。

 

protected void error(HttpServletResquest,HttpServletResponse,Exception)

用于处理在处理请求过程中产生的异常。默认的实现将发送一个包含错误信息的简单HTML给用户。可以重写这个方法实现更高级的处理。

部署

当你部署基于VelocityServlet时,请确保你的属性文件被用来配置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或容器的根路径下。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics