速度模板中的更改以反映服务器重新启动

时间:2014-10-10 11:45:20

标签: java spring tomcat velocity

有没有办法让vm文件中的更改自动反映,而无需每次都重新启动服务器。我现在处于开发阶段,我还有很多工作要做。我是速度模板的新手,因此如果有人可以提出相同的方法,它将非常有用。我尝试使用以下属性,但它不起作用。我正在使用tomcat服务器。

<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
 <property name="velocityProperties">
        <value> 
            resource.loader=class            
           class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
            velocimacro.library.autoreload=true
            class.resource.loader.cache=false
            velocimacro.permissions.allow.inline.to.replace.global=true
        </value>
    </property>
</bean>

2 个答案:

答案 0 :(得分:1)

如果我的理解是正确的,那么您正尝试在服务器上热部署速度模板(vm扩展名)。 如果我们在documentation引用,您应该选择&#34;文件&#34;导向属性。

<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
 <property name="velocityProperties">
        <value> 
            resource.loader=file            
            file.resource.loader.class=org.apache.velocity.runtime.resource.loader.FileResourceLoader
            velocimacro.library.autoreload=true
            file.resource.loader.cache=true
            file.resource.loader.path=/WEB-INF/views
            velocimacro.permissions.allow.inline.to.replace.global=true
            file.resource.loader.modificationCheckInterval=2
        </value>
    </property>
</bean>

确保您的观看路径正确(file.resource.loader.path)。我添加了file.resource.loader.modificationCheckInterval,因为在缓存模板时,您应该给出两次检查之间的秒数。

答案 1 :(得分:0)

你可以通过覆盖Velocity的FileResourceLoader类来完成你的FileResourceLoader,这个类将在速度配置中连接WEB_APP_ROOT路径和路径项:

public class WebAppFileResourceLoader extends FileResourceLoader {
private Logger log= LoggerFactory.getLogger(WebAppFileResourceLoader.class);

@Override
public void init(ExtendedProperties configuration) {
    String webAppRootPath= (String) this.rsvc.getApplicationAttribute(WEB_APP_ROOT);
    if (webAppRootPath!=null) {
        Vector<String> pathsVector = configuration.getVector("path");
        Vector<String> tempVector = new Vector<String>(pathsVector.size());
        for (String path : pathsVector) {
            log.debug("path:{}", path);
            tempVector.add(webAppRootPath + File.separator + path);
        }
        configuration.clearProperty("path");
        for (String path : tempVector) {
            configuration.addProperty("path", path);
        }
    }
    super.init(configuration);
}

如何获取WEB_APP_ROOT变量,我们可以在速度引擎初始化时设置它:

public class SpringVelocityEngineFactoryBean extends VelocityEngineFactory
    implements FactoryBean<VelocityEngine>, InitializingBean, ResourceLoaderAware,ServletContextAware {

private VelocityEngine velocityEngine;
private ServletContext servletContext;
private Logger log= LoggerFactory.getLogger(SpringVelocityEngineFactoryBean.class);

@Override
protected VelocityEngine newVelocityEngine() throws IOException, VelocityException {
//inject servletContext to velocity runtime's applicationAttribute
    VelocityEngine velocityEngine= new VelocityEngine();
velocityEngine.setApplicationAttribute(ServletContext.class.getName(), this.servletContext);
    log.debug("webappRoot:{}",this.servletContext.getRealPath(""));
    velocityEngine.setApplicationAttribute(WEB_APP_ROOT,this.servletContext.getRealPath(""));
return velocityEngine;
}
....