我可能会尝试做一些与众不同的事情。我有一个spring web应用程序,我手动渲染一个速度模板,意思是调用
template.merge(context, stringWriter)
以下是我从应用程序中获取模板的方法:
InputStream inputStream = servletContext.getResourceAsStream("/WEB-INF/vml/" + templateName);
String templateString = StreamUtils.inputStreamToString(inputStream);
RuntimeServices runtimeServices = RuntimeSingleton.getRuntimeServices();
StringReader reader = new StringReader(templateString);
SimpleNode node = runtimeServices.parse(reader, templateName);
Template template = new Template();
template.setRuntimeServices(runtimeServices);
template.setData(node);
template.initDocument();
我相信我必须以这种方式加载模板,因为我没有使用Spring的VelocityViewResolver
来渲染模板作为请求的一部分(这是Jboss中后台任务的一部分)。但是现在我当然无法在这个模板中包含模板,因为Velocity不知道从哪里获取模板,我没有设置TEMPLATE_ROOT
,我也没有使用Velocity ClasspathResourceLoader。
所以我的问题是,我有什么选择?基本目标是能够手动呈现这些模板,并能够在一个Spring Web应用程序中包含一个模板。
我尝试过使用ClasspathResourceLoader
static {
velocityEngine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
velocityEngine.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
velocityEngine.init();
}
我在WEB-INF/vml/hello.vml
下放了一个小的hello world模板。当我尝试在vml之前使用和不使用前导斜杠调用velocityEngine.getTemplate("/vml/hello.vml");
时,我得到org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource '/vml/hello.vml'
。我被困在这里,因为这耗尽了我所知道的两种获取模板的方法。
答案 0 :(得分:1)
关注ClasspathResourceLoader的javadoc 尝试将模板放入WEB-INF / lib目录。出于测试目的,尽量不要创建像vml这样的子目录,这样当一些东西仍然无法工作时你就不会感到困惑。
答案 1 :(得分:1)
速度配置不是Spring中最好的文档部分。而且它已经过时了:即使在4.0.5中,参考文档也声明了对速度1.x(精细)和速度工具(1.x)的依赖性,这在最近的速度版本中已被弃用。然而,一旦配置了速度1.7和速度工具2.0
,一切正常允许在WEB-INF下找到模板的速度是WebappResourceLoader
速度工具。一旦您的VelocityEngine
被声明用于加载模板,一切都会正常工作,包括在其他模板中包含模板。
所以你可以继续进行配置速度方式。您准备了速度属性,包括:
resource.loader=webapp
webapp.resource.loader.class=org.apache.velocity.tools.view.WebappResourceLoader
webapp.resource.loader.path=/WEB-INF/vml
并初始化并正常使用VelocityEngine
但您也可以使用Spring VelocityConfigurer
,如果您以后想在应用程序中使用力度视图(*),这可能很有用。以下是工作应用程序上下文的摘录:
<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
<property name="resourceLoaderPath" value="/WEB-INF/velocity/"/>
<property name="velocityProperties">
<props>
<prop key="input.encoding">UTF-8</prop>
<prop key="output.encoding">UTF-8</prop>
<prop key="velocimacro.library">VM_global_library.vm</prop>
<prop key="resource.loader">webapp</prop>
<prop key="webapp.resource.loader.class">org.apache.velocity.tools.view.WebappResourceLoader</prop>
<prop key="webapp.resource.loader.path">/WEB-INF/vlm</prop>
<prop key="evaluate.provide.scope.control">true</prop>
</props>
</property>
</bean>
<bean id="velocityEngine" factory-bean="velocityConfig" factory-method="getVelocityEngine"/>
你得到一个完全配置的VelocityEngine
,可以在你需要的任何bean中注入Spring(我认为property name="resourceLoaderPath"
是旧版本的scory,但是因为它起作用我没有& #39;不敢删除它,VM_global_library.vm
是webapp.resource.loader.path
下我自己的速度宏库,可从我的所有模板访问。我目前使用此配置来生成邮件正文。
不,您使用速度引擎(直接配置或通过VelocityConfigurer
配置),您可以使用它来加载和合并模板:
Template template = velocityEngine.getTemplate("/hello.vml");
Context context = new VelocityContext();
context.put(..., ...);
...
template.merge(context, writer);
(*)VelocityLayoutViewResolver
在该环境中正常工作,但为了能够使用2.0速度工具箱,我必须修改默认的Spring VelocityLayoutView
并在解析器中声明我的子类:
在dispatcher-servlet中:
<bean class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver"
id="vmViewResolver" p:order="10" p:suffix=".vm" p:prefix=""
p:cache="true" p:contentType="text/html;charset=UTF-8"
p:exposeRequestAttributes="false" p:exposeSessionAttributes="false"
p:exposePathVariables="true" p:exposeSpringMacroHelpers="true"
p:dateToolAttribute="date" p:toolboxConfigLocation="/WEB-INF/toolbox.xml"
p:viewClass="i2.application.commun.web.views.Velocity2LayoutView">
...
和我的Velocity2LayoutView
public class Velocity2LayoutView extends VelocityLayoutView {
ViewToolManager toolManager;
@Override
protected Context createVelocityContext(Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response) throws Exception {
ViewToolContext context = toolManager.createContext(request, response);
context.putAll(model);
return context;
}
@Override
protected void initTool(Object tool, Context velocityContext) throws Exception {
//super.initTool(tool, velocityContext);
}
@Override
public void afterPropertiesSet() throws Exception {
toolManager = new ViewToolManager(getServletContext(), false, false);
if (getToolboxConfigLocation() != null) {
String path = getToolboxConfigLocation();
logger.debug("Init ViewToolManager with " + path);
XmlFactoryConfiguration config = new XmlFactoryConfiguration();
config.read(getServletContext().getResourceAsStream(getToolboxConfigLocation()));
toolManager.configure(config);
}
toolManager.setVelocityEngine(getVelocityEngine());
}
}