我已经经验丰富而奇怪的行为JSTL forEach标签。

我有些豆称为SessionBean:

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

和一个简单的JSP站,如:

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

而且,它不工作。Exeption抛是

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

为什么?
然后我改变 items="#{SessionBean.objects}" 项="${SessionBean.objects}", 没有例外。除了MyObjects不打印。

然后,我做同样的改变 <h:outputText value="#{myObject}" />, ,这是值无效这一特性。

最后,替换JSF outputText 标记只是 ${myObject} 作为预期。

谁能解释一下,会发生什么这里的每一个阶段,好吗?

U: SessionBean管理的JSF,并肯定创建的,因为它执行一些行动在头。

决议: 该问题被证明是由于不相容性之间的JSTL和JSF在J2EE1.4.切换到J2EE5作出的第一个变体工作得很好。

谢谢!

有帮助吗?

解决方案

文章 解释之间的差异的统一EL和EL。这里是一个片段

评价EL

评价EL被归类为即时评估和延期评估。即时评价指JSP页的评估表达时,该页的渲染。立即评估,所有价值观是永远只读。JSP EL表达采取的形式${imExpr}.JSP表达式进行评估。

推迟评估意味着技术使用统一的EL接管的责任的评估表达自JSP发动机,并评估表达在适当的时候在该页的生命周期。EL需要控制来自JSP容器来评估表达在适当的时间。JSF EL表达采取的形式#{defExpr}.JSF表的工作,以这种方式。

以下例子显示了一个JSF inputText标记,它表示一个文本领域组成部分,它用户输入的价值。该inputText标签的值属性引用的表达这一点的名称属的书豆。

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

初始请求的网页含有此标签,JSF的执行情况评估#{的学生。名}表达过的"呈现的应对"阶段的生命周期。在此阶段,该表达的仅仅访问的价值的数量从书豆,因为工作是在即时评价。

为回发,执行评估期间表达的"应用的要求价值观、""过程验证的"和"新模式"的阶段,在此期间,其价值是从请求,进行验证,并传播到书豆。

我想知道如果问题是从一个事实,即一个实例SessionBean是不是?

试试这个:

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

[更新]我不知道这个 文章 可能会有帮助。它介绍了如何在两个EL的工作在一起。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top