JSTL forEach标记:问题枚举,并与了解应该如何工作。
题
我已经经验丰富而奇怪的行为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的工作在一起。