JSP EL:动态创建属性名称

时间:2010-09-15 21:10:20

标签: java jsp el

我正在尝试使用JSP动态生成内容。

我有一个<c:forEach>循环,我在其中动态创建bean访问器。骨架类似于:

<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 个答案:

答案 0 :(得分:12)

您可以使用大括号[]来使用动态密钥访问bean属性。

${bean[property]}

所以,根据你的例子:

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

答案 1 :(得分:0)

如果您需要以动态方式访问复杂字段,则可以执行以下操作:

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

在SomeOtherBean类中实现invokeELGetter:

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的人)。