2012-03-26 12 views
13

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.

+2

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

+0

@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

+2

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

risposta

18

Non è necessario specificare il tipo generico. Il type="java.util.List" deve funzionare. Il tuo problema concreto è causato altrove.

1

Ho avuto lo stesso problema, ma mi sono reso conto che stavo inviando String non oggetto effettivo. Forse hai avuto lo stesso errore. :)

+0

Leggi i commenti sulla domanda. – BalusC

Problemi correlati