JSTL forEach tag: Probleme mit Enumeration, und mit Verständnis, wie es funktionieren soll

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

  •  05-07-2019
  •  | 
  •  

Frage

Ich habe erlebt ziemlich seltsames Verhalten von JSTL forEach Tag.

Ich habe einige Bohne genannt SessionBean:

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

Und eine einfache JSP-Seite wie folgt aus:

<%@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>

Und es funktioniert nicht. Exeption geworfen ist

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)
   ....

Warum?
Und dann wechsle ich items="#{SessionBean.objects}" zu item = "${SessionBean.objects}", und es gibt keine Ausnahme. Mit Ausnahme von MyObjects werden nicht gedruckt.

Dann mache ich die gleiche Änderung an <h:outputText value="#{myObject}" />, und es ist ungültiger Wert für dieses Attribut.

Schließlich ersetzt JSF outputText-Tag mit nur ${myObject} funktioniert wie erwartet.

Könnte jemand erklären, was auf jeder Phase geschieht hier, bitte?

U:. SessionBean wird von JSF und sicher angelegt wurde, denn es einige Aktionen im Header führt

AUFLÖSUNG: Das Problem erwies sich aufgrund der Inkompatibilität zwischen JSTL und JSF in J2EE 1.4 sein. Die Umstellung auf J2EE 5 aus der ersten Variante gut funktionieren.

Danke!

War es hilfreich?

Lösung

Das Artikel die Differenz zwischen dem Unified EL und der EL erklärt. Hier ist ein Ausschnitt

  

Auswertung von EL

     

Auswertung von EL wird als sofortige Auswertung und latente Auswertung kategorisiert. Sofortige Auswertung bedeutet eine JSP-Seite wertet den Ausdruck, wenn die Seite gerendert wird. Mit sofortiger Auswertung werden alle Werte immer nur gelesen. JSP EL Ausdrücke in Form von $ {} imExpr. JSP Ausdrücke werden sofort ausgewertet.

     

Latente Auswertung bedeutet, dass die Technologie, um die Unified EL übernimmt die Verantwortung der Auswertung des Ausdrucks von der JSP-Engine und wertet den Ausdruck zu gegebener Zeit während des Seitenlebenszyklus verwendet wird. Der EL nimmt die Kontrolle von den JSP Behältern den Ausdruck zu gegebener Zeit zu bewerten. JSF EL Ausdrücke in Form von # {defExpr}. JSF Ausdrücke funktionieren auf diese Weise.

     

Das folgende Beispiel zeigt einen JSF input-Tag, das ein Textfeldkomponente repräsentiert, in denen ein Benutzer einen Wert eingibt. Der Wert des Attribut input Tages verweist auf einen Ausdruck, der auf den Namen Eigenschaft des Buch Bean verweist.

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

Für eine erste Anfrage der Seite dieses Tag enthält, wertet die JSF-Implementierung den # {} student.name Ausdruck in der „Render Response“ Phase des Lebenszyklus. Während dieser Phase greift der Ausdruck lediglich den Wert der Menge aus dem Buch Bohne, wie in sofortiger Auswertung durchgeführt wird.

     

Für eine Postbacks wertet die Umsetzung der Expression während der „Anforderungswerte gelten“, „Prozessvalidierungen“ und „Update-Modell“ Phasen, in denen der Wert von der Anforderung abgerufen wird, validiert und auf das Buch Bohne propagierte .

Ich frage mich, ob das Problem aus der Tatsache ist, dass eine Instanz von SessionBean erstellt wurde nicht?

Versuchen Sie folgendes:

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

[Update] Ich frage mich, ob Artikel rel="nofollow könnte dann helfen. Es wird erläutert, wie die beiden EL Arbeit zusammen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top