2010-09-15 12 views
6

Estoy intentando generar dinámicamente contenido utilizando JSP.JSP EL: creación dinámica del nombre de propiedad

Tengo un bucle <c:forEach> dentro del cual creo dinámicamente accesores de bean. El esqueleto se parece a esto:

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

Mi problema es: Quiero cambiar el ${bean.table} en función del tipo. Por ejemplo, si los tipos eran {"Janitor", "Chef}, quiero producir:

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

¿Cómo puedo lograr esto?

Respuesta

11

Puede usar la notación de llaves [] para acceder a las propiedades del frijol usando una llave dinámica.

${bean[property]} 

Así, en función de su ejemplo:

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

Gracias. Esto de hecho funciona – bulk

+1

Esto funciona para una propiedad. ¿Qué ocurre con una propiedad dentro de una propiedad (es decir, bean.someProperty.someField)? Logré hacer que funcionara, pero no estoy seguro de si mi solución sigue las mejores prácticas. @BalusC es mi solución (ver mi respuesta a continuación) ¿está bien o hay una mejor manera de hacer esto? – Andre

0

Si necesita acceder a un campo complejo de una manera dinámica, usted puede hacer esto:

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

y aplicar el invokeELGetter en su clase 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); 
} 

Tenga en cuenta que esto requiere EL 2.2 (Tomcat 7 para quienes usan Tomcat).

Cuestiones relacionadas