Thymeleaf: ersetzen newline-Zeichen mit <br>
Ich habe ein Feld ( <textarea name="desc" />
), die Zeilenumbrüche enthalten, und ich möchte Sie ersetzen, die in Ihrem HTML-Pendant: <br />
. Wie kann ich dies tun? Ich bin mit Thymeleaf 2.1.4.RELEASE.
- Bin ich etwas fehlt, wenn ich das verstehen wie die Ersetzung von text-Zeichen in einigen Modell-Attribut (nicht gerenderten HTML)? Wenn dem so ist, warum dann nicht tun Sie es einfach in den controller mit plain Java?
- Siehe auch stackoverflow.com/q/37765352/883073
- Diese Art von Arbeit ist view-spezifisch. Was würde passieren, wenn Sie Hinzugefügt eine andere view implementation verwendet, der macht *.doc-Dateien? Sie würde am Ende mit Modell-Attribut auszusetzen string mit "<br />"s, die unwirksam sind .doc-format - das ist, warum es nicht ein job für Controller.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie gesagt um dominik,
\n
für newline funktioniert nicht. Allerdings können Sie mit
.Oder mit Flucht zu verhindern, dass code-injection:
Wie in JSP, es ist nicht möglich, einfach und unkompliziert
Gibt es mindestens zwei Probleme:
<
und>
im inneren AusdrückeDie Lösung, die ich gefunden für das erste problem newline-Zeichen im controller übergeben und anzeigen.
Adresse das zweite problem, das Sie brauchen, zu verwenden
<
statt<
und>
statt>
. Denken Sie auch daran, dass dies mitth:utext
stattth:text
Wenn Sie mit Thymeleaf + Feder (was bedeutet, dass Thymeleaf verwenden SpEL anstelle von OGNL), können Sie auch verwenden, SpEL
T operator
.Auf diese Weise müssen Sie nicht deklarieren Sie die variable newline in Ihrem controller, sondern Verstand sich heraus, dass Zeilenvorschub Trennzeichen wird in diesem Fall unterscheiden sich in den verschiedenen Betriebssystemen, der Ihre app ausgeführt wird:Was ich mache, letztendlich ist die Kombination der oben genannten + Apache StringUtils definiert
public static final String LF = "\n";
:Ist es möglich dies mit einem custom-Dialekt und Attribut-Prozessor zu behandeln, dies zu tun, ohne eine Menge von inline-SpEl oder hacks.
Erstellen Sie ein Benutzerdefiniertes Attribut Prozessor
Verlängerung der
AbstractUnescapedTextChildModifierAttrProcessor
Prozessor oder sonst bekommen Sie die html-entity-tags für<br />
und Sie nicht wirklich einen Zeilenumbruch.Erstellen einer benutzerdefinierten Dialekt
Zur Implementierung eines benutzerdefinierten Dialekt Sie brauchen einen Dialekt-Klasse in etwa so:
Den
getPrefix
Rückgabewert der Methode ist, was Sie verwenden würden, um rufen Sie eine benutzerdefinierte Prozessoren, die Sie machen. Zum Beispiel, Thymeleaf verwendetth
. Die custom-Prozessor implementierten wir oberhalb dieser ist auf der Suche nachnl2br
so zu nennen, es würde diecd:nl2br
- Attribut anstelle desth:text
.Der Registrierung Ihrer neuen Dialekt
In deiner main-Klasse, die Sie gerade brauchen, um erstellen Sie eine
@Bean
, die zurückkehren wird eine neue Instanz der Dialekt Klasse.Mit Ihrer benutzerdefinierten Prozessor
Schließlich in Ihrem template-Datei ein HTML-tag wie diesem:
<div cd:nl2br="${myObject.myField}">MY MULTILINE FIELD</div>
Eine ausführliche Anleitung zur Implementierung von benutzerdefinierten Dialekte empfehle ich die Thymeleaf docs: