Como faço para definir o valor de HtmlOutputTag em JSF?
Pergunta
Eu quero criar dinamicamente controles no meu bean. Eu estou usando JSF 2.0
HtmlOutputTag objHtmlOutputTag = new HtmlOutputTag();
Agora que a propriedade de HtmlOutputTag
devo definir para definir o conteúdo de HtmlOutputTag
?
Solução
O HtmlOutputTag
representa uma tag, não um componente. Em vez disso usar HtmlOutputText
. Em seguida, você pode apenas definir a propriedade value
, exatamente como você faria em um componente real na página JSF. Se você precisa que ele seja um ValueExpression
em vez de um value
cru, então você precisa criá-lo usando ExpressionFactory#createValueExpression()
. Aqui está um exemplo kickoff:
HtmlOutputText text = new HtmlOutputText();
text.setValueExpression("value", createValueExpression("#{bean.property}", String.class));
onde o método de conveniência createValueExpression()
aqui parecido:
private static ValueExpression createValueExpression(String valueExpression, Class<?> valueType) {
FacesContext context = FacesContext.getCurrentInstance();
return context.getApplication().getExpressionFactory()
.createValueExpression(context.getELContext(), valueExpression, valueType);
}
escondê-lo longe de alguma classe de utilitário para que você não precisa repetir tudo o que o código novo e de novo;) O argumento valueType
, obviamente, deve representar o tipo real da propriedade
O resultado final na página JSF deve então ficar assim:
<h:outputText value="#{bean.property}" />
Dito isto, dependendo da exigência funcional, não pode realmente ser melhor e formas mais limpas para resolver o requisito funcional. Se você quiser, você pode elaborar um pouco mais sobre ele para que possamos, se necessário sugerir melhores formas.
Outras dicas
- Alternar visibilidade de componentes
- religar o dados pertencente a um componente
Adicionar / remover componentes é dinamicamente sempre uma fonte de problemas e as chances são que você pode fazer isso de outra maneira muito mais simples.
O componente outputText
é fácil de usar:
<h:outputText value="#{BackingBean.myProperty}"/>
E você definir um getter / setter para myProperty
em seu bean de apoio. Se você realmente deseja fazê-lo por meio de programação (que eu desencorajar a menos que tenha argumentos fortes), aqui está um exemplo com uma tabela dinâmica.