2010-09-15 16 views
6

Próbuję dynamicznie generować zawartość za pomocą strony JSP.JSP EL: dynamiczne tworzenie nazwy właściwości

Mam pętlę <c:forEach>, w ramach której dynamicznie tworzę komponenty bean bean. Szkielet przypomina to:

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

Mój problem jest: Chcę zmienić ${bean.table} na podstawie typu. Na przykład, jeśli typy były {"Janitor", "Chef}, chcę produkować:

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

W jaki sposób można to osiągnąć?

Odpowiedz

11

Można użyć notacji nawiasów klamrowych [], aby uzyskać dostęp do właściwości komponentu bean za pomocą klucza dynamicznego.

${bean[property]} 

Więc, oparte na przykład:

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

Dziękuję. To naprawdę działa. – bulk

+1

Działa to dla właściwości. A co z właściwością wewnątrz właściwości (np. Bean.someProperty.someField)? Udało mi się to uruchomić, ale nie jestem pewien, czy moje rozwiązanie jest zgodne z najlepszymi praktykami. @BalusC jest moim rozwiązaniem (zobacz moją odpowiedź poniżej) w porządku, czy jest najlepszy sposób na zrobienie tego? – Andre

0

Jeżeli chcesz mieć dostęp do kompleksowego boiska w sposób dynamiczny, można to zrobić:

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

i wdrożenie invokeELGetter w Twojej klasie 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); 
} 

Należy zauważyć, że wymaga to EL 2.2 (Tomcat 7 dla tych, którzy używają Tomcat).

Powiązane problemy