Posso usare un Hashtable in un'espressione EL unificata su un tag c: forEach usando JSF 1.2 con JSP 2.1?

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

  •  02-07-2019
  •  | 
  •  

Domanda

Ho un Hashtable < Integer, Sport > chiamato sportMap e un elenco di sportIds (Elenco < Integer > sportIds) dal mio bean di supporto. L'oggetto Sport ha un elenco & Lt; String & Gt; equipmentList. Posso fare quanto segue usando l'EL unificato per ottenere l'elenco delle attrezzature per ogni sport?

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

Ottengo la seguente eccezione quando provo a eseguire questo codice 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;

Ecco una stampa del mio ambiente

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: quanto segue funziona usando un tag JSF. Stampa l'elenco delle attrezzature per ogni sport specificato nell'elenco degli sport.

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

Vorrei usare il tag c: forEach. Qualcuno sa se questo è possibile? In caso contrario, qualcuno ha suggerimenti? Alla fine voglio un elenco in pila anziché l'elenco separato da virgole fornito da equipmentList.toString (); (Inoltre, non vuoi sovrascrivere toString ()).

È stato utile?

Soluzione

@ keith30xi.myopenid.com

Non VERO in JSF 1.2 . Secondo le java.net wiki faq dovrebbero lavorare insieme come previsto .

Ecco un estratto da ogni FAQ:

  

Domande frequenti su JSF 1.1
  D. I tag JavaServer Faces interagiscono con i tag core JSTL, per ogni caso, se, scegliere e quando?

     

A. Il tag forEach non funziona con la tecnologia JavaServer Faces, tag versione 1.0 e 1.1 a causa di un'incompatibilità tra le strategie utilizzate da JSTL e JavaServer   Tecnologia dei volti. Invece, è possibile utilizzare un renderer, come il renderer di tabelle utilizzato dal tag dataTable, che esegue la propria iterazione. I tag if, scegliere e quando funzionano, ma i tag JavaServer Faces nidificati all'interno di questi tag devono avere identificatori espliciti.

     

Questo difetto è stato corretto in JSF 1.2.

     

Domande frequenti su JSF 1.2
  D. I tag JavaServer Faces interagiscono con i tag core JSTL, per ogni caso, se, scegliere e quando?

     

A. Sì. Una nuova funzionalità di JSP 2.1, denominata ID consumatore JSP, consente a questi tag di funzionare come previsto.

Qualcuno ha usato i tag JSF con i tag core JSTL appositamente per ciascuno?

Altri suggerimenti

Ho avuto lo stesso problema una volta e non sono riuscito a trovare una soluzione utilizzando dataTable. Il problema è che var _sportId può essere letto solo dal componente dataTable.

Se è necessario eseguire un ciclo all'interno di un ciclo, è possibile utilizzare una tabella dati all'interno di una tabella dati:

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

Ma in questo caso ciascuno dei tuoi oggetti della lista dell'attrezzatura viene stampato all'interno di una riga della tabella. Non è stata un'ottima soluzione per me.

Ho scelto di utilizzare una normale tabella html anziché una tabella di dati:

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

Funziona. Se hai bisogno di alcune funzionalità specifiche di DataTable come l'associazione e il mapping delle righe, puoi ottenerlo facilmente utilizzando il tag f: setPropertyActionListener .

Due problemi:

  1. Una tabella di dati può avere solo i seguenti elementi secondari: sfaccettatura dell'intestazione, sfaccettatura del piè di pagina, colonna. Nient'altro non verrà valutato correttamente.
  2. I tag JSTL non possono essere intrecciati con i componenti JSF. I tag JSTL vengono valutati quando viene creato l'albero dei componenti. I componenti JSF vengono valutati quando viene eseguito il rendering della pagina. Pertanto, il tag c: forEach viene valutato solo una volta - quando viene creato l'albero dei componenti, che è probabilmente prima di & Quot; # {bean.sportIds} & Quot; è disponibile.

Utilizza una libreria di componenti JSF che fornisce il looping come desideri, creane uno che esegua il looping desiderato o rifattorizza i bean in modo che invece di eseguire il looping sopra gli sportid, esegui il loop su un elenco di sport in cui ogni sport ha il suo id e attrezzatura.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top