h:outputText does not break \r\n characters into new lines
jsf, line-breaks, output
Solution
Linebreaks in HTML are represented by `<br />` element, not by the `\n` character. Even more, open the average HTML source code by rightclick, View Source in browser and you'll "see" `\n` over all place. They are however not presented as such in the final HTML presentation. Only the `<br />` will.
So, yes, you need to replace them by `<br />`. You can use JSTL functions for this:
<... xmlns:fn="http://xmlns.jcp.org/jsp/jstl/functions">
<h:outputText value="#{fn:replace(bean.text,'\n','<br/>')}" escape="false" />
Note: when using Apache EL instead of Oracle EL, double-escape the backslash as in `\\n`.
<h:outputText value="#{fn:replace(bean.text,'\\n','<br/>')}" escape="false" />
Otherwise you will face an exception with the message `Failed to parse the expression with root cause org.apache.el.parser.ParseException: Encountered <ILLEGAL_CHARACTER>`.
This all is however ugly and the `escape="false"` makes it sensitive to XSS attacks if the value comes from enduser input and you don't sanitize it beforehand. A better alternative is to keep using `\n` and set CSS `white-space` property to preformatted on the parent element. If you'd like to wrap lines inside the context of a block element, then set `pre-wrap`. Or if you'd like to collapse spaces and tabs as well, then set `pre-line`.
E.g.
<h:outputText value="#{bean.text}" styleClass="preformatted" />
.preformatted {
white-space: pre-wrap;
}
Problem
I have a `String` variable which contains carriage returns and new lines `\r\n`. ``` text = "Text1\r\nText2\r\nText3"; ``` I'm presenting it using `<h:outputtext>`. ``` <h:outputText value="#{bean.text}" /> ``` But it doesn't recognize the new line characters and shows as below in webbrowser. Text1 Text2 Text3 Why doesn't the `<h:outputText>` break `\n` into new lines? What should I do? Do I have to replace `\n` with `<br />`?