JSF équivalent nl2br
Ou comment résoudre ce problème très simple :
On a une saisie TextField ou les gens peuvent aller a la ligne ... à la fin on veut un résumé text ... les "à la ligne" sont supprimés ! fichtre !
On va passer par un Converter, et faire quelque chose qui ressemble à ça :
<html:outputText value="monBean.maProp" convertor="nl2br" escape="false" />Voila le but c'est aussi que di on a du html dans maProp, qu'il soit encore escaped (c'est a dire que les < soit convertir en < et ainsi de suite !)
Dans un premier temps définissons notre Converter :
public class Nl2BrConverter implements Converter { private Logger log = Logger.getLogger(getClass()); public Object getAsObject(FacesContext context, UIComponent component, String value) { // pour la forme ... il ne sera jamais utilisé ! return StringHelper.replace(value, "<br />", "\n", true); } public String getAsString(FacesContext context, UIComponent component, Object value) { try { String v = (String) value; StringWriter writer = new StringWriter(); HtmlUtils.writeText(writer, new char[v.length()], v); return StringHelper.implode(StringHelper.explode(writer.getBuffer().toString(), '\n'), "<br />"); } catch (IOException e) { log.error(e,e); } return (String)value; } }
On passe par le HtmlUtils (de l'implémentation ibm de la JSF je sais pas s'il est présent dans les autres) et comme ce truc demande un Writer on lui en file un qui peut nous servir par après =)
Je file quand même les fonctions implode et explode :
public static String implode(String[] array, String glue) { StringBuffer result = new StringBuffer(""); for (int i = 0; i < array.length; i++) { result.append(array[i]); if (i < array.length - 1) { result.append(glue); } } return result.toString(); } public static String[] explode(String toSplit, char by) { ArrayList l = new ArrayList(); int lastPos = 0; for (int i = 0; i < toSplit.length(); i++) { if (toSplit.charAt(i) == by) { if (lastPos == i) { l.add(null); lastPos++; } else { l.add(toSplit.substring(lastPos,i)); lastPos = i+1; } } } if (!toSplit.endsWith(""+by)) { l.add(toSplit.substring(lastPos)); } return (String[])l.toArray(new String[l.size()]); }
Qui sont assez pratique en ce qui concerne les parse de fichier csv =) (puisque la fonction split n'est pas tout a fait exacte !)
Voila pour utiliser ça il suffit de faire une déclaration dans notre faces-config.xml comme ceci :
<converter> <converter-id>nl2br</converter-id> <converter-class> lu.seb.gui.jsf.converters.Nl2BrConverter </converter-class> </converter>
Et voili ! Un peu complexe a mettre en place mais relativement facile a utiliser !

Comments
voici le code de mon converter : beaucoup plus simple et qui ne necessite aucune librairie comme HtmlUtils :
public class Nl2BrConverter implements Converter {
private Logger log = Logger.getLogger(getClass());
public Object getAsObject(FacesContext context, UIComponent component, String value) {
// pour la forme ... il ne sera jamais utilisé !
// return StringHelper.replace(value, "<br />", "\n", true);
return "";
}
public String getAsString(FacesContext context, UIComponent component, Object value) {
String v = (String) value;
return v.replaceAll("\n","<br />");
}
L'enorme avantage est que ce converter accepte et le code html tel que:
<H1> titre 1 </H1>
en entree par l'utilisateur via inputTextArea produira via <h:outputText converter="..." escape="false"</> un texte en titre.