Тег JSTL forEach: проблемы с перечислением и пониманием того, как это должно работать

Я испытал довольно странное поведение тега 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 первый вариант работал нормально.

Спасибо!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
0
11 007
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Evaluation of EL

Evaluation of EL is categorized as immediate evaluation and deferred evaluation. Immediate evaluation means a JSP page evaluates the expression when the page is rendered. With immediate evaluation, all values are always read-only. JSP EL expressions take the form of ${imExpr}. JSP expressions are evaluated immediately.

Deferred evaluation means that the technology using the unified EL takes over the responsibility of evaluating the expression from the JSP engine and evaluates the expression at the appropriate time during the page lifecycle. The EL takes control from the JSP container to evaluate the expression at the appropriate time. JSF EL expressions take the form of #{defExpr}. JSF expressions work in this way.

The following example shows a JSF inputText tag, which represents a text field component into which a user enters a value. The inputText tag's value attribute references an expression that points to the name property of the book bean.

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

For an initial request of the page containing this tag, the JSF implementation evaluates the #{student.name} expression during the "render response" phase of the lifecycle. During this phase, the expression merely accesses the value of quantity from the book bean, as is done in immediate evaluation.

For a postback, the implementation evaluates the expression during the "apply request values," "process validations," and "update model" phases, during which the value is retrieved from the request, validated, and propagated to the book bean.

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

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

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

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

Другие вопросы по теме