JSTL для каждой проблемы - PullRequest
1 голос
/ 10 августа 2009

У меня есть для каждого цикла, что он прекрасно работает, когда свойство items заполняется с помощью скрипта следующим образом:

<%
    List<LandingCategory> cats = beanFactory.getLandingCategories();
%>

<c:forEach var="cat" items="<%=cats%>">
    <c:out value="${cat.id}"/>          
</c:forEach>

Однако, при попытке заполнить список элементов параметром, указанным в другом файле JSP, для каждого не будет работать.

JSP1
<jsp:include page="/jsp/modules/index/index_categories.jsp">    
    <jsp:param name="categories" value="<%=cats%>"/>
</jsp:include>

JSP2
<c:forEach var="cat" items="${param.categories}">
    <c:out value="${cat.id}"/>          
</c:forEach>

Выдается следующая ошибка:

javax.servlet.jsp.el.ELException: Unable to find a value for "id" in object of class "java.lang.String" using operator "."

Кажется, он рассматривает объекты списка элементов как строки, но я понятия не имею, почему это происходит.

У кого-нибудь есть идеи?

Спасибо

Ответы [ 2 ]

5 голосов
/ 10 августа 2009

Тег <jsp:param> предоставляет способ эмулировать параметры, которые вы передаете из HTTP-запроса. Как таковые, они являются строками. Так что JSP1 делает, берет вашу коллекцию "cats", конвертирует ее в String (используя toString()), а затем передает эту строку в качестве параметра JSP2. Затем foreach пытается перебрать эта строка. Структура данных Cat была потеряна при переводе.

Вместо этого вам нужно сохранить объект cats в качестве атрибута области запроса, что позволит JSP2 получить его:

<%
    List<LandingCategory> cats = beanFactory.getLandingCategories();
%>
<c:set var="cats" scope="request" value="<%=cats%>"/>
<jsp:include page="/jsp/modules/index/index_categories.jsp"/>
0 голосов
/ 10 августа 2009

Я почти уверен, что

<jsp:param name="categories" value="<%=cats%>"/>

вызывает toString () для кошек. Вместо этого используйте для этого файл тегов, он работает лучше:

<yourTags:fileName cats='${cats}' />

вместо.

...