【问题标题】:Pass a generic List to a JSP tag将通用列表传递给 JSP 标记
【发布时间】:2012-03-26 16:55:24
【问题描述】:

我正在使用 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&lt;com.example.Product&gt;
  • java.util.List&lt;com.example.Product&gt;

两者都产生以下错误:Unknown attribute type (java.util.List&lt;com.example.Product&gt;) for attribute products

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

【问题讨论】:

  • Java 泛型在运行时不存在。 type="java.util.List" 应该可以工作。它究竟是如何失败的?请注意,您的标记文件示例缺少c taglib,它可能存在于您的真实代码中,但在您的 sn-p 中是一个红鲱鱼。
  • @BalusC 我添加了 c 标签库,我已将其从代码中删除以保持简单。但你是对的,最好避免任何红鲱鱼。现在就输出更多信息...
  • 好的。 type="java.util.List" 究竟是如何失败的?它应该工作。当然,除非${products} 不是java.util.List 的实例。尝试删除&lt;%@attribute%&gt; 或将其设置为type="java.lang.Object",然后打印${products}${products['class'].name} 以查看其内容。
  • 没关系。有时,除非我等待几秒钟,否则我的本地 Tomcat 实例不会获取对 JSP 的更改。 java.util.List 确实有效。您可以添加一个答案以便我标记它吗?

标签: java jsp


【解决方案1】:

您不需要指定泛型类型。 type="java.util.List" 必须有效。您的具体问题是由其他地方引起的。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 阅读有关问题的 cmets。
    猜你喜欢
    • 2010-09-09
    • 1970-01-01
    • 2011-09-12
    • 2012-04-18
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多