Sto utilizzando tag JSP per incapsulare la logica front-end riutilizzabile.Passa un elenco generico a un tag JSP
Posso passare correttamente un oggetto complesso com.example.Product
a un tag, ma ho problemi a passare un List<Product>
a un tag.
Ecco il mio product.tag
:
<%@ attribute name="product" required="true" type="com.example.Product" %>
<a href="/products/${product.id}/${product.slug}">${product.name}</a>
posso usare questo su una pagina JSP in questo modo:
<%@ taglib tagdir="/WEB-INF/tags" prefix="h" %>
<h:product product="${myProduct}"/>
Ora, vorrei creare un tag per visualizzare un elenco di prodotti. Sono bloccato su come descrivere il tipo nella dichiarazione di attributo:
<%@ 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>
Ho provato la seguente:
List<com.example.Product>
java.util.List<com.example.Product>
Sia cedere il seguente errore: Unknown attribute type (java.util.List<com.example.Product>) for attribute products
I ' Sono sicuro che c'è solo qualche sintassi su come descrivere un tipo generico nella direttiva attributo, ma non riesco a trovare alcun esempio.
Java Generics non esistono in fase di esecuzione. Il 'type =" java.util.List "' dovrebbe funzionare. Come fallisce esattamente? Si prega di notare che l'esempio del file di tag manca 'c' taglib che può essere presente nel vostro codice reale, ma è una falsa pista nel vostro snippet. – BalusC
@BalusC Ho aggiunto il c taglib, che avevo rimosso dal mio codice per cercare di mantenere le cose semplici. Ma hai ragione, meglio evitare ogni falsa pista. Scrivere più informazioni sull'output ora ... – Portman
Ok. Come esattamente 'type =" java.util.List "' fallisce? Dovrebbe funzionare. A meno che '$ {prodotti}' non sia un'istanza di 'java.util.List', naturalmente. Prova a rimuovere '<% @ attribute%>' o impostalo su 'type =" java.lang.Object "' e poi stampa '$ {products}' e '$ {products ['class']. Name}' solo per vedere cosa dice – BalusC