Frage

Ich habe eine Liste von Bean-Objekten in meine JSP-Seite übergeben, und einer von ihnen ist ein Kommentarfeld. Dieses Feld kann Zeilenumbrüche enthalten, und ich mag sie mit Semikolons ersetzen JSTL verwenden, so dass das Feld in einer Texteingabe angezeigt werden kann. Ich habe eine Lösung gefunden, aber es ist nicht sehr elegant. Ich werde im Folgenden als Möglichkeit stellen.

War es hilfreich?

Lösung

Hier ist eine Lösung, die ich gefunden. Es ist nicht sehr elegant erscheinen, aber:

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

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

Andere Tipps

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

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

Im Fall sind Sie mit Apache-EL Implementierung anstelle von Oracle EL Referenz-Implementierung (dh, wenn Sie mit Tomcat, TomEE, JBoss, etc. statt Glassfish, Payara, Wildfly, WebSphere, etc), dann müssen Sie erneut -escape den umgekehrten Schrägstrich.

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

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

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

Das folgende Snippet funktioniert auch, aber die zweite Zeile des Element nicht eingezogen werden kann (und kann hässlicher aussehen):

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

Diese Lösung ist eleganter als Ihre eigene Lösung, die das Attribut direkt Pagecontext setzt. Sie sollten den <c:set>-Tag für diese verwenden:

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

.

Dies gilt nicht für mich arbeiten:

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

Das tut:

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

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

Das ist ungefähr das, was Sie tun müssen.

Erstellen Sie eine Tag-Bibliothek 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>

Erstellen Sie eine Java-Klasse für die Funktionen Logik.
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 der JSP Sie Ihre Funktion in der folgenden Art und Weise zugreifen können.

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

Wenn das, was Sie wirklich brauchen, ist ein \ n Symbol Sie den Rat von hier :

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

oder

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

Dazu gehört auch die neue Zeile in Stringliteral.

Es soll möglich sein, es mit fn zu tun: Ersetzen

.

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 auf diesen Dingen nicht so toll und ich habe nicht die Gelegenheit zu testen, es hat.

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

Die Lösung, die ein pageContext Attribut auf das Newline-Zeichen setzt und dann verwendet ihn mit fn:replace Funktion des JSTL 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>
...

Sie können mit, was Sie wollen für die newlineToken; „~ N“ unwahrscheinlich ist im Text zu zeigen, bis ich den Ersatz machte auf, so war es eine vernünftige Wahl für mich.

Mehr leicht:

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

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

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

Sie können Ihre eigene JSP-Funktion schreiben Sie den Austausch zu tun.

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

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

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

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

In dem Wert, während die var Einstellung, drücken Sie die Eingabetaste zwischen den doppelten Anführungszeichen.

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

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 dann diese als Standard-Text des Textbereiches. Um diesen Text auf Fokus löschen muss der Wert um den Titel gleich ... aber nicht so viele Text-Editoren put \ r \ n anstelle von \ n. So wird die follownig der unerwünschten \ r loszuwerden:

<% pageContext.setAttribute("newLineChar", "\r"); %> 
<c:set var="textAreaDefault" value="${fn:replace(textAreaDefault, newLineChar, '')}" />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top