题 将通用List传递给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

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


13
2018-03-26 16:55


起源


Java Generics在运行时不存在。该 type="java.util.List" 应该管用。它到底是怎么失败的?请注意,您的标记文件示例已丢失 c taglib可能存在于您的真实代码中,但在您的代码段中是一个红色的鲱鱼。 - BalusC
@BalusC我添加了c taglib,我从代码中删除了c taglib以试图保持简单。但你是对的,最好避免任何红色鲱鱼。现在在输出上写下更多信息...... - Portman
好的。究竟是怎么做的 type="java.util.List" 失败?它应该工作。除非 ${products} 不是一个实例 java.util.List 当然。尝试删除 <%@attribute%> 或设置为 type="java.lang.Object" 然后打印 ${products} 和 ${products['class'].name} 只是为了看看它说的是什么。 - BalusC
没关系。有时我的本地Tomcat实例不会接受对JSP的更改,除非我等待几秒钟。 java.util.List 确实有效。你能加一个答案,我可以标记吗? - Portman


答案:


您不需要指定泛型类型。该 type="java.util.List" 必须工作。你的具体问题是由其他地方造成


18
2018-03-27 00:04





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


1
2018-02-21 19:27



阅读有关该问题的评论。 - BalusC