Puis-je utiliser une table de hachage dans une expression EL unifiée sur une balise c: forEach à l'aide de JSF 1.2 avec JSP 2.1?

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

  •  02-07-2019
  •  | 
  •  

Question

J'ai une table de hachage < Entier, Sport > appelé sportMap et une liste de sportIds (liste < Integer > sportIds) de mon haricot de base. L'objet Sport a une liste & Lt; String & Gt; liste d'équipement. Puis-je effectuer les opérations suivantes en utilisant l'EL unifié pour obtenir la liste des équipements pour chaque 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>

J'obtiens l'exception suivante en essayant d'exécuter ce code 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;

Voici une impression de mon environnement

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

Remarque: Ce qui suit fonctionne avec une balise JSF. Il imprime la liste des équipements pour chaque sport spécifié dans la liste des sportsId.

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

Je voudrais utiliser la balise c: forEach. Est-ce que quelqu'un sait si c'est possible? Si non, quelqu'un a des suggestions? En fin de compte, je veux une liste empilée au lieu de la liste séparée par des virgules fournie par equipmentList.toString (); (Ne souhaitez pas non plus remplacer toString ()).

Était-ce utile?

La solution

@ keith30xi.myopenid.com

Non vrai dans JSF 1.2 . Selon le wiki faq java.net , ils devraient fonctionner ensemble comme prévu .

Voici un extrait de chaque FAQ:

  

FAQ sur JSF 1.1
  Q. Les balises JavaServer Faces interagissent-elles avec les balises principales JSTL, pour chaque, si, choisissez et quand?

     

A. La balise forEach ne fonctionne pas avec les balises versions 1.0 et 1.1 de la technologie JavaServer Faces, en raison d'une incompatibilité entre les stratégies utilisées par JSTL et celles de JavaServer.   Visages de la technologie. Au lieu de cela, vous pouvez utiliser un rendu, tel que le rendu de table utilisé par la balise dataTable, qui effectue sa propre itération. Les balises if, Choose et When fonctionnent, mais les balises JavaServer Faces imbriquées dans ces balises doivent avoir des identificateurs explicites.

     

Cette lacune a été corrigée dans JSF 1.2.

     

FAQ sur JSF 1.2
  Q. Les balises JavaServer Faces interagissent-elles avec les balises principales JSTL, pour chaque, si, choisissez et quand?

     

A. Oui. Une nouvelle fonctionnalité de JSP 2.1, appelée JSP Id Consumer, permet à ces balises de fonctionner comme prévu.

Quelqu'un a-t-il utilisé des tags JSF avec des tags principaux JSTL spécifiquement pour chaque?

Autres conseils

J'ai eu le même problème une fois et je ne trouvais pas de solution à l'aide de dataTable. Le problème est que var _sportId ne peut être lu que par le composant dataTable.

Si vous devez effectuer une boucle dans une boucle, vous pouvez utiliser un dataTable dans un dataTable:

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

Mais dans ce cas, chacun de vos éléments equipmentList est imprimé dans une ligne du tableau. Ce n’était pas une bonne solution de ma part.

J'ai choisi d'utiliser une table HTML normale au lieu d'une table de données:

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

Cela fonctionne. Si vous avez besoin de fonctionnalités dataTable spécifiques, telles que la liaison et le mappage de lignes, vous pouvez les obtenir facilement à l’aide de la balise f: setPropertyActionListener .

Deux problèmes:

  1. Un dataTable ne peut avoir que les enfants suivants: facette d’en-tête, facette de pied de page, colonne. Tout le reste ne sera pas évalué correctement.
  2. Les balises JSTL ne peuvent pas être entrelacées avec des composants JSF. Les balises JSTL sont évaluées lors de la création de l'arborescence des composants. Les composants JSF sont évalués lors du rendu de la page. Ainsi, la balise c: forEach n’est évaluée qu’une fois - lors de la création de l’arborescence des composants, probablement avant & Quot; # {bean.sportIds} & Quot; est disponible.

Utilisez une bibliothèque de composants JSF qui fournit la boucle comme vous le souhaitez, créez-en une qui effectue la boucle de votre choix ou refactorisez les haricots de manière à ce que, au lieu de passer en boucle sur le sportId, passez en boucle sur une liste de sports où chaque sport a sa identifiant et équipement.

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