класса javax.сервлет.ServletException: javax.сервлет.JSP-страница.JspTagException: не знаю, как перебирать предоставленные "элементы" в
у меня есть Боб, который содержит результаты. Мне нужно использовать 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.сервлет.ServletException: javax.сервлет.JSP-страница.JspTagException: не знаю, как перебирать предоставленные "элементы" в
если я регистрирую результаты на своей странице обработчика следующим образом:
System.out.println( "nnthere 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) );
}
ведение журнала, кажется, показывает нормально на сервере.
2 ответов
вызвано: javax.сервлет.ServletException: javax.сервлет.JSP-страница.JspTagException: не знаю, как перебирать поставляемые "элементы" в
<forEach>
это произойдет, когда <c:forEach items>
не ссылается на допустимый объект, над которым он может выполнять итерацию. Объект должен быть Object[]
(простой массив), a Collection
, Map
, Iterator
, Enumeration
или String
(см. также исходный код). Все остальное не может быть повторено <c:forEach>
. Ваш DetResults
class не является экземпляром любого из вышеупомянутых типов, поэтому он потерпит неудачу.
код DetResults
класс выглядит неправильно. Он выглядит в основном как один Божий боб с коллекцией всех свойств нескольких отдельных сущностей. Это неправильно. Класс bean должен представлять не более одной сущности. Перепишите DetResults
класс, так что вы в основном в конечном итоге с fullworthy коллекция 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>
Читайте также:
- места, где используются JavaBeans?
- показать набор результатов JDBC в HTML на странице JSP с помощью шаблона MVC и DAO
связаны к конкретной проблеме,<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>
или что-то в этом роде?