JSTL forEach tag: problèmes d'énumération et de compréhension de son fonctionnement

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

  •  05-07-2019
  •  | 
  •  

Question

J'ai eu un comportement plutôt étrange de la balise JSTL forEach.

J'ai un haricot appelé SessionBean:

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

Et une simple page JSP comme celle-ci:

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

Et ça ne marche pas. L’exception levée est

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

Pourquoi?
Et puis je change items = " # {SessionBean.objects} " en items = " $ {SessionBean.objects} " , et il n'y a pas d'exception. Sauf que MyObjects n'est pas imprimé.

Ensuite, j'apporte la même modification à < h: outputText value = " # # myObject} " / > et sa valeur n'est pas valide pour cet attribut.

Enfin, le remplacement de la balise JSF outputText par simplement $ {myObject} fonctionne comme prévu.

Quelqu'un pourrait-il expliquer ce qui se passe ici à chaque phase, s'il vous plaît?

U: SessionBean est géré par JSF et a sûrement été créé car il effectue certaines actions dans l'en-tête.

RÉSOLUTION: Le problème s’est révélé être dû à une incompatibilité entre JSTL et JSF dans J2EE 1.4. En passant à J2EE 5, la première variante fonctionnait parfaitement.

Merci!

Était-ce utile?

La solution

Cette L'article explique la différence entre l'EL unifié et l'EL. Voici un extrait

  

Évaluation de l'EL

     

L’évaluation de l’EL est classée en évaluation immédiate et en évaluation différée. Une évaluation immédiate signifie qu'une page JSP évalue l'expression lors du rendu de la page. Avec une évaluation immédiate, toutes les valeurs sont toujours en lecture seule. Les expressions JSP EL prennent la forme de $ {imExpr}. Les expressions JSP sont évaluées immédiatement.

     

L'évaluation différée signifie que la technologie utilisant l'EL unifiée prend en charge l'évaluation de l'expression à partir du moteur JSP et évalue l'expression au moment approprié pendant le cycle de vie de la page. Le EL prend le contrôle du conteneur JSP pour évaluer l'expression au moment approprié. Les expressions EL JSF se présentent sous la forme # {defExpr}. Les expressions JSF fonctionnent de cette manière.

     

L'exemple suivant montre une balise JSF inputText, qui représente un composant de champ de texte dans lequel un utilisateur entre une valeur. L'attribut value de la balise inputText fait référence à une expression qui pointe vers la propriété name du bean book.

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

Pour une demande initiale de la page contenant cette balise, l'implémentation JSF évalue l'expression # {student.name} au cours de la " réponse de rendu " phase du cycle de vie. Au cours de cette phase, l’expression accède simplement à la valeur de la quantité à partir du haricot du livre, comme dans l’évaluation immédiate.

     

Pour une publication, l'implémentation évalue l'expression au cours des " appliquer les valeurs de la demande, " "valider les processus" et " mettre à jour le modèle " phases au cours desquelles la valeur est extraite de la demande, validée et propagée au bean du livre.

Je me demande si le problème vient du fait qu'aucune instance de SessionBean n'a été créée?

Essayez ceci:

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

[Mise à jour] Je me demande si cet article pourrait aide alors. Il explique comment les deux EL travaillent ensemble.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top