Using Velocity's WebappResourceLoader with Spring

五迷三道 提交于 2019-12-05 19:47:46

You need to pass ServletContext object:

velocityEngine.setApplicationAttribute("javax.servlet.ServletContext", request.getSession().getServletContext());

Another option would be using ClasspathResourceLoader instead and putting your templates within classpath.

If you look at the documentation for VelocityEngineFactoryBean, you'll notice that there's a 'resourceLoaderPath' property that you can set. Given your configuration above, it looks like you've placed your Velocity templates under /WEB-INF/velocity/, so use that as the value for 'resourceLoaderPath' and the factory bean should load your templates just fine.

Three years later, but here's another solution that does not require to adapt your Java code to pass the ServletContext to Velocity Engine.

Simply use VelocityConfigurer instead of VelocityEngineFactoryBean in your Spring Context file like this:

<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
    <property name="velocityPropertiesMap">
        <map>
            <entry key="runtime.log.invalid.reference"><value>true</value></entry>
            <entry key="runtime.log.logsystem.class"><value>org.apache.velocity.runtime.log.Log4JLogChute</value></entry>
            <entry key="runtime.log.logsystem.log4j.logger"><value>velocity</value></entry>
            <entry key="input.encoding"><value>UTF-8</value></entry>
            <entry key="output.encoding"><value>UTF-8</value></entry>
            <entry key="directive.include.output.errormsg.start"><value></value></entry>
            <entry key="directive.parse.max.depth"><value>10</value></entry>
            <entry key="directive.set.null.allowed"><value>true</value></entry>
            <entry key="velocimacro.library.autoreload"><value>true</value></entry>
            <entry key="velocimacro.permissions.allow.inline"><value>true</value></entry>
            <entry key="velocimacro.permissions.allow.inline.to.replace.global"><value>false</value></entry>
            <entry key="velocimacro.permissions.allow.inline.local.scope"><value>false</value></entry>
            <entry key="velocimacro.context.localscope"><value>false</value></entry>
            <entry key="runtime.interpolate.string.literals"><value>true</value></entry>
            <entry key="resource.manager.class"><value>org.apache.velocity.runtime.resource.ResourceManagerImpl</value></entry>
            <entry key="resource.manager.cache.class"><value>org.apache.velocity.runtime.resource.ResourceCacheImpl</value></entry>
            <entry key="resource.loader"><value>webapp, class, ds</value></entry>
            <entry key="class.resource.loader.description"><value>Velocity Classpath Resource Loader</value></entry>
            <entry key="class.resource.loader.class"><value>org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader</value></entry>
            <entry key="webapp.resource.loader.class"><value>org.apache.velocity.tools.view.WebappResourceLoader</value></entry>
            <entry key="webapp.resource.loader.path"><value>/WEB-INF/views/</value></entry>
            <entry key="webapp.resource.loader.cache"><value>false</value></entry>
            <entry key="webapp.resource.loader.modificationCheckInterval"><value>2</value></entry>
            <entry key="ds.resource.loader.instance"><ref bean="templateLoader"/></entry>
            <entry key="ds.resource.loader.resource.table"><value>templates</value></entry>
            <entry key="ds.resource.loader.resource.keycolumn"><value>code</value></entry>
            <entry key="ds.resource.loader.resource.templatecolumn"><value>content</value></entry>
            <entry key="ds.resource.loader.resource.timestampcolumn"><value>updated</value></entry>
            <entry key="ds.resource.loader.cache"><value>false</value></entry>
        </map>
    </property>
</bean>

<bean id="templateLoader" 
    class="org.apache.velocity.runtime.resource.loader.DataSourceResourceLoader">
    <property name="dataSource" ref="yourDataSource"></property>
</bean>
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!