javax.servlet.ServletException:javax.servlet.jsp.JspTagException:不知道如何迭代<forEach>中提供的“items”

我有一个持有结果的Bean。 我需要使用JSTL来遍历它并呈现结果。 这是豆:

public class DetResults { private List<String> headings; private List<Class<?>> types; private List<Object[]> data; public DetResults() {} public List<String> getHeadings() { return this.headings; } public String getHeading(int which) { return this.headings.get(which); } public List<Class<?>> getTypes() { return this.types; } public Class<?> getType(int which) { return this.types.get(which); } public List<Object[]> getData( ) { return this.data; } public Object[] getDataAtRow( int row ) { return this.data.get(row); } public void setHeadings( List<String> val ) { this.headings = val; } public void setHeadings( String[] val ) { this.headings = Arrays.asList(val); } public void addHeading( String val ) { if( this.headings == null ) this.headings = new ArrayList<String>(); this.headings.add(val); } public void setTypes( List<Class<?>> val ) { this.types = val; } public void setTypes( Class<?> val[] ) { this.types = Arrays.asList(val); } public void addType( Class<?> val ) { if( this.types == null ) this.types = new ArrayList<Class<?>>(); this.types.add(val); } public void setData( List<Object[]> val ) { this.data = val; } // allow NPE to get thrown public void setDataAtRow( Object[] val, int row ) { this.data.set(row, val); } public void appendDataRow( Object[] val ) { if( data == null ) data = new ArrayList<Object[]>(); this.data.add(val); } public int getColumnCount() { return this.headings!=null?this.headings.size():0; } } 

这里是将bean设置为JSP的处理程序:

 DetResults results = detDAO.fetchDetResults(paramBean); request.setAttribute("results", results); action.setJspURI(".../.jsp"); 

我试图显示它如下:

 <c:forEach var="results" items="${results}"> ${results.heading} </c:forEach> 

但它抛出了以下例外:

原因是:javax.servlet.ServletException:javax.servlet.jsp.JspTagException:不知道如何遍历<forEach>中提供的“items”

如果我将结果logging在我的处理程序页面上,如下所示:

 System.out.println( "\n\nthere are " + results.getColumnCount() + " columns in the result set" ); for( int i=0; i<results.getColumnCount(); i++ ) { System.out.println( results.getHeading(i) + " --> " + results.getType(i) ); } 

日志似乎在服务器上显示正常。

原因是:javax.servlet.ServletException:javax.servlet.jsp.JspTagException:不知道如何迭代<forEach>提供的“items”

<c:forEach items>没有引用可以迭代的有效对象时,会发生这种情况。 该对象应该是一个Object[] (一个普通数组),一个CollectionMapIteratorEnumeration或者String (参见源代码 )。 其他任何东西都不能被<c:forEach>迭代。 你的DetResults类不是上述任何一种types的实例,所以它会失败。

你的DetResults类看起来不正确。 它看起来基本上像一个神豆,它具有多个单独实体的所有属性的集合。 这个不对。 一个bean类最多只能表示一个实体。 重写你的DetResults类,以便基本上最终得到一个完整的javabeans集合:

 List<DetResult> results = detDAO.fetchDetResults(paramBean); 

以便您可以如下访问它:

 <c:forEach items="${results}" var="result"> ${result.heading} <c:forEach items="${result.data}" var="dataItem"> ${dataItem} </c:forEach> </c:forEach> 

如果你真的坚持让你的DetResults bean保持DetResults ,你可以按如下方式访问它:

 <c:forEach begin="0" end="${results.columnCount}" varStatus="loop"> ${results.headings[loop.index]} <c:forEach items="${results.data[loop.index]}" var="dataItem"> ${dataItem} </c:forEach> </c:forEach> 

也可以看看:

  • JavaBeans被使用的地方?
  • 在JSP页面中使用MVC和DAO模式在HTML中显示JDBC ResultSet

具体问题无关<c:forEach var>属性不正确。 您不应该将它与作用域中的现有对象同名。 它只会冲突。 但是,如果你不能解释错误信息,这是一个新的问题。

你应该能够遍历标题

 <tr> <c:foreach var="heading" items="${results.headings}"> <th>${heading}</th> </c:foreach> </tr> 

然后通过数据…

 <c:foreach var="row" items="${results.data}"> <tr> <c:foreach var="i" items="${row}"> <td>${i}</td> </c:foreach> </tr> </c:foreach> 

或者沿着这些线?