2010-09-15 7 views
6

Je tente de générer dynamiquement du contenu à l'aide de JSP.JSP EL: création dynamique du nom de propriété

J'ai une boucle <c:forEach> dans laquelle je crée dynamiquement des accesseurs de bean. Le squelette ressemble à ceci:

<c:forEach var="type" items="${bean.positionTypes}"> 
    ${bean.table} // append 'type' to the "table" property 
</c:forEach> 

Mon problème est: Je veux changer le ${bean.table} en fonction du type. Par exemple, si les types étaient {"Janitor", "Chef}, je veux produire:

${bean.tableJanitor} 
${bean.tableChef} 

Comment puis-je y parvenir?

Répondre

11

Vous pouvez utiliser la notation d'accolade [] pour accéder aux propriétés du bean à l'aide d'une clé dynamique.

${bean[property]} 

Ainsi, en fonction de votre exemple:

<c:forEach var="type" items="${bean.positionTypes}"> 
    <c:set var="property" value="table${type}" /> 
    ${bean[property]} 
</c:forEach> 
+0

Merci. Cela fonctionne en effet. – bulk

+1

Cela fonctionne pour une propriété. Qu'en est-il d'une propriété à l'intérieur d'une propriété (par exemple, bean.someProperty.someField)? J'ai réussi à le faire fonctionner, mais je ne suis pas sûr que ma solution suive les meilleures pratiques. @BalusC est ma solution (voir ma réponse ci-dessous) ou est-il une meilleure façon de le faire? – Andre

0

Si vous avez besoin d'accéder à un champ complexe d'une manière dynamique, vous pouvez le faire:

<h:outputText value="#{someOtherBean.invokeELGetter('#{bean.'.concat('someProperty.field').concat('}'))}" /> 

et mettre en œuvre la invokeELGetter dans votre classe SomeOtherBean:

public Object invokeELGetter(String el) { 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    ELContext elContext = facesContext.getELContext(); 
    ExpressionFactory expressionFactory = facesContext.getApplication().getExpressionFactory(); 
    ValueExpression exp = expressionFactory.createValueExpression(elContext, el, Object.class); 
    return exp.getValue(elContext); 
} 

Notez que cela nécessite EL 2.2 (Tomcat 7 pour ceux qui utilisent Tomcat).

Questions connexes