5

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>

Velocity Tools の tools.xml パスを使用すると、次のようになります。

Caused by: 
java.lang.ClassNotFoundException: org.apache.velocity.tools.view.ToolboxManager

ツールのバージョン 2 と 1.4 をプラグインしようとしましたが、どちらもこのパッケージ構造ではありません。明らかな何かを見逃しましたか?Spring/Velocity コンポーネントがサポートしている Velocity Tools のバージョンは何ですか?

4

6 に答える 6

10

私はもう少し単純な方法を使用します。また、構成ドキュメントと例が不足しているため、Velocity Tools を強制的に動作させることもできません。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>

次に、速度テンプレートで、通常どおり $esc.html($htmlCodeVar) を使用できます。このソリューションは非常にシンプルで、大量の構成やスプリング クラスのオーバーライドがありません。

于 2012-04-20T06:45:16.153 に答える
5

Spring は、デフォルトで非常に時代遅れの Velocity サポートを備えています。VelocityViewSpring からクラスを拡張し、createVelocityContextツールを自分で初期化するメソッドをオーバーライドします。これが最後にどのように見えるかです。

于 2010-11-02T03:00:24.250 に答える
1

Scott と serg からの回答に触発されて、XML を必要としない別の方法があります: http://squirrel.pl/blog/2012/07/13/spring-velocity-tools-no-xml/

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;
    }
}
于 2012-07-13T09:06:24.817 に答える
1

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"
/>
于 2011-02-17T14:10:53.997 に答える
0

@serg の手法のこのバリエーションがうまく機能することがわかりました。

于 2013-01-16T19:22:18.763 に答える