2010-09-15 156 views
6

我想用JSP動態生成內容。JSP EL:動態創建屬性名稱

我有一個<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} 

我怎樣才能做到這一點?

回答

11

您可以使用大括號[]來使用動態密鑰訪問bean屬性。

${bean[property]} 

所以,根據你的例子:

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

謝謝。這確實有效。 – bulk 2010-09-15 21:52:52

+1

這適用於財產。那麼屬性內部的屬性(即bean.someProperty.someField)呢?我確實設法解決了這個問題,但我不確定我的解決方案是否遵循最佳實踐。 @BalusC是我的解決方案(請參閱下面的答案)好嗎還是有最佳方法來做到這一點? – Andre 2012-08-20 14:15:24

0

如果您需要訪問一個動態的方式一個複雜的領域,你可以這樣做:

<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的用戶)。