2008-09-12 24 views
40

Ich habe eine Liste von Bean-Objekten, die an meine JSP-Seite übergeben wurden, und einer davon ist ein Kommentarfeld. Dieses Feld kann Zeilenumbrüche enthalten, und ich möchte sie mithilfe von JSTL durch Semikola ersetzen, damit das Feld in einer Texteingabe angezeigt werden kann. Ich habe eine Lösung gefunden, aber es ist nicht sehr elegant. Ich werde als Möglichkeit unten posten.Wie kann ich Newline-Zeichen mit JSP und JSTL ersetzen?

Antwort

51

Hier ist eine Lösung, die ich gefunden habe. Es sieht jedoch nicht sehr elegant aus:

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

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

Ich akzeptiere das, obwohl es meine eigene Antwort ist, weil es am einfachsten ist und ich finde, dass es tatsächlich funktioniert. – parkerfath

+0

Das ist unnötig. Entkomme einfach dem Backslash: http://stackoverflow.com/questions/58054/how-can-i-replace-newline-characters-using-jsp-and-jstl/1690942#1690942 – BalusC

+2

Ich habe versucht, nur den Backslash zu entkommen, die didn Ich arbeite auch nicht. Meine oben aufgelistete Methode zum Festlegen des Attributs pageContext ist immer noch die einzige Möglichkeit, um es zum Laufen zu bringen. Wie BalusC sagt, haben Sie vielleicht Glück mit einigen der einfacheren Methoden. Wahrscheinlich gut, alle Optionen hier zu haben. – parkerfath

2

Sie sollten es mit Fn: ersetzen können.

Sie müssen die Tag-Bibliothek in Ihre JSP mit der folgenden Erklärung importieren:

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

Dann können Sie den folgenden Ausdruck verwenden Vorkommen von Newline in $ ersetzen {Daten} mit einem Semikolon:

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

Die Dokumentation ist nicht gut auf diesem Zeug und ich hatte keine Gelegenheit, es zu testen.

+0

Ich bin mir ziemlich sicher, dass ich das zuerst ausprobiert habe und es hat nicht funktioniert. Ich habe nicht wirklich Zeit, es erneut zu testen, also kann ich mich irren. – parkerfath

+0

Ich denke, diese Antwort ist ziemlich genau die gleiche wie meine (siehe unten), aber ohne die zusätzliche pageContext.setAttribute(). Weißt du, ob es vielleicht eine Einstellung gibt, die ich nicht eingestellt habe, die mich veranlasst, diese zusätzliche Methode aufzurufen? – parkerfath

+0

Ich erhalte diesen Fehler: org.apache.jasper.JasperException: /WEB-INF/jsp/team/alarms.jsp(11,2) "$ {fn: replace (blob, \ n", ";") } "enthält ungültige Ausdrücke: javax.servlet.jsp.el.ELException: Aufgetreten" "\ n", erwartetes aus [, , usw. – parkerfath

0

Sie könnten Ihre eigene JSP-Funktion schreiben, um den Austausch durchzuführen.

Dies bedeutet, dass Sie am Ende mit etwas würde wie:

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

Wo ns ein Namespacepräfix ist Sie definieren und replace ist Ihre JSP-Funktion.

Diese Funktionen sind ziemlich einfach zu implementieren (sie sind nur eine statische Methode), obwohl ich nicht scheinen kann, eine gute Referenz für das Schreiben dieser im Moment zu finden.

4

Sie könnten Ihre eigene JSP-Funktion erstellen. http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPTags6.html

Dies ist in etwa das, was Sie tun müssen.

erstellen Tagbibliothek Deskriptordatei
/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> 

eine Java-Klasse Logik für die Funktionen erstellen.
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", "; "); 
    } 
} 

in Ihrer JSP Sie Ihre Funktion in der folgenden Art und Weise zugreifen können.

+0

sollte $ {sf: clean (item Ich benutze diese Lösung .. scheint sauberer als die Scriptlet – danb

+0

danke danb, ich habe meinen Beitrag aktualisiert – Geekygecko

+0

@danb: Sie haben meine Antwort verpasst? http://stackoverflow.com/questions/58054/how- can-i-replace-newline-zeichen-using-jsp-und-jstl/1690942 # 1690942 – BalusC

0

In den Wert während der Einstellung der Var, drücken Sie ENTER zwischen den Anführungszeichen.

$ {fn: replace (Daten, newLineChar, ";")}

8

Diese Lösung ist eleganter als Ihre eigene Lösung, die die Pagecontext direkt Attribut setzt.Sie sollten die <c:set> Tag für diesen Einsatz:

<%@ 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", ";")} funktioniert nicht.

+0

Dies funktioniert nicht für mich in Resin 3, während die oberste Antwort mit dem ScriptContext Scriptlet tut das. – pimlottc

+0

Ich denke, das wäre ein Fehler, weil nach den Standards sollte es funktionieren. – Bousch

+1

@pimlottc Rep schneide das '' 'mit' ''in $ {fn: replace (data," \ n ","; ")}' und es sollte funktionieren: '$ {fn: replace (data,' \ n ',' ;)} '. Anderenfalls wird dies beispielsweise nicht funktionieren: '' wegen der doppelten Anführungszeichen nach dem Wert. – mvdb

1

\ n repräsentiert nicht das Newline-Zeichen in einem EL-Ausdruck.

Die Lösung, die ein pageContext-Attribut auf das Newline-Zeichen setzt und es dann mit JSTLs fn:replace-Funktion verwendet, funktioniert.

Allerdings habe ich es vorziehen, die Jakarta String Tab-Bibliothek zu verwenden, um dieses Problem zu lösen:

<%@ 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> 
... 

können Sie verwenden, was Sie für die newlineToken wollen; "~ n" wird wahrscheinlich nicht in dem Text erscheinen, in dem ich den Ersatz mache, also war es eine vernünftige Wahl für mich.

4

Dies funktioniert nicht für mich:

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

Dies tut:

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

Das sind die Antworten oben, oder? Vielleicht wäre es besser, die bereits gegebenen Antworten zu kommentieren, anstatt sie zu wiederholen. – parkerfath

+0

Ich habe das gleiche Problem, das hat meins gelöst, danke, aber warum funktioniert das erste nicht? –

+0

@parkerfath Die höherrangige Version dieser Antwort warnt nicht davor, dass die c: set- oder Inline-Versionen häufig unbemerkt ausfallen. – LateralFractal

19

Gerade fn:replace() Funktion \n von ; zu ersetzen.

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

Falls Sie verwenden Apache-EL Implementierung anstelle von Oracle EL Referenz-Implementierung (dh, wenn Sie mit Tomcat, TomEE, JBoss, etc. statt Glassfish, Payara, Wildfly, WebSphere, etc), dann Sie müssen den umgekehrten Schrägstrich zurückgeben.

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

Für die Aufzeichnung kam ich diesen Beitrag über, während dieses Problem anzugehen:

Eine mehrzeilige Zeichenfolge in JSTL wird als Titel-Attribut eines Textbereich hinzugefügt. Javascript fügt das dann als Standardtext des Textfelds hinzu. Um diesen Text im Fokus zu löschen, muss der Wert dem Titel entsprechen ... aber es schlägt fehl, da viele Texteditoren \ r \ n statt \ n einfügen. So ist die follownig wird der unerwünschten \ r loszuwerden:

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

Mehr leicht:

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

Wenn das, was Sie wirklich brauchen, ist ein \ n Symbol Sie den Rat von here verwenden können:

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

oder

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

Dies beinhaltet die neue Zeile in Ihrem String-Literal.

12

Dies ist ähnlich wie die akzeptierte Antwort (weil es Java wird mit dem Newline darzustellen, anstatt EL), aber hier das < c: set/> Element verwendet wird, um das Attribut gesetzt:

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

Die folgende Schnipsel funktionieren auch, aber die zweite Zeile der < c: set/> Element kann nicht eingerückt werden (und kann hässlicher aussehen):

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

Großartig! Ich weiß nicht warum, aber akzeptierte Antwort funktioniert nicht. Weißt du, warum? –

+0

Der erste Ausschnitt funktionierte für mich. Vielen Dank! –

0

Dies ist eine gültige Lösung für den JSP-EL:

"${fn:split(string1, Character.valueOf(10))}"