如何使用Spring属性配置Velocity Escape Tool?

时间:2012-01-02 14:24:04

标签: java spring velocity

我在Spring Web Application中通过Velocity从模板创建电子邮件。现在我需要HTML转义一些值。我找到了Velocity Escape Tool。但我没有让配置工作。

我尝试过的是这样的票价(spring 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)

测试用例:

@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 个答案:

答案 0 :(得分:6)

您无法直接在VelocityEngine中配置工具。你做的是,当你使用VelocityEngineUtils传递模型图中的任何工具时:

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

或者,如果你直接使用VelocityEngine,你可以这样做:

VelocityContext velocityContext = new VelocityContext(model);
velocityEngine.mergeTemplate(templateLocation, encoding, velocityContext, writer);

答案 1 :(得分:3)

警告:我基于前一段时间的模糊记忆。里程可能会有所不同。

应该从“我如何在VelocityView中使用它?”的角度阅读一些Velocity文档。如果要直接从java代码中使用相同的功能,则需要更改一些细节。在这种情况下,我认为您没有正确创建Context。尝试关注the standalone example here,确保“请[ToolManager]为您创建一个上下文”:

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

如果您使用VelocityView,可能会在您的封面下完成类似的事情。

答案 2 :(得分:1)

这是我刚刚开始工作的一些代码。我发现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>

答案 3 :(得分:0)

  1. 在pom中添加速度工具maven依赖项或在类路径中添加jar。
  2. 在力度上下文中添加转义工具对象。

    [context.put(&#34; escapeTool&#34;,新的EscapeTool())]

  3. 在模板中使用escapeTool。

    [$ escapeTool.xml(value_to_be_escaped)]

答案 4 :(得分:0)

改变这个:

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