关于空间的JSF问题

时间:2011-09-27 07:06:47

标签: jsf

我是JSF的绿鸟,现在我对它的文字感到困惑。

当我使用多空格分配outputText的值时,IE中显示的结果只有一个空格。

例如:代码就像

<h:outputText id="name" value="aa (multi-spaces here)  bbb" ></h:outputText>

IE中显示的结果文本是“aa bbb”

谁能告诉我为什么这些空间会消失而没有痕迹?

1 个答案:

答案 0 :(得分:2)

此行为由HTML规范定义:

  

对于除PRE之外的所有HTML元素,空格序列将“单词”分开(我们在这里使用术语“单词”表示“非空白字符序列”)。格式化文本时,用户代理应根据特定书面语言(脚本)和目标媒体的惯例识别这些单词并将其排列。

请注意,如果您使用的是XHTML,则处理attributescode point U+000C的方式会有所不同。

对于大多数文本,空格序列与单个空格的呈现方式不同。


由于这是针对outputText控制的,因此您可以将单向转换器用于不间断空间解决方案:

package myconverters;
// imports

public class SpacePreserver implements Converter {
  private static final char NO_BREAK_SPACE = '\u00A0';

  public String getAsString(FacesContext context, UIComponent component,
      Object value) {
    if (component instanceof EditableValueHolder) {
      throw new IllegalArgumentException(
          "Cannot use SpacePreserver converter on editable controls.");
    }
    return value == null ? null : value.toString().replace(' ', NO_BREAK_SPACE);
  }

  public Object getAsObject(FacesContext context, UIComponent component,
      String value) {
    throw new UnsupportedOperationException("Output converter only");
  }
}

这可以使用faces-config.xml条目(以及其他方式)定义:

<converter>
  <converter-id>spacePreserver</converter-id>
  <converter-class>myconverters.SpacePreserver</converter-class>
</converter>

然后,您可以将其添加到输出控件:

<h:outputText id="text1" value="a   b c" converter="spacePreserver" />

此代码使用JSF 1.1和UTF-8编码的JSP 2.0视图进行了测试。请注意,使用不间断空格将禁止换行。