Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用带弹簧3.0.3的速度工具_Java_Spring Mvc_Velocity_Classnotfoundexception - Fatal编程技术网

Java 使用带弹簧3.0.3的速度工具

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时:

<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;
    }
}