2012-03-26 14 views
13

Używam znaczników JSP do enkapsulacji logiki front-end wielokrotnego użytku.Przekazywanie ogólnej listy do znacznika JSP

Mogę pomyślnie przekazać obiekt złożony com.example.Product do tagu, ale mam problem z przekazaniem do tagu List<Product>.

Oto mój product.tag:

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

mogę użyć tego na stronie JSP tak:

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

Teraz chciałbym utworzyć znacznik, aby wyświetlić listę produktów. Utknąłem w jaki sposób opisać typ w deklaracji atrybutu:

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

próbowałem następujące:

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

Zarówno uzyskując następujące błąd: Unknown attribute type (java.util.List<com.example.Product>) for attribute products

I ' Na pewno jest jakaś składnia opisująca rodzajowy typ w dyrektywie atrybutów, ale nie mogę znaleźć żadnych przykładów.

+2

Java Generics nie istnieje w czasie wykonywania. Powinien działać 'type =" java.util.List "'. Jak dokładnie to się nie udaje? Zwróć uwagę, że w twoim pliku z tagami brakuje 'c' taglib, które może być obecne w twoim prawdziwym kodzie, ale jest czerwonym śledziem w twoim fragmencie. – BalusC

+0

@BalusC Dodałem c taglib, który usunąłem z mojego kodu, aby zachować prostotę. Ale masz rację, najlepiej, aby uniknąć czerwonych śledzi. Zapisywanie więcej informacji na temat wyjścia teraz ... – Portman

+2

OK. Jak dokładnie kończy się 'type =" java.util.List "'? Powinno działać. O ile '$ {products}' nie jest instancją 'java.util.List' oczywiście. Spróbuj usunąć '<% @ atrybut%>' lub ustaw go na 'type =" java.lang.Object ", a następnie wydrukuj' $ {products} 'i' $ {products ['class']. Name} 'just aby zobaczyć, co mówi. – BalusC

Odpowiedz

18

Nie trzeba określać rodzaju ogólnego. type="java.util.List" musi działać. Twój konkretny problem jest spowodowany gdzie indziej.

1

Miałem ten sam problem, ale zdałem sobie sprawę, że wysyłałem String, a nie rzeczywisty obiekt. Może miałeś ten sam błąd. :)

+0

Przeczytaj komentarze na temat tego pytania. – BalusC

Powiązane problemy