Это поведение определяется спецификацией HTML:
Для всех элементов HTML, кроме PRE
, последовательности пробелов разделяют «слова» (здесь мы используем термин «слово» для обозначения «последовательностей непробельных символов»). При форматировании текста пользовательские агенты должны идентифицировать эти слова и размещать их в соответствии с соглашениями конкретного письменного языка (сценария) и целевого носителя.
Обратите внимание, что при использовании XHTML есть некоторые различия в способах обработки атрибутов и кодовой точки 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");
}
}
Это может быть определено (среди прочих способов) с помощью записи Face-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 и представления JSP 2.0 в кодировке UTF-8. Обратите внимание, что использование пробела без перерывов запрещает перенос строк.