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).

Другие вопросы по тегам