JSTL forEach tag: problemas com a enumeração e com a compreensão de como ele deve funcionar

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

  •  05-07-2019
  •  | 
  •  

Pergunta

Eu experimentei um comportamento bastante estranho de JSTL forEach tag.

Eu tenho alguns feijão chamado SessionBean:

public class SessionBean {
  private Collection<MyObject> objects;
  public Collection<MyObject> getObjects() {return objects;}
  ...
}

E uma simples página JSP assim:

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<body>
    <f:view>
        <h:form>
            <c:forEach var="myObject" items="#{SessionBean.objects}">
                <h:outputText value="#{myObject}" /> <br />
            </c:forEach>
        </h:form>
    </f:view>
</body>

E, ele não funciona. Exeption lançada é

javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in <forEach>
        at org.apache.taglibs.standard.tag.common.core.ForEachSupport.toForEachIterator(ForEachSupport.java:255)
        at org.apache.taglibs.standard.tag.common.core.ForEachSupport.supportedTypeForEachIterator(ForEachSupport.java:219)
   ....

Por quê?
E então eu mudança items="#{SessionBean.objects}" a itens = "${SessionBean.objects}", e não há nenhuma exceção. Exceto para myObjects não são impressos.

Então, eu fazer a mesma alteração para <h:outputText value="#{myObject}" />, e é valor inválido para este atributo.

Finalmente, substituindo JSF tag outputText com apenas obras ${myObject} como esperado.

Alguém poderia explicar, o que acontece aqui em cada fase, por favor?

U:. SessionBean é gerenciado por JSF, e, certamente, foi criado, para que ele executa algumas ações no cabeçalho

Resolução: O problema revelou-se devido à incompatibilidade entre JSTL e JSF em J2EE 1.4. Mudar para J2EE 5 fez o primeiro trabalho variante muito bem.

Obrigado!

Foi útil?

Solução

Este artigo explica a diferença entre a EL unificada eo EL. Aqui está um trecho

Avaliação do EL

Avaliação de EL é classificado como avaliação imediata e avaliação adiada. avaliação imediata significa uma página JSP avalia a expressão quando a página é processada. Com avaliação imediata, todos os valores são sempre somente leitura. expressões JSP EL assumir a forma de $ {imExpr}. expressões JSP são avaliadas imediatamente.

meios de avaliação diferidos que a tecnologia utilizando a EL unificada assuma a responsabilidade de avaliar a expressão do motor JSP e avalia a expressão no momento apropriado durante o ciclo de vida de página. A EL assume o controlo do recipiente JSP para avaliar a expressão no momento apropriado. expressões JSF EL assumir a forma de # {defExpr}. trabalho JSF expressões desta forma.

O exemplo a seguir mostra uma tag JSF inputText, o que representa um componente de campo de texto no qual um usuário digita um valor. referências a atributos de valor do tag inputText uma expressão que aponta para a propriedade nome do feijão livro.

<h:inputText id="name" value="#{student.name}"/>

Para um pedido inicial da página que contém essa tag, a implementação JSF avalia o # {student.name} expressão durante a fase de "render resposta" do ciclo de vida. Durante esta fase, a expressão meramente acessa o valor da quantidade do feijão livro, como é feito na avaliação imediata.

Para uma nova postagem, a implementação avalia a expressão durante a "aplicar valores de solicitação", "validações de processo" e "fases atualização modelo", durante o qual o valor é recuperado a partir da solicitação, validados e propagados para o feijão de livro .

Eu estou querendo saber se o problema é o fato de que uma instância de SessionBean não foi criado?

Tente isto:

<jsp:useBean class="packagename.SessionBean" id="sb"/>
<c:forEach var="myObject" items="${sb.objects}">
            <h:outputText value="${myObject}" /> <br />
</c:forEach>

[Update] Eu me pergunto se este artigo pode ajudar, então. Ele explica como o trabalho a dois do EL juntos.

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