gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:38:46 26 4
gpt4 key购买 nike

我有一个保存结果的 Bean。我需要使用 JSTL 对其进行迭代并呈现结果。这是 bean :

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>

但它抛出了以下异常:

Caused by: javax.servlet.ServletException: javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in <forEach>



如果我像这样在处理程序页面上记录结果:
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) );
}

日志记录似乎在服务器上显示良好。

最佳答案

Caused by: javax.servlet.ServletException: javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in <forEach>



<c:forEach items> 时会发生这种情况不引用它可以迭代的有效对象。对象应该是 Object[] (一个普通数组),一个 Collection , Map , Iterator , Enumeration String (另见 source code )。其他任何东西都不能被 <c:forEach> 迭代.您的 DetResults class 不是上述任何一种类型的实例,因此它会失败。

您的 DetResults类看起来不对。它看起来基本上就像一个神 bean ,具有多个个体实体的所有属性的集合。这个不对。一个 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>

也可以看看:
  • Places where JavaBeans are used?
  • Show JDBC ResultSet in HTML in JSP page using MVC and DAO pattern


  • 无关 到具体问题, <c:forEach var>属性不对。您不应为其指定与作用域中现有对象相同的名称。只会冲突。但是,如果您无法解释错误消息,那么这将是一个新问题的主题。

    关于jsp - javax.servlet.ServletException : javax. servlet.jsp.JspTagException:不知道如何在 <forEach> 中迭代提供的 "items",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9134862/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com