2012-01-02 4 views
12

मैं स्प्रिंग वेब एप्लिकेशन में वेग के माध्यम से टेम्पलेट्स से ई-मेल बना देता हूं। अब मुझे कुछ मूल्यों से एचटीएमएल से बचने की जरूरत है। मुझे वेग Escape Tool मिला। लेकिन मुझे कॉन्फ़िगरेशन काम नहीं मिला।स्प्रिंग प्रॉपर्टीज के साथ वेग एस्केप टूल को कॉन्फ़िगर कैसे करें?

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

लेकिन

मैं क्या tryed है तो किराया (वसंत applicationContext.xml) है परीक्षण विफल रहा, ...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(); 

तो यह काम कर रहा है। लेकिन जहां तक ​​मैं प्रलेखन को समझता हूं, उपकरण गुण फ़ाइल में एक बार कॉन्फ़िगर किया जाना चाहिए।

मैं वेग इंजन 1.7 और वेग उपकरण 2.0 का उपयोग कर रहा हूं।

+1

आम तौर पर यह मेरे अनुभव हो गया है कि आप वेग आह्वान करने के लिए चाहते हैं जब सीधे, तो आपको मैन्युअल रूप से संदर्भ सेट अप करना होगा। क्या आप दस्तावेज़ीकरण के लिए एक लिंक प्रदान करेंगे? – jtoberon

+0

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

+0

आप किस वेग का उपयोग कर रहे हैं? आपका मूल एस्केप टूल्स लिंक 1.4 था, और ये लिंक 2.0 के लिए हैं। – jtoberon

उत्तर

3

चेतावनी: मैं इसे थोड़ी देर पहले कुछ अस्पष्ट यादों पर आधारित कर रहा हूं। लाभ भिन्न हो सकता है।

कुछ वेग दस्तावेज को परिप्रेक्ष्य से पढ़ा जाना चाहिए "मैं इसे VelocityView में कैसे उपयोग करूं?" यदि आप सीधे जावा कोड से समान सुविधाओं का उपयोग करना चाहते हैं, तो आपको कुछ विवरण बदलने की जरूरत है। इस मामले में, मेरा मानना ​​है कि आप Context ठीक से नहीं बना रहे हैं। सुनिश्चित करें कि आप "आप के लिए एक संदर्भ बनाने के लिए [ToolManager] पूछते हैं" बनाने the standalone example here का पालन करने की कोशिश करो,:

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

कुछ इसी तरह अगर आप VelocityView का उपयोग शायद आप के लिए कवर के तहत किया जाता है।

+0

धन्यवाद, मैं कोशिश करूँगा। – Ralph

+0

@jtoberon मैं इसी तरह के मुद्दों में भाग गया है। मेरी समझ यह थी कि 'VelocityEngineFactoryBean' इनमें से कुछ को संभालती है, लेकिन मैं कितना स्पष्ट नहीं हूं। – Dan

+0

हम्म जो विशेष रूप से वसंत के लिए समझ में आता है, और उसने कहा कि वह वसंत का उपयोग कर रहा है। और फिर भी उसका उदाहरण काम नहीं करता है। इस बात को समझने के लिए डीबगर में असफल परीक्षण के माध्यम से कदम उठाने की आवश्यकता हो सकती है ताकि 'VelocityEngineUtils' रन होने पर संदर्भ में क्या हो। – jtoberon

1

यहां कुछ कोड है जो मैं अभी काम कर रहा हूं। मैंने पाया कि मानक उपकरण टूलमैनेजर द्वारा स्वचालित रूप से सेट किए गए हैं।

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

आप VelocityEngine में सीधे उपकरण कॉन्फ़िगर नहीं कर सकता है। या यदि आप VelocityEngine का उपयोग सीधे तुम कर सकते हो

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

:: क्या आप के बजाय करते हैं, कि जब आप VelocityEngineUtils कि आप मॉडल नक्शे के भीतर किसी भी उपकरण से पारित का उपयोग है

VelocityContext velocityContext = new VelocityContext(model); 
velocityEngine.mergeTemplate(templateLocation, encoding, velocityContext, writer); 
0
  1. जोड़ें पोम में वेग उपकरण मेवेन निर्भरता या कक्षा पथ में जार जोड़ें।
  2. वेग संदर्भ में भागने उपकरण वस्तु जोड़ें।

    [context.put ("escapeTool", नई EscapeTool())]

  3. उपयोग escapeTool टेम्पलेट में।

    [$ escapeTool.xml (value_to_be_escaped)]

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> 
संबंधित मुद्दे