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

StackOverflow https://stackoverflow.com/questions/256910

  •  05-07-2019
  •  | 
  •  

Вопрос

Я столкнулся с довольно странным поведением тега 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}" к элементам="${SessionBean.objects}", и здесь нет исключения.За исключением того, что MyObjects не печатаются.

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

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

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

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

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

Спасибо!

Это было полезно?

Решение

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

Оценка EL

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

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

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

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

Для первоначального запроса страницы, содержащей этот тег, реализация JSF вычисляет выражение #{student.name} на этапе "render response" жизненного цикла.На этом этапе выражение просто получает доступ к значению quantity из book bean, как это делается при немедленной оценке.

Для обратной передачи реализация вычисляет выражение во время фаз "применить значения запроса", "обработать проверки" и "обновить модель", во время которых значение извлекается из запроса, проверяется и передается в 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 работают вместе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top