Velocity学习小结

velocity在spring项目中的使用

本文,不是讲velocityResolver来渲染页面的只从最原始的使用方式如何使用。
首先,可以交给Spring来初始化velocityEngine:

<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
    <property name="configLocation">
        <value>classpath:velocity.properties</value>
    </property>
    <property name="resourceLoaderPath">
        <value>/WEB-INF/velocity/</value>
    </property>
</bean>

其中的configLocation指明了velocity的配置文件路径。也就是说一些个性化的配置都可以直接在velocity.properties进行操作了。比如下面的例子:

resource.loader  =  file

file.resource.loader.description =  Velocity  File Resource Loader
file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
file.resource.loader.cache =  true
file.resource.loader.modificationCheckInterval =  100

input.encoding = utf-8
output.encoding = utf-8

需要注意的是,resource.loader可能有多种选择,最常用的是file,class.当然也有webapp,jar等类型。file要求指明具体的路径,而在WEB应用里这块常常就会出现问题。因此,我们倾向于认为从classpath来加载模板。但是,为什么此处仍然推荐使用file而不是class呢。那是因为:

  • spring增强了file加载的能力,推荐使用resourceLoaderPath来指明路径,而不是交给file.resource.loader.path进行处理。如果使用这个可能会跑NullPointerException;
  • class加载存在弊端,在生产环境classpath里的内容一旦加载就被缓存起来了,这导致velocity模板加载的cache机制失效。

关于Velocity使用的坑

  • 关于减号(-)的问题

    请注意下面的2中写法
    #set($maxIndex=$DOC_COUNT-1)报错
    #set($maxIndex=$DOC_COUNT - 1)正确,区别仅在于-两侧的空格

  • 关于Range类型的问题

    #set($array = [0..$maxIndex]) 这个里面$maxIndex应该只是一个变量,不能是一个表达式。比如这样#set($array = [0..$maxIndex+1])也是错误的。

您的支持是我原创的动力!