Использование скоростных инструментов с пружиной 3.0.3
-
28-09-2019 - |
Вопрос
Когда я обновляю боб:
<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 Путь для инструментов скорости, я получаю:
Caused by:
java.lang.ClassNotFoundException: org.apache.velocity.tools.view.ToolboxManager
Я попробовал подключить инструменты версии 2 и 1.4, не имею эту структуру пакета. Я пропустил что-то очевидное? Какую версию инструментов скоростей является поддерживающий компонент пружины / скорости?
Решение
Весна имеет очень устаревшую поддержку скорости по умолчанию. Я продлив VelocityView
класс с весны и переопределения createVelocityContext
Метод, где я инициализирую инструменты сам. Здесь Как это выглядит на конец.
Другие советы
Я использую немного проще проще. Я также не могу заставить инструменты скорости работать из-за отсутствия документации по настройке и примерам. Я просто получаю Velocity-Generic-Tools-2.0.jar и внести небольшую изменение в моем виду Resolver:
<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). Это решение очень просты, без тонн конфигов и переопределения весенних классов.
С 3.0.5 я использовал аналогичный класс к тому, что Серг опубликовал, с единственной модификацией использовать обновленные классы, которые пружина не использовала (хвост через VelocityToolboxView -> ServlettoolboxManager (используется в CreatevelocityContext, мы переопределили), это класс, который устарели, поэтому я изменил INITVELOCITYTOLCONTEXT в ответе Серг, чтобы быть:
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 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"
/>
Вдохновленный ответами от Скотта и Серг, вот еще один способ сделать это, что не требует 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;
}
}
Вдохновлен всеми ответами выше, это моя реализация 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;
}
}
я нашел это Это вариация На технике @ Серг сработал для меня.