¿Puedo usar un Hashtable en una expresión EL unificada en una etiqueta c: forEach usando JSF 1.2 con JSP 2.1?

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

  •  02-07-2019
  •  | 
  •  

Pregunta

Tengo un Hashtable < Integer, Sport > llamado sportMap y una lista de sportIds (List < Integer > sportIds) de mi bean de respaldo. El objeto Sport tiene una Lista & Lt; String & Gt; lista de equipo. ¿Puedo hacer lo siguiente usando el EL unificado para obtener la lista de equipos para cada deporte?

<h:dataTable value="#{bean.sportIds}" var="_sportId" > 
  <c:forEach items="#{bean.sportMap[_sportId].equipmentList}" var="_eqp">
    <h:outputText value="#{_eqp}"></h:outputText>
    <br/>
  </c:forEach>
</h:dataTable>

Recibo la siguiente excepción cuando intento ejecutar este código JSP.

 15:57:59,438 ERROR [ExceptionFilter] exception root cause
javax.servlet.ServletException: javax.servlet.jsp.JspTagException: 
      Don't know how to iterate over supplied "items" in &lt;forEach&gt;

Aquí hay una impresión de mi entorno

Server: JBossWeb/2.0.1.GA
Servlet Specification: 2.5
JSP version: 2.1
JSTL version: 1.2
Java Version: 1.5.0_14

Nota: Lo siguiente funciona utilizando una etiqueta JSF. Imprime la lista de equipos para cada deporte especificado en la lista de ID de deporte.

<h:dataTable value="#{bean.sportIds}" var="_sportId" > 
    <h:outputText value="#{bean.sportMap[_sportId].equipmentList}">
    </h:outputText>
</h:dataTable>

Me gustaría usar la etiqueta c: forEach. ¿Alguien sabe si esto es posible? Si no, ¿alguien tiene sugerencias? Al final, quiero una lista apilada en lugar de la lista separada por comas proporcionada por equipmentList.toString (); (Además, no quiero anular toString ()).

¿Fue útil?

Solución

@ keith30xi.myopenid.com

No es VERDADERO en JSF 1.2 . Según el java.net wiki faq deberían trabajar juntos como se esperaba .

Aquí hay un extracto de cada faq:

  

Preguntas frecuentes de JSF 1.1
  P. ¿Las etiquetas de JavaServer Faces interoperan con las etiquetas principales de JSTL, forEach, if, choose y when?

     

A. La etiqueta forEach no funciona con la tecnología JavaServer Faces, versión 1.0 y 1.1 debido a una incompatibilidad entre las estrategias utilizadas por JSTL y JavaServer   Tecnología de caras. En su lugar, podría usar un procesador, como el procesador de tabla utilizado por la etiqueta dataTable, que realiza su propia iteración. Las etiquetas if, choose y when funcionan, pero las etiquetas JavaServer Faces anidadas dentro de estas etiquetas deben tener identificadores explícitos.

     

Esta deficiencia se ha corregido en JSF 1.2.

     

Preguntas frecuentes sobre JSF 1.2
  P. ¿Las etiquetas de JavaServer Faces interoperan con las etiquetas principales de JSTL, forEach, if, choose y when?

     

A. Sí. Una nueva característica de JSP 2.1, llamada JSP Id Consumer, permite que estas etiquetas funcionen como se espera.

¿Alguien ha usado etiquetas JSF con etiquetas centrales JSTL específicamente para cada una?

Otros consejos

Tuve el mismo problema una vez, y no pude encontrar una solución usando dataTable. El problema es que la var _sportId solo puede ser leída por el componente dataTable.

Si necesita hacer un bucle dentro de un bucle, puede usar una tabla de datos dentro de una tabla de datos:

<h:dataTable value="#{bean.sportIds}" var="_sportId" > 
  <h:dataTable value="#{bean.sportMap[_sportId].equipmentList}" var="_eqp">
    <h:outputText value="#{_eqp}"></h:outputText>
  </h:dataTable>
</h:dataTable>

Pero en este caso cada uno de los elementos de su equipo se imprime dentro de una fila de la tabla. No fue una gran solución para mí.

Elegí usar una tabla html normal en lugar de una tabla de datos:

<table>
    <c:forEach items="#{bean.sportIds}" var="_sportId">
      <tr>
        <td>
        <c:forEach items="#{bean.sportMap[_sportId].equipmentList" var="_eqp">
            <h:outputText value="#{_eqp} " />
        </c:forEach>
        </td>
      </tr>
    </c:forEach>
</table>

Funciona. Si necesita alguna funcionalidad específica de DataTable, como el enlace y la asignación de filas, puede obtenerla de manera fácil usando la etiqueta f: setPropertyActionListener .

Dos problemas:

  1. Una tabla de datos solo puede tener los siguientes elementos secundarios: faceta de encabezado, faceta de pie de página, columna. Cualquier otra cosa no se evaluará correctamente.
  2. Las etiquetas JSTL no se pueden entrelazar con componentes JSF. Las etiquetas JSTL se evalúan cuando se crea el árbol de componentes. Los componentes JSF se evalúan cuando se representa la página. Por lo tanto, la etiqueta c: forEach solo se evalúa una vez, cuando se crea el árbol de componentes, lo que es probable antes de & Quot; # {bean.sportIds} & Quot; está disponible.

Utilice una biblioteca de componentes JSF que proporcione el bucle como desee, cree uno que haga el bucle que desee o refactorice los beans para que, en lugar de recorrer los Id. deportivos, repita una lista de deportes donde cada deporte tiene su identificación y equipo.

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