Использование Velocity Tools с Spring 3.0.3 - PullRequest
5 голосов
/ 02 ноября 2010

Когда я обновляю 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>

С помощью пути tools.xml для Velocity Tools я получаю:

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

Я попытался подключить инструменты версии 2 и1.4, ни один не имеет этой структуры пакета.Я что-то упустил очевидное?Какую версию Velocity Tools поддерживает компонент Spring / Velocity?

Ответы [ 6 ]

10 голосов
/ 20 апреля 2012

Я использую немного более простой способ.Я также не могу заставить работать Velocity Tools из-за отсутствия документации и примеров конфигурации.Я просто получаю speed-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).Это решение очень простое, без тонны конфигов и основных классов пружин.

5 голосов
/ 02 ноября 2010

Spring имеет очень устаревшую поддержку Velocity по умолчанию. Я расширяю класс VelocityView из Spring и переопределяю метод createVelocityContext, где я сам инициализирую Tools. Здесь - как это выглядит в конце.

1 голос
/ 18 марта 2014

Вдохновленный всеми ответами выше, это моя реализация VelocityLayoutView для пружин и скоростных инструментов 2.0, добавлено некоторое улучшение!

public class VelocityToolsView extends VelocityLayoutView {

    private static final String TOOL_MANAGER_KEY = ViewToolManager.class.getName();

    @Override
    protected Context createVelocityContext(
            Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) {
        ServletContext application = getServletContext();

        // use a shared instance of ViewToolManager
        ViewToolManager toolManager = (ViewToolManager)application.getAttribute(TOOL_MANAGER_KEY);
        if(toolManager == null) {
            toolManager = createToolManager(getVelocityEngine(), getToolboxConfigLocation(), application);
            application.setAttribute(TOOL_MANAGER_KEY, toolManager);
        }

        ViewToolContext toolContext = toolManager.createContext(request, response);
        if(model != null) { toolContext.putAll(model); }

        return toolContext;
    }

    private ViewToolManager createToolManager(VelocityEngine velocity, String toolFile, ServletContext application) {
        ViewToolManager toolManager = new ViewToolManager(application, false, false);
        toolManager.setVelocityEngine(velocity);

        // generic & view tools config
        FactoryConfiguration config = ConfigurationUtils.getVelocityView();
        // user defined tools config
        if(toolFile != null) {
            FactoryConfiguration userConfig = ConfigurationUtils.load(application.getRealPath(toolFile));
            config.addConfiguration(userConfig);
        }
        toolManager.configure(config);

        return toolManager;
    }
}
1 голос
/ 13 июля 2012

Вдохновленный ответами Скотта и Серга, вот еще один способ сделать это, не требующий 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;
    }
}
1 голос
/ 17 февраля 2011

В версии 3.0.5 я использовал класс, аналогичный тому, который опубликовал serg, с единственной модификацией - использовать обновленные классы, которые Spring не использовал (хвост через VelocityToolboxView -> ServletToolboxManager (используется в перезаписанном нами createVelocityContext)класс, который устарел, поэтому я изменил 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, чтобы явно вызывать этот метод.

MyБоб теперь выглядит так:

<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"
/>
0 голосов
/ 16 января 2013

Я обнаружил, что это изменение в методике @ serg работает для меня.

...