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.
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
@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
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