我有一个持有结果的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:不知道如何迭代&lt; forEach&gt;中提供的“items”
如果我将结果记录在我的处理程序页面上,如下所示:
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) );
}
日志记录似乎在服务器上显示正常。
答案 0 :(得分:25)
引起:javax.servlet.ServletException:javax.servlet.jsp.JspTagException:不知道如何迭代
<forEach>
中提供的“items”
当<c:forEach items>
没有引用可以迭代的有效对象时,就会发生这种情况。该对象应为Object[]
(普通数组),Collection
,Map
,Iterator
,Enumeration
或String
(另请参阅{ {3}})。 <c:forEach>
无法迭代任何其他内容。您的DetResults
类不是上述任何一种类型的实例,因此它将失败。
您的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,你可以按如下方式访问它:
<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:forEach var>
属性不正确。您不应该为其提供与作用域中现有对象相同的名称。它只会发生冲突。但如果您无法解释错误消息,那么这将成为一个新问题。
答案 1 :(得分:1)
您应该可以遍历标题
<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>
或者沿着这些方向做什么?
答案 2 :(得分:-1)
在Servlet类中的以下代码中进行检查:
request.setAttribute("productList", products);
并且在<c:forEach
的JSP页面中应该匹配:
<c:forEach var= "tempProducts" items= "${productList}">
注意:"productList"
的名称应与1点1和2完全匹配
然后它将。
对我有用。