JSTL forEach tag: problemas com a enumeração e com a compreensão de como ele deve funcionar
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!
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.