Come faccio a impostare il valore di HtmlOutputTag in JSF?
Domanda
Voglio creare dinamicamente controlli nel mio fagioli. Sto usando JSF 2.0
HtmlOutputTag objHtmlOutputTag = new HtmlOutputTag();
Ora che la proprietà di HtmlOutputTag
devo impostare per impostare il contenuto di HtmlOutputTag
?
Soluzione
Il HtmlOutputTag
rappresenta un tag, non un componente. Piuttosto utilizzare HtmlOutputText
. Quindi, si può solo impostare la proprietà value
, esattamente come si farebbe in una componente reale nella pagina JSF. Se avete bisogno di essere un ValueExpression
piuttosto che un value
grezzo, quindi è necessario creare utilizzando ExpressionFactory#createValueExpression()
. Ecco un esempio kickoff:
HtmlOutputText text = new HtmlOutputText();
text.setValueExpression("value", createValueExpression("#{bean.property}", String.class));
dove il metodo comodo createValueExpression()
qui apparire come:
private static ValueExpression createValueExpression(String valueExpression, Class<?> valueType) {
FacesContext context = FacesContext.getCurrentInstance();
return context.getApplication().getExpressionFactory()
.createValueExpression(context.getELContext(), valueExpression, valueType);
}
nasconderlo lontano in qualche classe di utilità in modo che non c'è bisogno di ripetere ancora e ancora tutto ciò che il codice;.) L'argomento valueType
ovviamente dovrebbe rappresentare il tipo effettivo della proprietà
Il risultato finale nella pagina JSF dovrebbe quindi simile a questa:
<h:outputText value="#{bean.property}" />
Detto questo, a seconda del requisito funzionale, ci possono infatti essere modi migliori e più pulite per risolvere il requisito funzionale. Se si desidera, è possibile elaborare un po 'più su di esso in modo che possiamo, se necessario, suggerire modi migliori.
Altri suggerimenti
, il mio consiglio è di non aggiungere / rimuovere componenti in modo dinamico. Risolvere il problema in un altro modo:
- Attiva visibilità dei componenti
- Rebind dati appartenente ad un componente
L'aggiunta / rimozione di componenti in modo dinamico è sempre una fonte di guai e le probabilità sono che si può fare in un altro modo molto più semplice.
Il componente outputText
è facile da usare:
<h:outputText value="#{BackingBean.myProperty}"/>
E si definisce un getter / setter per myProperty
nel backing bean. Se si vuole veramente fare a livello di codice (che ho scoraggiare se non avete argomenti forti), qui è un esempio con una tabella dinamica.