我有一个保存结果的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:不知道如何迭代中提供的“项目”
如果我将结果记录在我的处理程序页面上,如下所示:
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>
<forEach>
当<c:forEach items>不会引用可对其进行迭代的有效对象时,就会发生这种情况。该目的应该是一个Object[](一个普通的阵列), ,Collection,,Map 或(也参见源代码)。不能迭代其他任何事情。您的课程不是上述任何一个类型的实例,因此它将失败。IteratorEnumerationString<c:forEach>``DetResults
<c:forEach items>
Object[]
Collection
Map
Iterator
Enumeration
String
<c:forEach>``DetResults
您的DetResults课程看起来不正确。它看起来基本上像一个God bean,具有多个单独实体的所有属性的集合。这个不对。Bean类最多只能表示一个实体。重写您的DetResults类,以使您基本上可以得到一整套有价值的javabeans:
DetResults
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原样,则可以按以下方式访问它:
<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>
与 具体问题 无关 ,该<c:forEachvar>属性不正确。您不应为它提供与范围中现有对象相同的名称。只会发生冲突。但这是一个新问题的主题,如果您无法解释错误消息。
<c:forEachvar>