2012-09-13 39 views
7

Tôi đang cố gắng làm điều gì đó có vẻ tương đối đơn giản và chạy vào một bức tường.Biểu thức JSP và Tên thuộc tính động

Giả sử tôi có danh sách sản phẩm mà tôi trưng ra dưới dạng thuộc tính yêu cầu dưới tên products. Cũng hãy nói rằng mỗi sản phẩm có một trường id và tôi cũng có một loạt các thuộc tính yêu cầu được đặt ở dạng selectedProduct_<product-id> để chỉ ra những sản phẩm nào được chọn.

Tôi hiểu có những cách tốt hơn để thể hiện thông tin này, chẳng hạn như đặt tất cả các id đã chọn vào Map và kiểm tra điều đó, nhưng hãy giả sử rằng tôi không có quyền truy cập vào phương pháp đó vì bất kỳ lý do gì.

Vì vậy, điều tôi muốn làm là lặp lại products và chỉ phát ra một số đánh dấu nếu có thuộc tính selectedProduct_... được đặt cho sản phẩm hiện tại. Một cái gì đó như:

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

Nhưng tất nhiên điều đó không hiệu quả, khi nó chết trên ${! empty selectedProduct_${product.id}}.

gì sẽ làm việc là nếu tôi hardcode sản phẩm-id vào biểu hiện, như:

${! empty selectedProduct_17}

... giả định rằng '17' là một id sản phẩm hợp lệ. Rõ ràng đó là không thực tế, nhưng hy vọng nó minh họa những gì tôi đang cố gắng để thực hiện. Về cơ bản, tôi cần phải:

  1. Xác định giá trị selectedProduct_... chính xác để sử dụng cho mỗi lần lặp trong vòng lặp forEach. Một cái gì đó đơn giản như <c:set var="key" value="selectedProduct_${product.id}"/> sẽ làm điều này, ngoại trừ tôi không chắc chắn làm thế nào để sau đó mất key và sử dụng nó để có được giá trị của thuộc tính yêu cầu với tên đó (không gian lận và chạy mã Java chữ bên trong một khối <% %>).
  2. Lấy giá trị của thuộc tính yêu cầu có tên tôi đã xác định trong # 1. Đây có vẻ là một phần khó khăn.

Có thể sử dụng JSP/JSTL tinh khiết không? Tôi biết tôi có thể chạy một số mã Java bên trong của <% %> để giải quyết điều này, nhưng điều đó có vẻ như nó sẽ ở dạng cực kỳ xấu. Chắc chắn một giải pháp thanh lịch hơn tồn tại?

Trả lời

17

Bạn có thể bằng cách sử dụng implicit objects:

Có đối tượng cho phép truy cập vào các biến có phạm vi khác nhau được mô tả trong Sử dụng Phạm vi đối tượng.

  • PAGESCOPE: Maps trang-scoped tên biến để giá trị của họ
  • requestScope: Maps yêu cầu đặt phạm vi tên biến để giá trị của họ
  • sessionScope: Maps phạm vi phiên tên biến để giá trị của họ
  • applicationScope: Maps dành cho ứng dụng tên biến có phạm vi cho các giá trị của chúng
Khi một biểu thức tham chiếu một trong các đối tượng này theo tên, đối tượng thích hợp được trả về thay vì thuộc tính tương ứng. Ví dụ, $ {pageContext} trả về đối tượng PageContext, ngay cả khi có một thuộc tính pageContext hiện có chứa một số giá trị khác.

Vì vậy, ví dụ:

<c:set var="selectedProductAttrName" value="selectedProduct_${product.id}"/> 
${requestScope[selectedProductAttrName]} 
Các vấn đề liên quan