h:outputText ne brise pas les caractères rn en de nouvelles lignes

j'ai du texte dans une variable String qui contient des retours de chariot et de nouvelles lignes rn .

text = "Text1rnText2rnText3";

je le présente en utilisant un <h:outputtext> .

<h:outputText value="#{bean.text}" />

mais il ne reconnaît pas les nouveaux caractères de ligne et montre comme ci-dessous dans webbrowser.

Texte1 Texte2 Texte3

pourquoi le <h:outputText> ne brise pas n en Nouveau lignes?

Que dois-je faire? Dois-je remplacer n par <br /> ?

45
demandé sur BalusC 2013-02-01 17:23:53

3 réponses

retours à la ligne (en HTML sont représentés par des <br /> élément, et non par le "151940920 caractère". Encore plus, ouvrez le code source HTML moyen par rightclick, voir Source dans le navigateur et vous "voir" \n partout. Ils ne sont toutefois pas présentés comme tels dans la présentation HTML finale. Seul le <br /> le fera.

donc, oui, vous devez les remplacer par <br /> .

<h:outputText value="#{fn:replace(bean.text,'\n','&lt;br/&gt;')}" escape="false" />

Note: lorsque vous utilisez Apache EL à la place D'Oracle EL, double-escape The slash comme dans \n .

c'est cependant laid et le escape="false" le rend sensible à attaques XSS si la valeur vient de l'entrée de l'utilisateur et vous ne assainir à l'avance. Une meilleure alternative est de continuer à utiliser \n et de définir CSS white-space propriété pour préformater sur l'élément parent. Si vous voulez comme envelopper des lignes dans le contexte d'un élément de bloc, puis mettre pre-wrap . Ou si vous souhaitez réduire les espaces et les onglets ainsi, puis Définir pre-line .

E. G.

<h:outputText value="#{bean.text}" styleClass="preformatted" />
.preformatted {
    white-space: pre-wrap;
}
96
répondu BalusC 2018-08-22 07:18:05

c'est un comportement normal, en HTML espaces consécutifs blancs tels que les espaces et linebreaks est normalisé de sorte qu'il affiche juste comme un espace unique. Vous obtiendriez le même affichage si vous incluiez le texte avec linebreaks directement dans la source HTML. Pour honorer les linebreaks dans la sortie vous devriez envelopper le texte dans pre tags ou appliquer une classe de feuille de style:

<pre><h:outputText value="..."/></pre>

<div style="white-space: pre-wrap"><h:outputText value="..."/></div>

pour d'autres valeurs possibles pour l'attribut white-space regardez cette page: http://www.w3schools.com/cssref/pr_text_white-space.asp

10
répondu Jörn Horstmann 2013-02-01 13:52:11

les réponses précédentes ont causé des problèmes pour moi pour de grandes quantités de texte, comme extremely wide output (no text wrap), que style="white-space: pre-wrap" n'a pas corrigé; ou il a juste affiché le &lt;br/&gt; comme Texte, pas comme une fin de ligne.

à la fin j'ai utilisé le composant h:inputTextarea pour afficher le texte et l'ai fait "lire seulement" qui a fonctionné tout droit sans remplacer les sauts de ligne, ni avoir à utiliser les styles supplémentaires ou des classes de style. Et, il est redimensionnable pour s'adapter à la les besoins de l'utilisateur, qui est un bonus.

<h:inputTextarea cols="70" rows="10" readonly="true" value="#{bean.text}" /> 

pour de petites quantités de texte, j'ai trouvé l'option pre-wrap , comme suggéré par henko ci-dessus, pour bien fonctionner.

4
répondu Robbie62 2018-06-08 00:04:09