Java 使用带弹簧3.0.3的速度工具
当我更新bean时:Java 使用带弹簧3.0.3的速度工具,java,spring-mvc,velocity,classnotfoundexception,Java,Spring Mvc,Velocity,Classnotfoundexception,当我更新bean时: <bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"> <property name="cache" value="true"/> <property name="prefix" value=""/> <property name="suffix" value=".vm"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
<property name="cache" value="true"/>
<property name="prefix" value=""/>
<property name="suffix" value=".vm"/>
<property name="toolboxConfigLocation" value="tools.xml" />
</bean>
我已经尝试过插入工具版本2和1.4,它们都没有这个包结构。我错过了什么明显的东西吗?Spring/Velocity组件支持哪种版本的Velocity工具 默认情况下,Spring具有非常过时的Velocity支持。我从Spring扩展了
VelocityView
类,并重写了createVelocityContext
方法,在该方法中我自己初始化工具。在3.0.5中,我使用了一个与serg发布的类似的类,唯一的修改是使用spring没有使用的更新类(通过VelocityToolboxView->ServletToolboxManager(在我们已经覆盖的createVelocityContext中使用)来完成这就是不推荐使用的类,因此我在serg的答案中将initVelocityToolContext修改为:
private ToolContext getToolContext() throws IllegalStateException, IOException {
if (toolContext == null) {
XmlFactoryConfiguration factoryConfiguration = new XmlFactoryConfiguration("Default Tools");
factoryConfiguration.read(getServletContext().getResourceAsStream(getToolboxConfigLocation()));
ToolboxFactory factory = factoryConfiguration.createFactory();
factory.configure(factoryConfiguration);
toolContext = new ToolContext();
for (String scope : Scope.values()) {
toolContext.addToolbox(factory.createToolbox(scope));
}
}
return toolContext;
}
我还必须更改创建VelocityContext的行来调用这个方法
我的bean现在看起来像:
<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver"
p:cache="false"
p:prefix=""
p:suffix=".vm"
p:layoutUrl="templates/main.vm"
p:toolboxConfigLocation="/WEB-INF/velocity/velocity-toolbox.xml"
p:viewClass="path.to.overriden.class.VelocityToolsLayoutView"
/>
我使用了一种稍微简单一点的方法。由于缺乏配置文档和示例,我也无法强制Velocity工具工作。我只是得到Velocity-generic-Tools-2.0.jar,并在我的视图解析器中做了一些更改:
<bean id="velocityViewResolver"
class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
<property name="order" value="1"/>
<property name="prefix" value="/WEB-INF/vm/"/>
<property name="suffix" value=".vm"/>
<property name="exposeSpringMacroHelpers" value="true"/>
<property name="contentType" value="text/html;charset=UTF-8"/>
<property name="attributesMap">
<map>
<!--Velocity Escape Tool-->
<entry key="esc"><bean class="org.apache.velocity.tools.generic.EscapeTool"/></entry>
</map>
</property>
</bean>
然后,在velocity模板中,您可以像往常一样使用$esc.html($htmlcdavar)。此解决方案非常简单,没有大量配置和覆盖spring类。受Scott和serg答案的启发,这里有另一种不需要XML的方法:
公共类MyVelocityToolboxView扩展了VelocityView{
@凌驾
受保护的上下文createVelocityContext(映射模型,
HttpServletRequest请求,HttpServletResponse响应){
ViewToolContext=新的ViewToolContext(getVelocityEngine(),
请求、响应、getServletContext());
ToolboxFactory=新ToolboxFactory();
configure(ConfigurationUtils.getVelocityView());
for(字符串范围:scope.values()){
context.addToolbox(factory.createToolbox(scope));
}
如果(型号!=null){
对于(Map.Entry:(Set)模型
.entrySet()){
put(entry.getKey(),entry.getValue());
}
}
返回上下文;
}
}
我发现@serg的技术对我很有用。受上述所有答案的启发,这是我对spring和velocity tools 2.0的VelocityLayoutView的实现,增加了一些改进
公共类VelocityToolsView扩展了VelocityLayoutView{
私有静态最终字符串工具_MANAGER_KEY=ViewToolManager.class.getName();
@凌驾
受保护的上下文createVelocityContext(
映射模型、HttpServletRequest请求、HttpServletResponse响应){
ServletContext应用程序=getServletContext();
//使用ViewToolManager的共享实例
ViewToolManager toolManager=(ViewToolManager)应用程序.getAttribute(工具\u管理器\u键);
if(toolManager==null){
toolManager=createToolManager(getVelocityEngine(),getToolboxConfigLocation(),应用程序);
application.setAttribute(工具管理器键,工具管理器);
}
ViewToolContext toolContext=toolManager.createContext(请求、响应);
如果(model!=null){toolContext.putAll(model);}
返回工具上下文;
}
私有视图工具管理器createToolManager(VelocityEngine velocity、字符串工具文件、ServletContext应用程序){
ViewToolManager toolManager=新ViewToolManager(应用程序,false,false);
toolManager.setVelocityEngine(速度);
//通用视图工具配置(&V)
FactoryConfiguration config=ConfigurationUtils.getVelocityView();
//用户定义的工具配置
如果(工具文件!=null){
FactoryConfiguration userConfig=ConfigurationUtils.load(application.getRealPath(toolFile));
config.addConfiguration(userConfig);
}
toolManager.configure(配置);
返回工具管理器;
}
}
哦,太棒了,我还有什么要求,谢谢你的推荐,并为我澄清了一切!
<bean id="velocityViewResolver"
class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
<property name="order" value="1"/>
<property name="prefix" value="/WEB-INF/vm/"/>
<property name="suffix" value=".vm"/>
<property name="exposeSpringMacroHelpers" value="true"/>
<property name="contentType" value="text/html;charset=UTF-8"/>
<property name="attributesMap">
<map>
<!--Velocity Escape Tool-->
<entry key="esc"><bean class="org.apache.velocity.tools.generic.EscapeTool"/></entry>
</map>
</property>
</bean>
public class MyVelocityToolboxView extends VelocityView {
@Override
protected Context createVelocityContext(Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response) {
ViewToolContext context = new ViewToolContext(getVelocityEngine(),
request, response, getServletContext());
ToolboxFactory factory = new ToolboxFactory();
factory.configure(ConfigurationUtils.getVelocityView());
for (String scope : Scope.values()) {
context.addToolbox(factory.createToolbox(scope));
}
if (model != null) {
for (Map.Entry<String, Object> entry : (Set<Map.Entry<String, Object>>) model
.entrySet()) {
context.put(entry.getKey(), entry.getValue());
}
}
return context;
}
}