2012-03-26 47 views
13

Tôi đang sử dụng thẻ JSP để gói gọn logic front-end có thể tái sử dụng.Chuyển danh sách chung vào thẻ JSP

Tôi có thể chuyển thành công đối tượng phức tạp com.example.Product vào thẻ, nhưng tôi gặp sự cố khi chuyển thẻ List<Product> vào thẻ.

Đây là tôi product.tag:

<%@ attribute name="product" required="true" type="com.example.Product" %> 
<a href="/products/${product.id}/${product.slug}">${product.name}</a> 

Tôi có thể sử dụng trên một trang JSP như vậy:

<%@ taglib tagdir="/WEB-INF/tags" prefix="h" %> 
<h:product product="${myProduct}"/> 

Bây giờ, tôi muốn tạo một thẻ để hiển thị một danh sách các sản phẩm. Tôi đang mắc kẹt trên làm thế nào để mô tả loại trong khai báo thuộc tính:

<%@ attribute name="products" required="true" type="???" %> 
<%@ taglib tagdir="/WEB-INF/tags" prefix="h" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
<ul> 
<c:forEach items="${products}" var="product"> 
    <li><h:product product="${product}"/></li> 
</c:forEach> 
</ul> 

Tôi đã thử những điều sau đây:

  • List<com.example.Product>
  • java.util.List<com.example.Product>

Cả hai mang lại sau lỗi: Unknown attribute type (java.util.List<com.example.Product>) for attribute products

Tôi ' m chắc chắn chỉ có một số cú pháp cho cách mô tả một loại chung trong chỉ thị thuộc tính, nhưng tôi không thể tìm thấy bất kỳ ví dụ nào.

+2

Java Generics không tồn tại trong thời gian chạy. 'Type =" java.util.List "' sẽ hoạt động. Chính xác thì nó thất bại như thế nào? Xin lưu ý rằng ví dụ về tệp thẻ của bạn thiếu thẻ 'c' taglib có thể có trong mã thực của bạn, nhưng là một trích dẫn màu đỏ trong đoạn mã của bạn. – BalusC

+0

@BalusC Tôi đã thêm thẻ taglib c mà tôi đã xóa khỏi mã của mình để cố giữ mọi thứ đơn giản. Nhưng bạn đúng, tốt nhất để tránh bất kỳ herrings đỏ. Viết thêm thông tin về đầu ra ngay bây giờ ... – Portman

+2

OK. Làm thế nào chính xác 'loại =" java.util.List "' thất bại? Nó sẽ hoạt động. Trừ khi '$ {products}' không phải là một thể hiện của 'java.util.List'. Hãy thử xóa '<% @ attribute%>' hoặc đặt nó thành 'type =" java.lang.Object "' và sau đó in '$ {products}' và '$ {products ['class']. Name}' để xem những gì nó nói. – BalusC

Trả lời

18

Bạn không cần chỉ định loại chung. type="java.util.List" phải hoạt động. Vấn đề cụ thể của bạn được gây ra ở nơi khác.

1

Tôi đã có cùng một vấn đề, nhưng tôi nhận ra rằng tôi đã gửi String không phải đối tượng thực tế. Có thể bạn đã nhầm lẫn. :)

+0

Đọc nhận xét về câu hỏi. – BalusC