Тег JSTL forEach: проблемы с перечислением и пониманием того, как он должен работать - PullRequest
4 голосов
/ 02 ноября 2008

Я столкнулся с довольно странным поведением тега JSTL forEach.

У меня есть бин SessionBean:

public class SessionBean {
  private Collection<MyObject> objects;
  public Collection<MyObject> getObjects() {return objects;}
  ...
}

И такая простая страница JSP:

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<body>
    <f:view>
        <h:form>
            <c:forEach var="myObject" items="#{SessionBean.objects}">
                <h:outputText value="#{myObject}" /> <br />
            </c:forEach>
        </h:form>
    </f:view>
</body>

И это не работает. Исключение составляет

javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in <forEach>
        at org.apache.taglibs.standard.tag.common.core.ForEachSupport.toForEachIterator(ForEachSupport.java:255)
        at org.apache.taglibs.standard.tag.common.core.ForEachSupport.supportedTypeForEachIterator(ForEachSupport.java:219)
   ....

Почему?
А потом я изменяю items="#{SessionBean.objects}" на items = "${SessionBean.objects}", и здесь нет исключений. За исключением MyObjects не печатаются.

Затем я делаю то же самое изменение на <h:outputText value="#{myObject}" />, и это недопустимое значение для этого атрибута.

Наконец, замена тега JSF outputText на ${myObject} работает как положено.

Может кто-нибудь объяснить, что здесь происходит на каждом этапе, пожалуйста?

U: SessionBean управляется JSF и, безусловно, был создан, поскольку он выполняет некоторые действия в заголовке.

РЕШЕНИЕ: Проблема оказалась из-за несовместимости между JSTL и JSF в J2EE 1.4. Переключение на J2EE 5 сделало первый вариант просто отличным.

Спасибо!

1 Ответ

5 голосов
/ 02 ноября 2008

Эта статья объясняет разницу между унифицированным EL и EL. Вот фрагмент

Оценка EL

Оценка EL относится к категории немедленной оценки и отложенной оценки. Немедленная оценка означает, что страница JSP оценивает выражение при визуализации страницы. При немедленной оценке все значения всегда доступны только для чтения. Выражения JSP EL принимают форму $ {imExpr}. Выражения JSP оцениваются немедленно.

Отсроченная оценка означает, что технология, использующая унифицированный EL, берет на себя ответственность по оценке выражения из механизма JSP и оценивает выражение в соответствующее время в течение жизненного цикла страницы. EL получает контроль от JSP-контейнера для оценки выражения в соответствующее время. Выражения EL JSF имеют вид # {defExpr}. Выражения JSF работают таким образом.

В следующем примере показан тег JSF inputText, представляющий компонент текстового поля, в который пользователь вводит значение. Атрибут value тега inputText ссылается на выражение, которое указывает на свойство name bean-компонента book.

<h:inputText id="name" value="#{student.name}"/>

Для первоначального запроса страницы, содержащей этот тег, реализация JSF оценивает выражение # {student.name} во время фазы «ответа на запрос» жизненного цикла. На этом этапе выражение просто получает доступ к значению количества из объекта книги, как это делается при немедленной оценке.

Для обратной передачи реализация оценивает выражение на этапах «применить значения запроса», «проверки процесса» и «обновить модель», во время которых значение извлекается из запроса, проверяется и распространяется в компонент книги. .

Мне интересно, если проблема в том, что экземпляр SessionBean не был создан?

Попробуйте это:

<jsp:useBean class="packagename.SessionBean" id="sb"/>
<c:forEach var="myObject" items="${sb.objects}">
            <h:outputText value="${myObject}" /> <br />
</c:forEach>

[Обновление] Интересно, может ли тогда помочь эта статья 1028 *? Это объясняет, как два EL работают вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...