【问题标题】:JSP EL: dynamic creation of property name [duplicate]JSP EL:动态创建属性名称
【发布时间】:2010-09-15 21:10:20
【问题描述】:

我正在尝试使用 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}

我怎样才能做到这一点?

【问题讨论】:

    标签: java jsp el


    【解决方案1】:

    您可以使用大括号符号[] 通过动态键访问 bean 属性。

    ${bean[property]}
    

    所以,根据你的例子:

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

    【讨论】:

    • 谢谢。这确实有效。
    • 这适用于属性。属性中的属性(即 bean.someProperty.someField)呢?我确实设法让它发挥作用,但我不确定我的解决方案是否遵循最佳实践。 @BalusC 是我的解决方案(请参阅下面的答案),还是有最好的方法来做到这一点?
    【解决方案2】:

    如果您需要以动态方式访问复杂字段,您可以这样做:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      • 2013-07-23
      • 2012-05-16
      相关资源
      最近更新 更多