2012-03-26 17 views
13

Estoy usando etiquetas JSP para encapsular la lógica de front-end reutilizable.Pasar una lista genérica a una etiqueta JSP

Puedo pasar con éxito un objeto complejo com.example.Product a una etiqueta, pero tengo problemas para pasar una List<Product> a una etiqueta.

Aquí es mi product.tag:

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

puedo usar esto en una página JSP, así:

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

Ahora, me gustaría crear una etiqueta para mostrar una lista de los productos. Estoy atascado en la forma de describir el tipo de atributo en la declaración:

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

He intentado lo siguiente:

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

tanto el rendimiento como la siguiente error: Unknown attribute type (java.util.List<com.example.Product>) for attribute products

I ' Estoy seguro de que hay solo una sintaxis sobre cómo describir un tipo genérico en la directiva de atributos, pero no puedo encontrar ningún ejemplo.

+2

Los genéricos de Java no existen en el tiempo de ejecución. El 'type =" java.util.List "' debería funcionar. ¿Cómo exactamente falla? Tenga en cuenta que su ejemplo de archivo de etiqueta falta 'c' taglib, que puede estar presente en su código real, pero es una pista falsa en su fragmento. – BalusC

+0

@BalusC Agregué el c taglib, que había eliminado de mi código para tratar de mantener las cosas simples. Pero tienes razón, lo mejor es evitar las pistas falsas. Escribir más información sobre la salida ahora ... – Portman

+2

Bien. ¿Cómo falla exactamente 'type =" java.util.List "'? Deberia de funcionar. A menos que '$ {products}' no sea una instancia de 'java.util.List' por supuesto. Intente eliminar el atributo '<% @ attribute%>' o configúrelo en 'type =" java.lang.Object "' y luego imprima '$ {products}' y '$ {products ['class']. Name}' just para ver lo que dice – BalusC

Respuesta

18

No es necesario que especifique el tipo genérico. El type="java.util.List" debe funcionar. Su problema concreto es causado en otra parte.

1

Tuve el mismo problema, pero me di cuenta de que estaba enviando String no objeto real. Quizás tuviste el mismo error. :)

+0

Lea los comentarios sobre la pregunta. – BalusC

Cuestiones relacionadas