2012-01-02 25 views
12

Tôi tạo e-mail từ các mẫu qua Velocity trong một ứng dụng web mùa xuân. Bây giờ tôi cần phải thoát HTML MỘT SỐ giá trị. Tôi tìm thấy Velocity Escape Tool. Nhưng tôi đã không nhận được cấu hình làm việc.Làm thế nào để cấu hình Velocity Escape Tool với Spring Properties?

Những gì tôi đã tryed nên giá vé là (mùa xuân 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> 

Template (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;")); 
} 

Nhưng Thử nghiệm không thành công, ...got: "with escape: $esc.html($needEscape)"

Ai có thể cho tôi một gợi ý những gì tôi đang làm sai?


Nếu tôi thêm new EscapeTool() explicite trong các thử nghiệm:

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(); 

sau đó nó đang làm việc. Nhưng theo như tôi hiểu tài liệu, các công cụ sẽ được cấu hình một lần trong tệp thuộc tính.

Tôi đang sử dụng Velocity Engine 1.7 và Velocity Tools 2.0.

+1

Nói chung nó được kinh nghiệm của tôi rằng khi bạn muốn gọi vận tốc trực tiếp, sau đó bạn phải thiết lập ngữ cảnh theo cách thủ công. Bạn có cung cấp liên kết đến tài liệu được đề cập không? – jtoberon

+0

@jtoberon: http://velocity.apache.org/tools/devel/config.properties.html và http://velocity.apache.org/tools/devel/config.html – Ralph

+0

Bạn đang sử dụng phiên bản Velocity nào? Liên kết Escape Tools ban đầu của bạn là 1.4 và các liên kết này là 2.0. – jtoberon

Trả lời

3

Cảnh báo: Tôi đang dựa trên những kỷ niệm hơi mơ hồ này một thời gian trước đây. Mileage có thể thay đổi.

Một số tài liệu Velocity nên được đọc từ quan điểm của "làm thế nào để tôi sử dụng điều này trong một VelocityView?" Nếu bạn muốn sử dụng các tính năng tương tự trực tiếp từ mã java, thì bạn cần phải thay đổi một vài chi tiết. Trong trường hợp này, tôi tin rằng bạn không tạo ra Context đúng cách. Cố gắng làm theo the standalone example here, đảm bảo rằng bạn "yêu cầu [các ToolManager] để tạo ra một bối cảnh cho bạn":

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

Something tương tự có thể được thực hiện dưới tấm chăn cho bạn nếu bạn sử dụng VelocityView.

+0

Cảm ơn, tôi sẽ thử nó. – Ralph

+0

@jtoberon Tôi đã gặp phải sự cố tương tự. Sự hiểu biết của tôi là «VelocityEngineFactoryBean' xử lý một số điều này, nhưng tôi không rõ ràng về số lượng. – Dan

+0

Hmm có ý nghĩa đặc biệt đối với mùa xuân, và anh ấy nói anh ấy đang sử dụng Spring. Và ví dụ của anh ta không hiệu quả. Việc tìm ra điều này có thể yêu cầu bước qua thử nghiệm thất bại trong trình gỡ rối để kiểm tra chính xác những gì trong ngữ cảnh khi 'VelocityEngineUtils' chạy. – jtoberon

1

Đây là một số mã mà tôi vừa làm việc. Tôi thấy các công cụ chuẩn được thiết lập tự động bởi 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 
} 

Và mẫu của tôi có này

<p>Dear $esc.html($customer.firstname)</p> 
5

Bạn không thể cấu hình các công cụ trực tiếp trong VelocityEngine. Những gì bạn làm thay vào đó, là khi bạn sử dụng VelocityEngineUtils mà bạn vượt qua bất kỳ Công cụ trong bản đồ mô hình:

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

Hoặc nếu bạn sử dụng VelocityEngine trực tiếp bạn có thể làm:

VelocityContext velocityContext = new VelocityContext(model); 
velocityEngine.mergeTemplate(templateLocation, encoding, velocityContext, writer); 
0
  1. Add công cụ vận tốc maven phụ thuộc vào pom hoặc thêm jar vào đường dẫn lớp.
  2. Thêm đối tượng công cụ thoát trong ngữ cảnh tốc độ.

    [context.put ("escapeTool", mới EscapeTool())]

  3. Sử dụng escapeTool trong mẫu.

    [$ escapeTool.xml (value_to_be_escaped)]

0

thay đổi này:

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

tới:

<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> 
Các vấn đề liên quan