我是JSF的绿鸟,现在我对它的文字感到困惑。
当我使用多空格分配outputText的值时,IE中显示的结果只有一个空格。
例如:代码就像
<h:outputText id="name" value="aa (multi-spaces here) bbb" ></h:outputText>
IE中显示的结果文本是“aa bbb”
谁能告诉我为什么这些空间会消失而没有痕迹?
答案 0 :(得分:2)
此行为由HTML规范定义:
对于除
PRE
之外的所有HTML元素,空格序列将“单词”分开(我们在这里使用术语“单词”表示“非空白字符序列”)。格式化文本时,用户代理应根据特定书面语言(脚本)和目标媒体的惯例识别这些单词并将其排列。
请注意,如果您使用的是XHTML,则处理attributes和code 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视图进行了测试。请注意,使用不间断空格将禁止换行。