2012-09-13 66 views
7

我正在嘗試做一些看起來應該相對簡單的事情,並且運行到一堵牆上。JSP表達式和動態屬性名稱

比方說,我有一個產品清單,我以products的名稱公開爲請求屬性。我們還要說,每個產品都有一個id字段,並且我還有一組以selectedProduct_<product-id>的形式設置的請求屬性,以指示哪些字段被選中。

我知道有更好的方法來表示這些信息,比如將所有選中的ID都放入Map並檢查,但是讓我們假設我無論如何都無法使用這種方法。

所以我想要做的是迭代products併發出一些標記只有當有一個selectedProduct_...屬性設置爲當前產品。喜歡的東西:

<c:forEach var="product" items="${products}"> 
    <c:if test="${! empty selectedProduct_${product.id}}"> 
     <div class="productId">${product.id}</div> 
    </c:if> 
</c:forEach> 

當然,這並不工作,因爲它死在${! empty selectedProduct_${product.id}}的但是。

什麼工作是,如果我硬編碼的產品ID到表達,如:

${! empty selectedProduct_17}

...假設「17」是一個有效的產品ID。顯然這不切實際,但希望能夠說明我正在努力完成的事情。基本上我需要:

  1. 確定正確的selectedProduct_...值用在forEach循環每次迭代。像<c:set var="key" value="selectedProduct_${product.id}"/>這樣簡單的操作就可以做到這一點,除非我不確定如何取key並使用它來獲取具有該名稱的請求屬性的值(無需作弊並在<% %>塊內運行文字Java代碼)。
  2. 獲取我在#1中確定其名稱的請求屬性的值。這似乎是一個棘手的部分。

這是可能的使用純JSP/JSTL?我知道我可以在<% %>的內部運行一些Java代碼來解決這個問題,但是這看起來像是非常糟糕的形式。當然存在更優雅的解決方案?通過

回答

17

您可以使用implicit objects

有對象允許訪問使用範圍的對象所描述的各種範圍的變量。

  • 的PageScope:地圖頁面範圍的變量名稱到它們的值
  • requestScope:地圖請求範圍的變量名稱到它們的值
  • sessionScope:地圖會話範圍的變量名稱到它們的值
  • applicationScope:地圖應用程序 - 將範圍變量名稱設置爲其值
當表達式通過名稱引用這些對象之一時,將返回適當的對象而不是相應的屬性。例如,即使存在包含其他值的現有pageContext屬性,$ {pageContext}也會返回PageContext對象。

因此,舉例來說:

<c:set var="selectedProductAttrName" value="selectedProduct_${product.id}"/> 
${requestScope[selectedProductAttrName]}