2015-06-04 12 views
6

के साथ न्यूलाइन वर्णों को प्रतिस्थापित करें मेरे पास एक फ़ील्ड (<textarea name="desc" />) है जिसमें न्यूलाइन हो सकती है और मैं उन्हें अपने HTML समकक्ष के साथ प्रतिस्थापित करना चाहता हूं: <br />। मैं यह कैसे कर सकता हूँ? मैं Thymeleaf 2.1.4.RELEASE उपयोग कर रहा हूँ।थाइमेलीफ: <br>

+0

मैं कुछ याद आ रही है? यदि ऐसा है, तो आप सादे जावा का उपयोग कर नियंत्रक में ऐसा क्यों नहीं करते? –

+0

यह भी देखें http://stackoverflow.com/q/37765352/883073 –

+0

@ हेलकनास्ट: इस तरह का काम दृश्य-विशिष्ट है। क्या होगा यदि आपने एक और दृश्य कार्यान्वयन जोड़ा जो * .doc फ़ाइलों को प्रस्तुत करता है? आप "
" के साथ स्ट्रिंग को उजागर करने वाले मॉडल विशेषता के साथ समाप्त हो जाएंगे जो कि .doc प्रारूप में अमान्य हैं - यही कारण है कि यह नियंत्रकों के लिए नौकरी नहीं है। – dominik

उत्तर

3

As in JSP, इसका इस्तेमाल करना संभव नहीं है सरल और सीधा

${#strings.replace(desc, '\n', '<br />')} 

रहे हैं कम से कम दो समस्याओं:

  • '\ n' अंतर्निहित अभिव्यक्ति भाषा (मेरे मामले में स्पेल के रूप से किया जाता है मैं वसंत MVC) का उपयोग कर रहा स्ट्रिंग शाब्दिक कि दो अलग-अलग वर्ण होने के रूप में: '\' और 'एन' नहीं बल्कि एक नई पंक्ति चरित्र
  • अपवाद XML पार्सर अंतर्निहित टी की अनुमति नहीं है Thymeleaf के रूप में फेंक दिया जा रहा है की तुलना में ओ < और > अंदर भाव

समाधान मैं पहली समस्या के लिए मिला एक नियंत्रक में न्यू लाइन चरित्र की स्थापना की और देखने के लिए इसे पारित करने के लिए है डाल दिया।

दूसरी समस्या को हल करने के लिए आपको < और के बजाय के बजाय &lt; का उपयोग करने की आवश्यकता है। यह भी याद रखें कि यह बजाय th:text

// in controller: 
model.addAttribute("newLineChar", '\n'); 

// in view 
${#strings.replace(desc, newLineChar, '&lt;br /&gt;')} 

आप Thymeleaf + स्प्रिंग (क्या इसका मतलब है कि Thymeleaf OGNL के बजाय स्पेल का उपयोग करेगा) का उपयोग कर रहे हैं, तो th:utext का उपयोग कर निकलता है, तो आप भी स्पेल T operator है इस तरह से उपयोग कर सकते हैं क्या तुम नहीं अपने नियंत्रक लेकिन बाहर इस मामले में है कि न्यू लाइन विभाजक मन में नई पंक्ति चर घोषित करने के लिए ऑपरेटिंग सिस्टम के बीच अलग अलग होंगे, जो आपके ऐप्लिकेशन पर चल रहा है है:

${#strings.replace(desc, T(System).getProperty('line.separator'), '&lt;br /&gt;')} 

क्या मैं अंत में उपयोग करने के लिए जा रहा हूँ का संयोजन है + अपाचे StringUtils कि public static final String LF = "\n"; को परिभाषित करता है ऊपर :

${#strings.replace(desc, T(org.apache.commons.lang3.StringUtils).LF, '&lt;br /&gt;')} 
1

यह एक कस्टम बोली के साथ ऐसा कर और इनलाइन स्पेल या हैक्स का एक बहुत बिना ऐसा करने को संभालने के लिए प्रोसेसर का श्रेय देना संभव है।

एक कस्टम बनाया जा रहा है प्रोसेसर गुण

public class NewlineAttrProcessor extends AbstractUnescapedTextChildModifierAttrProcessor 
{ 
    public NewlineAttrProcessor() 
    { 
     super("nl2br"); 
    } 

    @Override 
    protected String getText(Arguments arguments, Element element, String attributeName) 
    { 
     final Configuration configuration = arguments.getConfiguration(); 

     final IStandardExpressionParser parser = 
      StandardExpressions.getExpressionParser(configuration); 

     final String attributeValue = element.getAttributeValue(attributeName); 

     final IStandardExpression expression = 
      parser.parseExpression(configuration, arguments, attributeValue); 

     final String value = (String)expression.execute(configuration, arguments); 
     return StringUtils.replace(value, "\n", "<br />"); 
    } 

    @Override 
    public int getPrecedence() 
    { 
     return 10000; 
    } 
} 

आप AbstractUnescapedTextChildModifierAttrProcessor प्रोसेसर का विस्तार करने के लिए है या फिर आप <br /> के लिए html इकाई टैग मिल जाएगा और आप वास्तव में एक लाइन ब्रेक नहीं मिलेगा।

एक कस्टम बोली

बनाना तुम इतनी तरह एक बोली वर्ग की जरूरत है एक कस्टम बोली लागू करने के लिए:

public class MyCustomDialect extends AbstractDialect 
{ 
    @Override 
    public String getPrefix() 
    { 
     return "cd"; 
    } 

    @Override 
    public Set<IProcessor> getProcessors() 
    { 
     final Set<IProcessor> processors = new HashSet<>(); 
     processors.add(new NewlineAttrProcessor()); 
     return processors; 
    } 
} 

getPrefix विधि वापसी मान आप किसी भी कस्टम प्रोसेसर कॉल करने के लिए प्रयोग करेंगे क्या है कि तुम बनाओ। उदाहरण के लिए, Thymeleaf th उपयोग करता है। हम इस ऊपर लागू किया कस्टम प्रोसेसर nl2br की तलाश में है तो आप th:text के बजाय cd:nl2br विशेषता का प्रयोग करेंगे इसे कहते हैं।

अपने मुख्य वर्ग में पंजीयन अपने नए बोली

, तो आप सिर्फ एक @Bean कि आपके बोली वर्ग का एक नया उदाहरण वापस आ जाएगी बनाना होगा। कस्टम बोलियों को लागू करने के लिए

<div cd:nl2br="${myObject.myField}">MY MULTILINE FIELD</div>

अधिक गहन गाइड के लिए:

@SpringBootApplication 
public class MyApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(MyApplication.class, args); 
    } 

    @Bean 
    public MyCustomDialect myCustomDialect() 
    { 
     return new MyCustomDialect(); 
    } 
} 

अपने कस्टम प्रोसेसर का उपयोग करके

अंत में, अपने टेम्पलेट फ़ाइल में आप इस तरह HTML टैग होता है मैं थाइमेलीफ डॉक्स की सिफारिश करता हूं:

6

रूप डोमिनिक, न्यू लाइन काम नहीं करता है के लिए \n द्वारा कहा गया। हालांकि, आप &#10; का उपयोग कर सकते हैं।

${#strings.replace(desc,'&#10;','&lt;br&gt;')} 

या कोड इंजेक्शन को रोकने के लिए भागने के साथ: अगर मैं कुछ मॉडल विशेषता (एचटीएमएल गाया नहीं) में पाठ वर्णों की जगह के रूप में इस बात को समझ

${#strings.replace(#strings.escapeXml(desc),'&#10;','&lt;br&gt;')} 
+0

बस लोगों की मदद करने के लिए। लाइनफिड चरित्र का ASCII है। यह एक आकर्षण की तरह काम किया :) – borjab

संबंधित मुद्दे