2010-09-15 43 views
6

Tôi đang cố gắng tạo động nội dung bằng cách sử dụng JSP.JSP EL: tạo động của tên thuộc tính

Tôi có vòng lặp <c:forEach> trong đó tôi tạo động truy cập bean. Bộ xương giống như sau:

<c:forEach var="type" items="${bean.positionTypes}"> 
    ${bean.table} // append 'type' to the "table" property 
</c:forEach> 

Vấn đề của tôi là: Tôi muốn thay đổi ${bean.table} dựa trên loại. Ví dụ: nếu các loại là {"Janitor", "Chef}, tôi muốn sản xuất:

${bean.tableJanitor} 
${bean.tableChef} 

Làm cách nào để đạt được điều này?

Trả lời

11

Bạn có thể sử dụng ký hiệu cú đúp [] để truy cập các thuộc tính bean bằng cách sử dụng khóa động.

${bean[property]} 

Vì vậy, dựa trên ví dụ của bạn:

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

Cảm ơn bạn. Điều này thực sự làm việc. – bulk

+1

Điều này làm việc cho một tài sản. Điều gì về một thuộc tính bên trong một thuộc tính (ví dụ: bean.someProperty.someField)? Tôi đã cố gắng để có được điều đó để làm việc, nhưng tôi không chắc chắn nếu giải pháp của tôi sau các thực hành tốt nhất. @ BalusC là giải pháp của tôi (xem câu trả lời của tôi dưới đây) alright hoặc là có một cách tốt nhất để làm điều này? – Andre

0

Nếu bạn cần truy cập vào một lĩnh vực phức tạp một cách năng động, bạn có thể làm điều này:

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

Và thực hiện invokeELGetter trong lớp SomeOtherBean của bạn:

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); 
} 

Lưu ý rằng điều này đòi hỏi EL 2.2 (Tomcat 7 cho những người sử dụng Tomcat).

Các vấn đề liên quan