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

Doc*_*day 7 foreach jsp jstl

我有一个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; }

}
Run Code Online (Sandbox Code Playgroud)

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

DetResults results = detDAO.fetchDetResults(paramBean);
request.setAttribute("results", results);
action.setJspURI(".../.jsp");
Run Code Online (Sandbox Code Playgroud)

我试着把它显示如下:

<c:forEach var="results" items="${results}">
    ${results.heading}
</c:forEach>
Run Code Online (Sandbox Code Playgroud)

但它引发了以下异常:

引起:javax.servlet.ServletException:javax.servlet.jsp.JspTagException:不知道如何迭代<forEach>中提供的"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) );
}
Run Code Online (Sandbox Code Playgroud)

日志记录似乎在服务器上显示正常.

Bal*_*usC 27

引起:javax.servlet.ServletException:javax.servlet.jsp.JspTagException:不知道如何迭代提供的"items"in <forEach>

<c:forEach items>没有引用它可以迭代的有效对象时,就会发生这种情况.该目的应该是一个Object[](一个普通的阵列), ,Collection,,Map 或(也参见源代码).其他任何东西都无法迭代.您的类不是上述任何一种类型的实例,因此它将失败.IteratorEnumerationString<c:forEach>DetResults

你的DetResults班级看起来不对劲.它看起来基本上像一个上帝豆,具有多个单个实体的所有属性的集合.这个不对.bean类最多应代表一个实体.重写你的DetResults课程,以便你最终得到一个完整的javabeans集合:

List<DetResult> results = detDAO.fetchDetResults(paramBean);
Run Code Online (Sandbox Code Playgroud)

以便您可以按如下方式访问它:

<c:forEach items="${results}" var="result">
    ${result.heading}
    <c:forEach items="${result.data}" var="dataItem">
        ${dataItem}
    </c:forEach>
</c:forEach>
Run Code Online (Sandbox Code Playgroud)

如果你真的坚持保持DetResultsbean的原样,你可以按如下方式访问它:

<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>
Run Code Online (Sandbox Code Playgroud)

也可以看看:


具体问题无关,<c:forEach var>属性不正确.您不应该为其提供与作用域中现有对象相同的名称.它只会发生冲突.但是,如果您无法解释错误消息,则会遇到新问题.