2012-03-26 82 views
13

我正在使用JSP标记来封装可重用的前端逻辑。将通用列表传递给JSP标记

我可以成功地将一个复杂对象com.example.Product传递给标记,但是我无法将List<Product>传递给标记。

这里是我的product.tag

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

我可以在JSP页面上使用像这样:

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

现在,我想创建一个标签,以显示产品列表。我被困在如何描述属性声明的类型:

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

我已经试过如下:

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

两个产生以下错误:Unknown attribute type (java.util.List<com.example.Product>) for attribute products

我' m确定只有一些语法来说明如何在属性指令中描述泛型类型,但我找不到任何示例。

+2

Java泛型在运行时不存在。 'type =“java.util.List”'应该工作。它究竟如何失败?请注意,您的代码文件示例中缺少'c' taglib,它可能出现在您的真实代码中,但在您的代码段中是一条红色鲱鱼。 – BalusC 2012-03-26 17:04:24

+0

@BalusC我添加了c taglib,我已经从代码中删除了它,以便让事情变得简单。但你是对的,最好避免任何红鲱鱼。现在写出更多关于输出的信息... – Portman 2012-03-26 21:07:16

+2

好的。 'type =“java.util.List”'究竟如何失败?它应该工作。除非'$ {products}'当然不是'java.util.List'的一个实例。尝试删除'<%@ attribute%>'或将其设置为'type =“java.lang.Object”',然后打印'$ {products}'和'$ {products ['class']。name}'看看它说什么。 – BalusC 2012-03-26 21:08:04

回答

18

您不需要指定通用类型。 type="java.util.List"必须工作。你的具体问题是其他地方引起的

1

我有同样的问题,但我意识到我发送的字符串不是实际的对象。 也许你有同样的错误。 :)

+0

阅读有关问题的评论。 – BalusC 2013-02-21 19:42:59