Posso usar um Hashtable em uma expressão EL unificada em um c: forEach tag usando JSF 1.2 com JSP 2.1?

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

  •  02-07-2019
  •  | 
  •  

Pergunta

Eu tenho um Hashtable chamado sportMap e uma lista de sportIds (List sportIds) do meu bean de apoio. O objeto Sport tem um List equipmentList. Eu posso fazer o seguinte usando a EL unificada para obter a lista de equipamentos para cada esporte?

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

Eu recebo a seguinte exceção ao tentar executar 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;

Está aqui uma cópia do meu 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: O seguinte funciona usando uma tag JSF. Ela imprime a lista de equipamentos para cada esporte especificado na lista de sportIds.

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

Eu gostaria de usar o c: forEach tag. Alguém sabe se isso é possível? Se não, alguém tem sugestões? No final, eu quero uma lista empilhados em vez da lista separados por vírgula fornecido pelo equipmentList.toString (); (Além disso, não quero substituir toString ()).

Foi útil?

Solução

@ keith30xi.myopenid.com

Não é verdade em JSF 1.2 . De acordo com a java.net wiki FAQ eles devem trabalhar juntos como esperado .

Aqui está um excerto de cada FAQ:

JSF 1.1 FAQ
Q. Do JavaServer Faces etiquetas interoperar com etiquetas principais JSTL, foreach se, escolher e quando?

A. A tag forEach não funciona com a tecnologia JavaServer Faces, versão 1.0 e 1.1 etiquetas devido a uma incompatibilidade entre as estratégias utilizadas pelos JSTL e e JavaServer Faces tecnologia. Em vez disso, você poderia usar um processador, como o renderizador tabela usada pela tag dataTable, que realiza sua própria iteração. O caso, escolha e quando tags funcionam, mas a JavaServer Faces tags aninhadas dentro dessas tags devem ter identificadores explícitos.

Esta lacuna foi corrigido no JSF 1.2.

JSF 1.2 FAQ
Q. Do JavaServer Faces etiquetas interoperar com etiquetas principais JSTL, foreach se, escolher e quando?

A. Sim. Um novo recurso do JSP 2.1, chamado JSP Id Consumidor permite que essas marcas a funcionar como esperado.

Alguém já usou marcações JSF com marcas principais JSTL especificamente forEach?

Outras dicas

Eu tive o mesmo problema de uma vez, e eu não poderia encontrar uma solução usando dataTable. O problema é que o var _sportId pode ser lido somente pelo componente dataTable.

Se você precisa fazer um loop dentro de um loop, você pode usar um dataTable dentro de um 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>

Mas, neste caso, cada um dos teus equipmentList itens é impressa dentro de uma linha da tabela. Não foi uma grande forma de solução mim.

Eu escolhi usar uma tabela html normal em vez de um 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>

Ele funciona. Se você precisar de algumas funcionalidades dataTable específico como ligação e mapeamento de linha, você pode obtê-lo de uma forma fácil usando o f:. SetPropertyActionListener tag

Duas questões:

  1. A dataTable só pode ter os seguintes filhos: faceta cabeçalho, faceta rodapé, coluna. Qualquer outra coisa que não vai ser avaliada corretamente.
  2. marcas JSTL não pode ser entrelaçada com componentes JSF. As tags JSTL são avaliados quando a árvore componente é criado. componentes JSF são avaliados quando a página é processada. Assim, o c: tag forEach é avaliada somente uma vez - quando a árvore componente é criado, que é provável antes "# {bean.sportIds}" está disponível.

Utilize uma biblioteca de componentes JSF que fornece o looping como você deseja, construir um que faz o looping que você deseja, ou refatorar o feijão de modo que em vez de looping sobre os sportIds, loop sobre uma lista de esportes onde cada esporte tem a sua id e equipamentos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top