JSF转换器未显示转换值

时间:2013-05-10 11:41:16

标签: internet-explorer jsf jsf-2

我正在使用internet-explorer 8和jsf。 我制作了我的自定义转换器,在两个空格后添加“\ n”(打破太长的字符串)。正在调用转换器并返回正确的值(我用调试器检查它),但不幸的是,这个正确的值没有显示在页面上。这是xhtml代码:

<h:commandLink action="#{bean.sort(property)}"
                    style="margin-left:0.01px;margin-right:0.01px;white-space:nowrap;">
                    <h:outputText value="#{header}">
                      <f:converter converterId="headerConverter" />
                    </h:outputText>
</h:commandLink>

转换器代码:

public class HeaderConverter implements Converter {

public HeaderConverter() {
}

public Object getAsObject(FacesContext context, UIComponent component, String value) {
    /* Converter tylko do wyświetlania */
    throw new RuntimeException("HeaderConverter - display only");
}

public String getAsString(FacesContext context, UIComponent component, Object value) {
    if (value instanceof String) {

        int i = 0;
        int spaceIter = 0;
        String header = (String) value;
        String afterChange = header;

        for (char c : header.toCharArray()) {
            if (Character.isWhitespace(c)) {
               spaceIter++;
               if(spaceIter == 2) {
                   afterChange = "" + header.substring(0, i) + "\n" + header.substring(i+1);
               }
            }
            i++;
        }
        return afterChange;
    }
    return null;
}

} 当然,我已经在faces-config.xml上修改了所有内容 提前感谢您的所有努力。

1 个答案:

答案 0 :(得分:2)

JSF在这个问题的上下文中只是一个HTML代码生成器。在HTML中,换行符由<br>元素表示,而不是由\n字符表示。

如果您右键单击webbrowser中的页面并执行查看源,那么您将看到\n实际上已将其添加到生成的HTML输出中,但是根本没有参与HTML演示文稿/格式化。

所以,你有两个选择:

  1. 使用<br>代替\n

    ... + "<br/>" + ...
    

    您只需要关闭XML转义。

    <h:outputText ... escape="false" />
    

    当您重新显示用户控制的输入时,请注意潜在的XSS攻击漏洞!

  2. 指示webbrowser将\n解释为格式化的一部分而不是标记(默认情况下)。您可以使用CSS white-space: pre

    style="white-space: pre;"