JSTL para cada etiqueta: problemas con la enumeración y con la comprensión de cómo debería funcionar

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

  •  05-07-2019
  •  | 
  •  

Pregunta

He experimentado un comportamiento bastante extraño de JSTL para cada etiqueta.

Tengo un bean llamado SessionBean:

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

Y una página JSP simple como esa:

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

Y, no funciona. La excepción lanzada es

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

¿Por qué?
Y luego cambio items="#{SessionBean.objects}" a items = "${SessionBean.objects}", y no hay excepción. Excepto que MyObjects no se imprimen.

Luego, realizo el mismo cambio en <h:outputText value="#{myObject}" />, y es un valor no válido para este atributo.

Finalmente, reemplazar la etiqueta JSF outputText con solo ${myObject} funciona como se esperaba.

¿Podría alguien explicarme qué sucede aquí en cada fase, por favor?

U: SessionBean es administrado por JSF, y seguramente fue creado, ya que realiza algunas acciones en el encabezado.

RESOLUCIÓN: El problema se debió a la incompatibilidad entre JSTL y JSF en J2EE 1.4. Cambiar a J2EE 5 hizo que la primera variante funcionara bien.

¡Gracias!

¿Fue útil?

Solución

Este El artículo explica la diferencia entre el EL unificado y el EL. Aquí hay un fragmento

  

Evaluación de EL

     

La evaluación de EL se clasifica como evaluación inmediata y evaluación diferida. La evaluación inmediata significa que una página JSP evalúa la expresión cuando se representa la página. Con la evaluación inmediata, todos los valores son siempre de solo lectura. Las expresiones JSP EL toman la forma de $ {imExpr}. Las expresiones JSP se evalúan de inmediato.

     

La evaluación diferida significa que la tecnología que usa el EL unificado asume la responsabilidad de evaluar la expresión del motor JSP y evalúa la expresión en el momento apropiado durante el ciclo de vida de la página. El EL toma el control del contenedor JSP para evaluar la expresión en el momento apropiado. Las expresiones JSF EL toman la forma de # {defExpr}. Las expresiones JSF funcionan de esta manera.

     

El siguiente ejemplo muestra una etiqueta JSF inputText, que representa un componente de campo de texto en el que un usuario ingresa un valor. El atributo de valor de la etiqueta inputText hace referencia a una expresión que apunta a la propiedad de nombre del bean de libro.

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

Para una solicitud inicial de la página que contiene esta etiqueta, la implementación de JSF evalúa la expresión # {student.name} durante la " render respuesta " fase del ciclo de vida. Durante esta fase, la expresión simplemente accede al valor de la cantidad del bean de libro, como se hace en la evaluación inmediata.

     

Para una devolución de datos, la implementación evalúa la expresión durante " aplicar valores de solicitud, " " validaciones de proceso, " y " actualizar modelo " fases, durante las cuales el valor se recupera de la solicitud, se valida y se propaga al bean del libro.

Me pregunto si el problema se debe al hecho de que no se creó una instancia de SessionBean.

Prueba esto:

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

[Actualización] Me pregunto si este artículo podría ayuda entonces. Explica cómo los dos EL trabajan juntos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top