JSP EL: динамическое создание имени свойства
Я пытаюсь динамически генерировать контент с использованием JSP.
у меня есть <c:forEach>
цикл, в котором я динамически создаю бин-аксессоры. Скелет похож на это:
<c:forEach var="type" items="${bean.positionTypes}">
${bean.table} // append 'type' to the "table" property
</c:forEach>
Моя проблема: я хочу изменить ${bean.table}
на основе типа. Например, если типы были {"Janitor", "Chef}
Я хочу произвести:
${bean.tableJanitor}
${bean.tableChef}
Как мне этого добиться?
2 ответа
Решение
Вы можете использовать обозначение скобки []
для доступа к свойствам бина с помощью динамического ключа.
${bean[property]}
Итак, основываясь на вашем примере:
<c:forEach var="type" items="${bean.positionTypes}">
<c:set var="property" value="table${type}" />
${bean[property]}
</c:forEach>
Если вам нужен динамический доступ к сложному полю, вы можете сделать это:
<h:outputText value="#{someOtherBean.invokeELGetter('#{bean.'.concat('someProperty.field').concat('}'))}" />
И внедрите invokeELGetter в свой класс 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);
}
Обратите внимание, что для этого требуется EL 2.2 (Tomcat 7 для тех, кто использует Tomcat).