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 />
?
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','<br/>')}" 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;
}
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
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 <br/>
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.