Как настроить Velocity Escape Tool со свойствами Spring? - PullRequest
12 голосов
/ 02 января 2012

Я создаю электронные письма из шаблонов через Velocity в веб-приложении Spring.Теперь мне нужно, чтобы HTML экранировал некоторые значения.Я нашел Velocity Escape Tool .Но у меня не работала конфигурация.

Что я пробовал, так что тариф (весна applicationContext.xml):

<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
    <property name="resourceLoaderPath" value="classpath:/velocity/emailTemplates" />
    <property name="preferFileSystemAccess" value="false" />
    <property name="overrideLogging" value="true" />
    <property name="velocityProperties">
        <util:properties>
            <prop key="input.encoding">UTF-8</prop>
            <prop key="output.encoding">UTF-8</prop>
            <prop key="tools.toolbox">application</prop>
            <prop key="tools.application.esc">org.apache.velocity.tools.generic.EscapeTool</prop>
        </util:properties>
    </property>
</bean>

Шаблон (htmlEscapeTest.vm):

with escape: $esc.html($needEscape)

TestCase:

@Test
public void testHtmlEscapingSupport() {

    final String needEscape = "<test>";

    ModelMap model = new ModelMap();
    model.addAttribute("needEscape", needEscape);
    String result = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, HTML_ESCAPING_TEMPLATE_FILE, model);
    assertThat(result, StringContains.containsString("&lt;test&gt;"));
}

Но тест не пройден, ...got: "with escape: $esc.html($needEscape)"

Кто-нибудь может подсказать, что я делаю неправильно?


Если я добавлю new EscapeTool() explicite в тесте:

VelocityContext velocityContext = new VelocityContext(model);
velocityContext.put("esc", new EscapeTool());
StringWriter writer = new StringWriter();
velocityEngine.mergeTemplate(HTML_ESCAPING_TEMPLATE_FILE, velocityContext, writer);
String result = writer.toString();

, то он работает.Но, насколько я понимаю, документация должна быть настроена один раз в файле свойств.

Я использую Velocity Engine 1.7 и Velocity Tools 2.0.

Ответы [ 5 ]

6 голосов
/ 28 ноября 2014

Вы не можете настроить Инструменты непосредственно в VelocityEngine.Вместо этого вы используете то, что при использовании VelocityEngineUtils вы передаете любые инструменты в пределах карты модели:

ModelMap model = new ModelMap();
model.put("esc", new EscapeTool());
VelocityEngineUtils.mergeTemplateIntoString(
                velocityEngine, "template.vm", "UTF-8", model)

Или, если вы используете VelocityEngine напрямую, вы можете сделать:

3 голосов
/ 03 января 2012

Предупреждение: я основываю это на несколько смутных воспоминаниях, сделанных некоторое время назад.Пробег может варьироваться.

Некоторые документы Velocity следует читать с точки зрения "как мне использовать это в VelocityView?"Если вы хотите использовать те же функции непосредственно из кода Java, то вам нужно изменить несколько деталей.В этом случае я считаю, что вы не создаете Context должным образом.Попробуйте следовать отдельному примеру здесь , убедившись, что вы «попросите [ToolManager] создать контекст для вас»:

ToolManager manager = ...
Context context = manager.createContext();

Нечто подобное, вероятно, делается под прикрытием дляВы, если вы используете VelocityView.

1 голос
/ 17 августа 2014

Вот код, который я только что получил. Я обнаружил, что стандартные инструменты устанавливаются автоматически с помощью ToolManager.

@Autowired
private VelocityEngine velocityEngine;

public void createHtml(String templateLocation, Map<String, Object> model) throws Exception {
  ToolManager toolManager = new ToolManager();
  ToolContext toolContext = toolManager.createContext();
  VelocityContext velocityContext = new VelocityContext(model, toolContext);
  StringWriter resultWriter = new StringWriter();
  velocityEngine.mergeTemplate(templateLocation, "UTF-8", velocityContext, resultWriter);
  String html = resultWriter.toString();
  // use the HTML here
}

И мой шаблон имеет это

<p>Dear $esc.html($customer.firstname)</p>
0 голосов
/ 12 октября 2016

изменить это:

<property name="velocityProperties">
    <util:properties>
        <prop key="input.encoding">UTF-8</prop>
        <prop key="output.encoding">UTF-8</prop>
        <prop key="tools.toolbox">application</prop>
        <prop key="tools.application.esc">org.apache.velocity.tools.generic.EscapeTool</prop>
    </util:properties>
</property>

на:

<property name="velocityProperties">
            <value>
                input.encoding=UTF-8
                output.encoding=UTF-8
                tools.toolbox=application
                tools.application.esc=org.apache.velocity.tools.generic.EscapeTool
            </value>
        </property>
0 голосов
/ 15 февраля 2016
  1. Добавление зависимости maven инструмента скорости в pom или добавление jar в путь класса.
  2. Добавление объекта escape-инструмента в контексте скорости.

    [context.put ("escapeTool", new EscapeTool ())]

  3. Использовать escapeTool в шаблоне.

    [$ escapeTool.xml (value_to_be_escaped)] * ​​1013 *

...