2008-09-12 24 views
40

मेरे पास मेरे जेएसपी पेज में बीन ऑब्जेक्ट्स की एक सूची है, और उनमें से एक टिप्पणी क्षेत्र है। इस फ़ील्ड में न्यूलाइन हो सकती है, और मैं उन्हें जेएसटीएल का उपयोग करके अर्धविराम से बदलना चाहता हूं, ताकि फ़ील्ड को टेक्स्ट इनपुट में प्रदर्शित किया जा सके। मुझे एक समाधान मिला है, लेकिन यह बहुत ही सुरुचिपूर्ण नहीं है। मैं एक संभावना के रूप में नीचे पोस्ट करेंगे।जेएसपी और जेएसटीएल का उपयोग करके मैं न्यूलाइन अक्षरों को कैसे बदल सकता हूं?

उत्तर

51

यहां एक समाधान है जो मैंने पाया। यह बहुत ही सुरुचिपूर्ण प्रतीत नहीं होता है, हालांकि:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 
<% pageContext.setAttribute("newLineChar", "\n"); %> 

${fn:replace(item.comments, newLineChar, "; ")} 
+0

मैं इसे स्वीकार कर रहा हूं, भले ही यह मेरा उत्तर है, क्योंकि यह सबसे आसान है और मैंने इसे वास्तव में काम करने के लिए पाया है। – parkerfath

+0

यह अनावश्यक है। बस बैकस्लैश से बचें: http://stackoverflow.com/questions/58054/how-can-i-replace-newline-characters-using-jsp-and-jstl/1690942#1690942 – BalusC

+2

मैंने बैकस्लैश से बचने की कोशिश की, जो नहीं या तो काम नहीं करते हैं। पेज कॉन्टेक्स्ट विशेषता सेट करने की मेरी उपरोक्त विधि अभी भी एकमात्र तरीका है जिसे मैं इसे काम कर सकता हूं। हालांकि बलुस के अनुसार, आप कुछ सरल तरीकों से बेहतर भाग्य प्राप्त कर सकते हैं। यहां सभी विकल्पों के लिए शायद अच्छा है। – parkerfath

2

आपको इसे एफएन के साथ करने में सक्षम होना चाहिए: प्रतिस्थापित करें।

आप नीचे दिए गए घोषणा के साथ अपने JSP में टैग पुस्तकालय आयात करने के लिए की आवश्यकता होगी:

 
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 

तो फिर तुम अर्धविराम {डेटा} $ में न्यू लाइन की घटनाओं को बदलने के लिए निम्नलिखित अभिव्यक्ति का उपयोग कर सकते हैं:

 
${fn:replace(data, "\n", ";")} 

इस सामग्री पर दस्तावेज़ीकरण बहुत अच्छा नहीं है और मुझे इसका परीक्षण करने का अवसर नहीं मिला है।

+0

मुझे पूरा यकीन है कि मैंने पहले कोशिश की थी, और यह काम नहीं किया। मेरे पास वास्तव में परीक्षण करने का समय नहीं है, हालांकि, मैं गलत हो सकता हूं। – parkerfath

+0

मुझे लगता है कि यह उत्तर मेरे जैसा ही है (नीचे देखें), लेकिन अतिरिक्त पेज के बिना Context.setAttribute()। क्या आपको पता है कि शायद कुछ सेटिंग है जिसे मैंने सेट नहीं किया है जिससे मुझे इस अतिरिक्त विधि को कॉल करने की आवश्यकता हो सकती है? – parkerfath

+0

मुझे यह त्रुटि मिलती है: org.apache.jasper.JasperException: /WEB-INF/jsp/team/alarms.jsp(11,2) "$ {fn: प्रतिस्थापित करें (ब्लॉब," \ n ","; ") } "में अमान्य अभिव्यक्ति है: javax.servlet.jsp.el.ELException:" \ n "" \ "INTEGER_LITERAL>, , आदि – parkerfath

0

आप प्रतिस्थापन करने के लिए अपना स्वयं का जेएसपी फ़ंक्शन लिख सकते हैं।

इसका मतलब है आप की तरह कुछ को रखना होगा:

<%@ taglib prefix="ns" uri="..." %> 
... 
${ns:replace(data)} 

कहाँ ns एक नामस्थान उपसर्ग है आप को परिभाषित करने और replace अपने JSP कार्य है।

ये फ़ंक्शंस लागू करने के लिए बहुत आसान हैं (वे केवल एक स्थिर विधि हैं) हालांकि मुझे इस समय इन्हें लिखने के लिए एक अच्छा संदर्भ नहीं दिख रहा है।

4

आप अपना स्वयं का जेएसपी फ़ंक्शन बना सकते हैं। http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPTags6.html

यह वही है जो आपको करने की ज़रूरत है।

एक टैग पुस्तकालय वर्णनकर्ता फ़ाइल
/src/META-INF/sf.tld

<?xml version="1.0" encoding="UTF-8"?> 
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"> 
    <tlib-version>1.0</tlib-version> 
    <short-name>sf</short-name> 
    <uri>http://www.stackoverflow.com</uri> 
    <function> 
    <name>clean</name> 
    <function-class>com.stackoverflow.web.tag.function.TagUtils</function-class> 
    <function-signature> 
     java.lang.String clean(java.lang.String) 
    </function-signature> 
    </function> 
</taglib> 

कार्यों तर्क के लिए एक जावा वर्ग बनाएँ।
com.stackoverflow.web.tag.function.TagUtils

package com.stackoverflow.web.tag.function; 

import javax.servlet.jsp.tagext.TagSupport; 

public class TagUtils extends TagSupport { 
    public static String clean(String comment) { 
    return comment.replaceAll("\n", "; "); 
    } 
} 

अपने JSP आप निम्नलिखित तरीके से अपने समारोह का उपयोग कर सकते हैं।

<%@ taglib prefix="sf" uri="http://www.stackoverflow.com"%> 
${sf:clean(item.comments)} 
+0

$ {sf: clean (item) होना चाहिए .comments)} ... मैंने इस समाधान का उपयोग किया .. स्क्रिप्टलेट की तुलना में क्लीनर लगता है – danb

+0

धन्यवाद danb, मैंने अपनी पोस्ट – Geekygecko

+0

@danb अपडेट की है: आपने मेरा जवाब छोड़ा है? http://stackoverflow.com/questions/58054/how- कैन-आई-प्रतिस्थापन-न्यूलाइन-वर्ण-उपयोग-जेएसपी-एंड-जेएसटीएल/16 9 0 9 42 # 16 9 0 9 42 – BalusC

0

var सेट करते समय मूल्य में, डबल कोट्स के बीच ENTER दबाएं।

$ {fn: की जगह (डेटा, newLineChar, ",")}

8

यह समाधान अपने खुद के समाधान जो स्थापित कर रही है pagecontext सीधे विशेषता की तुलना में अधिक सुंदर है।आप इस के लिए <c:set> टैग का उपयोग करना चाहिए:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 

<c:set var="newLine" value="\n"/> 
${fn:replace(data, newLine, "; ")} 

Btw: ${fn:replace(data, "\n", ";")} काम नहीं करता है।

+0

यह मेरे लिए राल 3 में काम नहीं करता है, जबकि पेज कॉन्टेक्स्ट स्क्रिप्टलेट का उपयोग करने वाला शीर्ष उत्तर करता है। – pimlottc

+0

मुझे लगता है कि यह एक होगा बग क्योंकि मानकों के मुताबिक इसे काम करना चाहिए। – Bousch

+1

@pimlottc प्रतिनिधि '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' {'{nn," \ n ","; "}} और इसे काम करना चाहिए:' $ {fn: प्रतिस्थापित करें (डेटा, '\ n', ' ; ')} '। अन्यथा, उदाहरण के लिए, यह काम नहीं करेगा: '

1

\ n ईएल अभिव्यक्ति में न्यूलाइन वर्ण का प्रतिनिधित्व नहीं करता है।

समाधान जो pageContext को न्यूलाइन वर्ण में विशेषता देता है और उसके बाद जेएसटीएल के fn:replace फ़ंक्शन के साथ इसका उपयोग करता है।

हालांकि, मैं इस समस्या को हल करने के लिए जकार्ता स्ट्रिंग टैब लाइब्रेरी का उपयोग करना पसंद:

<%@ taglib prefix="str" uri="http://jakarta.apache.org/taglibs/string-1.1" %> 
... 
<str:replace var="result" replace="~n" with=";" newlineToken="~n"> 
Text containing newlines 
</str:replace> 
... 

आप उपयोग कर सकते हैं जो कुछ भी आप newlineToken के लिए चाहते हैं; "~ n" उस पाठ में दिखने की संभावना नहीं है जिसे मैं प्रतिस्थापन कर रहा हूं, इसलिए यह मेरे लिए उचित विकल्प था।

4

यह मेरे लिए काम नहीं करता:

<c:set var="newline" value="\n"/> 
${fn:replace(data, newLine, "; ")} 

यह करता है:

<% pageContext.setAttribute("newLineChar", "\n"); %> 
${fn:replace(item.comments, newLineChar, "; ")} 
+1

में समाधान का काम करता है ये ऊपर दिए गए उत्तर हैं, है ना? हो सकता है कि उन्हें दोहराने के बजाए पहले से दिए गए उत्तरों पर टिप्पणी करना या ऊपर उठाना बेहतर होगा। – parkerfath

+0

मुझे एक ही समस्या है, यह मेरा हल है, धन्यवाद, लेकिन पहला क्यों काम नहीं करता है? –

+0

@parkerfath इस उत्तर का उच्च-रैंक संस्करण यह चेतावनी नहीं देता है कि सी: सेट या इनलाइन संस्करण अक्सर चुपचाप विफल हो जाएंगे। – LateralFractal

19

बस ; द्वारा \n को बदलने के लिए fn:replace() समारोह का उपयोग करें।

${fn:replace(data, '\n', ';')} 

मामले आप अपाचे के ईएल कार्यान्वयन के बजाय Oracle की ईएल संदर्भ कार्यान्वयन का उपयोग कर रहे (यानी जब आप बिलाव, TomEE, JBoss, आदि के बजाय ग्लासफिश, Payara, WildFly, WebSphere, आदि का उपयोग कर रहे हैं), तो आपको बैकस्लैश से फिर से बचने की जरूरत है।

JSTL में एक बहु-पंक्ति स्ट्रिंग एक पाठ क्षेत्र के शीर्षक विशेषता के रूप में जोड़ा जाता है:

${fn:replace(data, '\\n', ';')} 
0

रिकॉर्ड के लिए, मैं इस समस्या से निपटने जबकि इस पोस्ट भर में आया था। जावास्क्रिप्ट फिर इसे टेक्स्टरेरा के डिफ़ॉल्ट पाठ के रूप में जोड़ता है। फोकस पर इस पाठ को साफ़ करने के लिए मूल्य को शीर्षक के बराबर करने की आवश्यकता है ... लेकिन विफल रहता है क्योंकि कई टेक्स्ट-एडिटर्स \ n \ n के बजाय \ r \ n डालते हैं।

<% pageContext.setAttribute("newLineChar", "\r"); %> 
<c:set var="textAreaDefault" value="${fn:replace(textAreaDefault, newLineChar, '')}" /> 
1

अधिक आसानी से:: तो follownig अवांछित \ r से छुटकारा मिल जाएगा

<str:replace var="your_Var_replaced" replace="\n" with="Your ney caracter" newlineToken="\n">${your_Var_to_replaced}</str:replace> 
3

आप वास्तव में क्या जरूरत है एक \ N प्रतीक आप here से सलाह का उपयोग कर सकते है:

${fn:replace(text, " 
", "<br/>")} 

या

<c:set var="nl" value=" 
" /><%-- this is a new line --%> 

इसमें आपकी स्ट्रिंग शाब्दिक में नई पंक्ति शामिल है।

12

यह स्वीकार किए जाते हैं जवाब देने के लिए इसी तरह की है (क्योंकि यह नहीं बल्कि ईएल से न्यू लाइन का प्रतिनिधित्व करने के जावा उपयोग कर रहा है) लेकिन यहाँ < c: सेट/> तत्व विशेषता सेट करने के लिए प्रयोग किया जाता है:

<c:set var="newline" value="<%= \"\n\" %>" /> 
${fn:replace(myAddress, newline, "<br />")} 

निम्नलिखित स्निपेट भी काम करता है, लेकिन < ग की दूसरी पंक्ति: सेट/> तत्व इंडेंट नहीं किया जा सकता है (और भद्दा लग सकता है):

<c:set var="newline" value=" 
" /><!--this line can't be indented --> 
    ${fn:replace(myAddress, newline, "<br />")} 
+0

बढ़िया! मुझे नहीं पता कि क्यों स्वीकार्य उत्तर काम नहीं कर रहा है। तुम जानते हो क्यों? –

+0

पहला स्निपेट मेरे लिए काम करता था। धन्यवाद! –

0

इस JSP ईएल के लिए एक वैध समाधान है:

"${fn:split(string1, Character.valueOf(10))}" 
संबंधित मुद्दे

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