javax.servlet.ServletException: javax.servlet.jsp.JspTagException: non so come eseguire iterazioni sugli “articoli” forniti in

Ho un fagiolo che contiene i risultati. Devo usare JSTL per iterare su di esso e presentare i risultati. Ecco il fagiolo:

public class DetResults { private List headings; private List<Class> types; private List data; public DetResults() {} public List 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 getData( ) { return this.data; } public Object[] getDataAtRow( int row ) { return this.data.get(row); } public void setHeadings( List 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(); 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 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(); this.data.add(val); } public int getColumnCount() { return this.headings!=null?this.headings.size():0; } } 

Ecco il gestore che imposterà il bean al JSP:

 DetResults results = detDAO.fetchDetResults(paramBean); request.setAttribute("results", results); action.setJspURI(".../.jsp"); 

Ho provato a visualizzarlo come segue:

  ${results.heading}  

Ma ha gettato la seguente eccezione:

Causato da: javax.servlet.ServletException: javax.servlet.jsp.JspTagException: non so come eseguire iterazioni sugli “articoli” forniti in

Se registro i risultati sulla mia pagina di gestore in questo modo:

 System.out.println( "\n\nthere are " + results.getColumnCount() + " columns in the result set" ); for( int i=0; i " + results.getType(i) ); } 

La registrazione sembra essere valida sul server.

Causato da: javax.servlet.ServletException: javax.servlet.jsp.JspTagException: non so come eseguire iterazioni sugli “articoli” forniti in

Ciò si verificherà quando non fa riferimento a un object valido su cui può iterare. L’object dovrebbe essere un Object[] (una matrice semplice), una Collection , una Map , un Iterator , Enumeration o una String (vedere anche il codice sorgente ). Tutto il resto non può essere iterato da . La tua class DetResults non è un’istanza di uno dei tipi sopra menzionati, quindi fallirà.

La tua class DetResults non sembra corretta. Sembra fondamentalmente come un fagiolo di Dio con una collezione di tutte le proprietà di più quadro individuali. Questo non è giusto. Una class bean dovrebbe rappresentare al massimo una quadro. Riscrivi la tua class DetResults modo tale che alla fine ti ritroverai con una collezione completa di javabeans:

 List results = detDAO.fetchDetResults(paramBean); 

in modo che tu possa accedervi come segue:

  ${result.heading}  ${dataItem}   

Se si vuole davvero mantenere il bean DetResults così com’è, è ansible accedervi come segue:

  ${results.headings[loop.index]}  ${dataItem}   

Guarda anche:

  • Luoghi in cui vengono utilizzati i JavaBeans?
  • Mostra JDBC ResultSet in HTML nella pagina JSP usando pattern MVC e DAO

Non correlato al problema concreto, l’attributo non è corretto. Non dovresti dare lo stesso nome di un object esistente nell’ambito. Si sarebbe solo scontrato. Ma è sobject a una nuova domanda se non riesci a interpretare il messaggio di errore.

Dovresti essere in grado di scorrere le intestazioni

   ${heading}   

E poi i dati …

    ${i}    

O qualcosa del genere?