2009-12-15 4 views
3

В файле JSP у меня есть это заявление:Tomcat 6.0 не позволяет общим ArrayList использовать для useBean

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

Эта декларация отлично работает с GlassFish 2.1, однако, при переходе на Tomcat 6.0, исключение составляет throw:

Значение атрибута useBean класса java.util.ArrayList недопустимо.

Есть ли какая-либо библиотека, пропущенная для Tomcat, которая заставляет ее вести себя отличную от Glass Fish 2.1?

+0

Зачем вам вообще нужны дженерики? – Bozho

+0

Я разработчик .NET, поэтому я предпочитаю классы с сильным типом. Разве это не хорошая практика, так как позволяет компилировать-время-обнаружение ошибок? –

+0

В реальных Java-классах да, но в JSP-файлах нет необходимости. – BalusC

ответ

5

EL не знает о параметризованных типах, поэтому нет необходимости в этом. В JSP/EL нет абсолютно никаких проверок времени компиляции. EL больше основан на отражении. Тем не менее, я немного удивлен, что он «работает» в Glassfish, поскольку он не указан в спецификации JSP/EL.

Помимо всего этого, jsp:useBean является довольно излишним в приличном приложении MVC, где Servlet используется для управления и предварительной обработки запросов.

List<Product> procucts = productDAO.list(); 
request.setAttribute("products", products); 
request.getRequestDispatcher("products.jsp").forward(request, response); 

The products теперь только доступен в EL по ${products}. Нет необходимости в jsp:useBean.

+0

О, похоже, я использовал старые вещи. Я попробовал ваше предложение, и теперь мой код выглядит намного чище. Благодарю. –

+0

Однако с этим кодом мне кажется, что ошибки будут обнаружены во время компиляции (например, при изменении имени свойства компонента). Кроме того, рефакторинг никогда не будет работать. Это было то, что меня очень беспокоило, когда я работаю с ASP.NET. –

+0

Как часто вы меняете имена? Рефакторинг - скорее проблема инструмента, чем проблема языка. – BalusC

0

Если вы имеете дело с унаследованным кодом и просто хочет, чтобы избавиться от всех этих сырым типа JSP предупреждений, то вы можете заменить строку с этим одним:

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

Но BalusC по-прежнему верно: Когда вы используете классический шаблон MVC, лучше создать этот список продуктов в контроллере, а не в представлении. И если вы используете шаблон первого вида, я предлагаю написать собственный тег JSP, который создает и заполняет этот список продуктов в чистом Java-коде.