Как установить значение HtmlOutputTag в JSF?
Вопрос
Я хочу динамически создавать элементы управления в своем компоненте.Я использую JSF 2.0
HtmlOutputTag objHtmlOutputTag = new HtmlOutputTag();
Какое же свойство HtmlOutputTag
я должен установить, чтобы установить содержимое HtmlOutputTag
?
Решение
Тем HtmlOutputTag
представляет тег, а не компонент.Скорее используйте HtmlOutputText
.Затем вы можете просто установить value
свойство точно так же, как вы бы это сделали в реальном компоненте на странице JSF.Если вам нужно, чтобы это было ValueExpression
а не сырой value
, то вам нужно создать его, используя ExpressionFactory#createValueExpression()
.Вот пример начала:
HtmlOutputText text = new HtmlOutputText();
text.setValueExpression("value", createValueExpression("#{bean.property}", String.class));
где удобный метод createValueExpression()
здесь выглядит так:
private static ValueExpression createValueExpression(String valueExpression, Class<?> valueType) {
FacesContext context = FacesContext.getCurrentInstance();
return context.getApplication().getExpressionFactory()
.createValueExpression(context.getELContext(), valueExpression, valueType);
}
спрячьте его подальше в какой-нибудь служебный класс, чтобы вам не приходилось повторять весь этот код снова и снова ;) valueType
аргумент, очевидно, должен представлять фактический тип свойства.
Окончательный результат на странице JSF должен выглядеть следующим образом:
<h:outputText value="#{bean.property}" />
Тем не менее, в зависимости от функциональных требований действительно могут существовать лучшие и более простые способы решения функциональных требований.Если хотите, вы можете рассказать об этом немного подробнее, чтобы мы могли при необходимости предложить лучшие способы.
Другие советы
Как обычный, я бы посоветовал не добавлять/удалять компонент динамически.Решите проблему другим способом:
- Переключать видимость компонентов
- Перевяжите данные принадлежность к компоненту
Динамическое добавление/удаление компонента всегда является источником проблем, и есть вероятность, что вы можете сделать это другим, гораздо более простым способом.
Тем outputText
компонент прост в использовании:
<h:outputText value="#{BackingBean.myProperty}"/>
И вы определяете геттер/сеттер для myProperty
в вашем бэк-компоненте.Если вы действительно хотите сделать это программно (что я не рекомендую, если у вас нет веских аргументов), вот пример с динамической таблицей.