Jsp Tomcat6.0不允许将通用ArrayList用于useBean

Jsp Tomcat6.0不允许将通用ArrayList用于useBean,jsp,tomcat,generic-list,usebean,Jsp,Tomcat,Generic List,Usebean,在jsp文件中,我有以下声明: <jsp:useBean scope="request" id="products" class="java.util.ArrayList<sgt.supermarket.entity.Product>"/> 此声明适用于GlassFish 2.1,但是,当我切换到Tomcat 6.0时,会抛出异常: useBean类属性java.util.ArrayList的值无效 Tomcat是否缺少任何使其行为不同于Glass Fish 2.1

在jsp文件中,我有以下声明:

<jsp:useBean scope="request" id="products" class="java.util.ArrayList<sgt.supermarket.entity.Product>"/>

此声明适用于GlassFish 2.1,但是,当我切换到Tomcat 6.0时,会抛出异常:

useBean类属性java.util.ArrayList的值无效


Tomcat是否缺少任何使其行为不同于Glass Fish 2.1的库?

EL不知道参数化类型,因此不需要这样做。在JSP/EL中,绝对没有编译时检查。EL更多地基于反射。然而,我有点惊讶它在Glassfish中“起作用”,因为它没有在JSP/EL规范中指定

除此之外,在一个像样的MVC应用程序中,
jsp:useBean
是相当多余的,在这个应用程序中,
Servlet
被用来控制和预处理请求

List<Product> procucts = productDAO.list();
request.setAttribute("products", products);
request.getRequestDispatcher("products.jsp").forward(request, response);
List-proccts=productDAO.List();
请求.setAttribute(“产品”,产品);
getRequestDispatcher(“products.jsp”).forward(请求、响应);

products
现在可以通过
${products}
在EL中访问。无需使用
jsp:useBean

如果您处理的是遗留代码,只想消除所有原始类型的jsp警告,那么您可能需要用以下代码替换您的代码行:

<% request.setAttribute("products", 
       new java.util.ArrayList<sgt.supermarket.entity.Product>()); %>


但是BalusC仍然是正确的:当您使用经典的MVC模式时,最好在控制器中而不是视图中创建此产品列表。如果您使用的是视图优先模式,那么我建议您编写自己的JSP标记,用干净的Java代码创建并填充此产品列表。

为什么您首先需要泛型?我是.NET开发人员,所以我更喜欢强类型类。这不是一个很好的实践,因为它允许编译时错误检测吗?在真正的Java类中,是的,但在JSP文件中没有必要。哦,看起来我在使用旧的东西。我尝试了你的建议,现在我的代码看起来更干净了。谢谢。不过,有了这段代码,在我看来,在编译时(例如,当您更改bean属性名称时)不可能检测到错误。而且,重构永远不会起作用。当我使用ASP.NET时,我非常关心这些问题。您多久会更改一次名称?重构与其说是语言问题,不如说是工具问题。@BalusC说得对,但在编译时通常不知道类型,这不会给工具留下太多建议。有了Intellij,我能得到正确重构的唯一方法就是使用jsp:useBean和EL表达式。@Jeremy:如前所述,这更像是一个工具问题。我对Eclipse+JBoss工具没有任何问题。