2008-04-19

Spring中配置Velocity模板

关键字: spring中配置velocity模板
首先需要配置的是Velocity引擎自己。要做到这点,可以通过以下方式在Spring配置文件中声明一个VelocityConfigurer Bean:

<bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">

<property name="resourceLoaderPath">

<value>WEB-INF/velocity/</value>

</property>

</bean>

VelocityConfigurer负责在Spring中设置Velocity引擎。这里,我们通过属性resourceLoaderPath告诉Velocity到哪里寻找它的模板。我们建议将模板放到WEB-INF的某个子目录下面,这样可以保证这些模板不能被直接访问。也可以通过velocityProperties属性来设置其他Velocity的配置细节。例如下面的VelocityConfigurer配置:

<bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">

<property name="resourceLoaderPath">

<value>WEB-INF/velocity/</value>

</property>

<property name="velocityProperties">

<props>

<prop key="directive.foreach.counter.name">loopCounter</prop>

<prop key="directive.foreach.counter.initial.value">0</prop>

</props>

</property>

</bean>

可以注意到velocityProperties属性使用一个<props>元素来设置多个属性。在这里可以设置的属性与一个典型的Velocity应用中通过“velocity.properties”文件设置的属性是一样的。缺省地,Velocity的#foreach循环维护一个名为$velocityCount的循环计数器,该计数器在第一轮循环开始时从1开始计数。但这里我们设置属性directive.foreach.counter.name为loopCounter,因此将使用$loopCounter来引用循环计数器。我们也通过设置属性directive.foreach.counter.initial.value为0使循环计数器由零开始计数。(想知道关于Velocity配置属性的信息,请参考Velocity开发者指南http://jakarta.apache.org/velocity/developer-guide.html。)
9.1.3 解析Velocity视图
要使用Velocity模板视图,你必须做的最后一件事情是配置一个视图解析器。具体地说,需要以如下方式在Spring上下文配置中声明一个VelocityViewResolver Bean:

<bean id="viewResolver" class="org.springframework.

web.servlet.view.velocity.VelocityViewResolver">

<property name="suffix"><value>.vm</value></property>

</bean>

VelocityViewResolver和Velocity的关系与InternalResourceViewResolver和JSP的关系相似。正如InternalResourceViewResolver,它使用prefix属性和suffix属性由视图的逻辑名构造出模板文件的路径。这里我们仅仅设置suffix属性为“.vm”扩展名。由于模板目录的路径已经通过VelocityConfigurer的resourceLoaderPath属性配置好了,因此这里不需要设置前缀。

注意:这里把Bean的ID设置为viewResolver。这一点很重要,因为我们并没有配置DispatcherServlet检测所有的视图解析器。如果要同时使用多个视图解析器,则你很可能需要将这个ID改成某个更合适的名字(并且是惟一的),比如velocityViewResolver。

现在,你的应用系统已经可以渲染基于Velocity模板的视图了。你只需要在返回的ModelAndView对象中通过逻辑名引用所需的视图。以ListCourseController为例,不需要做其他事情,因为它已经返回如下的ModelAndView对象:

return new ModelAndView("courseList", "courses", allCourses);

视图的逻辑名为“courseList”。当解析这个视图时,“courseList”加上后缀“.vm”构成了一个模板名“courseList.vm”。VelocityViewResolver会在WEB-INF/velocity路径下寻找这个模板。

至于“courses”模型对象,它会作为一个Velocity属性暴露给Velocity模板使用。在程序清单9.1中,它就是在#foreach指令中使用的集合对象。
评论
发表评论

您还没有登录,请登录后发表评论

yefeng
搜索本博客
最近加入圈子
存档
最新评论