Kann ich eine Hashtable in einem vereinten EL-Ausdruck auf einem c: forEach-Tag mit JSF 1.2 mit JSP 2.1?

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

  •  02-07-2019
  •  | 
  •  

Frage

Ich habe eine Hashtable genannt sportMap und eine Liste des sportIds (List sportIds) von meinem Backing Bean. Das Sport-Objekt hat eine List Ausrüstungs. Kann ich die folgende Verwendung des einheitlichen EL tun für jede Sportart die Liste der Geräte zu bekommen?

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

Ich erhalte die folgende Ausnahme bei dem Versuch, diesen JSP-Code auszuführen.

 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;

Hier ist ein Ausdruck meiner Umgebung

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

Anmerkung: Die folgenden funktioniert ein JSF-Tag. Er druckt für jede Sportart in der Liste des sportIds angegeben, die Liste der Geräte aus.

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

Ich möchte die c verwenden: forEach Tag. Weiß jemand, ob dies möglich ist? Wenn nicht, jemand Vorschläge? Am Ende möchte ich eine gestapelte Liste anstelle der Komma getrennte Liste zur Verfügung gestellt von equipmentList.toString (); (Auch will nicht toString () außer Kraft zu setzen).

War es hilfreich?

Lösung

@ keith30xi.myopenid.com

Nicht TRUE in JSF 1.2 . Nach dem java.net Wiki FAQ sie sollten zusammenarbeiten, wie erwartet .

Hier ist ein Auszug aus jeder FAQ:

  

JSF 1.1 FAQ
  Q. Do JSF-Tags interoperabel mit JSTL Kern-Tags, forEach, wenn, wählen und wann?

     

A. Der foreach-Tag mit Java Server funktioniert nicht Faces-Technologie, Version 1.0 und 1.1-Tags aufgrund einer Inkompatibilität zwischen den von JSTL verwendeten Strategien und und Java Server   Faces-Technologie. Stattdessen könnten Sie einen Renderer, wie die Tabelle Renderer von dem Datatable-Tag verwendet verwenden, das seine eigene Iteration durchführt. Die if wählen und wenn Tags arbeiten, aber die JSF-Tags innerhalb dieser Tags verschachtelt müssen explizite Identifikatoren haben.

     

Dieser Mangel in JSF 1.2 behoben wurde.

     

JSF 1.2 FAQ
  Q. Do JSF-Tags interoperabel mit JSTL Kern-Tags, forEach, wenn, wählen und wann?

     

A. Ja. Ein neues Feature von JSP 2.1, genannt JSP Id Consumer ermöglicht diese Tags wie erwartet zu funktionieren.

Hat jemand verwendet JSF-Tags mit JSTL Kern-Tags speziell forEach?

Andere Tipps

Ich hatte das gleiche Problem einmal, und ich konnte keine Lösung Datatable mit finden. Das Problem ist, dass die var _sportId kann nur von der Datatable-Komponente gelesen werden.

Wenn Sie eine Schleife in einer Schleife zu tun, dann können Sie eine Datatable in einem Datatable verwenden:

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

Aber in diesem Fall jeder von Ihnen Artikel Ausrüstungs innerhalb einer Tabellenzeile gedruckt. Es war keine große Lösung mich bilden.

Ich entschied mich für eine normale HTML-Tabelle zu verwenden, anstelle eines Datatable:

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

Es funktioniert. Wenn Sie einige konkrete Datatable-Funktionalität wie Bindung und Zeilenzuordnung benötigen, können Sie es auf einfache Weise erhalten mit der f. SetPropertyActionListener Tag

Zwei Fragen:

  1. Eine Datentabelle, nur haben die folgenden Kinder: Kopf Facette, Footer Facette, Spalte. Alles andere wird nicht richtig ausgewertet werden.
  2. JSTL-Tags können nicht mit JSF-Komponenten miteinander verwoben werden. Die JSTL Tags ausgewertet werden, wenn der Komponentenbaum erstellt wird. JSF-Komponenten ausgewertet werden, wenn die Seite gerendert wird. Somit ist die c: forEach Tag nur einmal ausgewertet wird - wenn der Komponentenbaum erstellt wird, was vor wahrscheinlich „# {bean.sportIds}“ zur Verfügung.

Sie entweder eine JSF-Komponenten-Bibliothek verwenden, die die Schleife bietet wie Sie es wünschen, eine bauen, die nicht Looping Sie wünschen, oder die Bohnen Refactoring, so dass statt über die sportIds von Looping, eine Schleife über eine Liste der Sportarten, bei denen jede Sportart hat ihre id und Ausrüstung.

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