Newsgroup: it.comp.java
Titolo: Errore caricando una List in una dataTable

Salve ancora a tutti...
Premetto e ribadisco che sono un niubbo di JSF e lo sto ancora
studiando...
Allora, ho provato a caricare una dataTable con una List...
La dataTable è questa:
---------------------------------------------------
    <h:dataTable border="1" value="#{IO.ListaDottori}" var="current">
        <h:column id="column1">
            <f:facet name="header">
                <h:outputText value="Nome"></h:outputText>
            </f:facet>
            <h:outputText value="#{current.nome}"></h:outputText>
        </h:column>
        <h:column id="column2">
            <f:facet name="header">
                <h:outputText value="Cognome"></h:outputText>
            </f:facet>
            <h:outputText value="#{current.cognome}"></h:outputText>
        </h:column>
    </h:dataTable>
---------------------------------------------------
Questa è la funzione ListaDottori nella classe IO:
---------------------------------------------------
    public List ListaDottori() {
        Session session = sf.getCurrentSession();
        session.beginTransaction();
        List result = session.createQuery("from Dottore").list();
        session.getTransaction().commit();
        return result;
    }
---------------------------------------------------
E questa è la parte di faces-config.xml dove definisco il managedbean
per la classe IO:
---------------------------------------------------
    <managed-bean>
        <managed-bean-name>io</managed-bean-name>
        <managed-bean-class>util.IO</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
---------------------------------------------------
Quando apro la pagina JSP il tutto viene scaturito questo bellissimo
errore:
---------------------------------------------------
An error occurred at line: 43 in the jsp file: /test.jsp
The method setVar(String) in the type DataTableTag is not applicable
for the arguments (JspValueExpression)
40:
41:
42:
43: 	<h:dataTable border="1" value="#{IO.ListaDottori}" var="dottore">
44: 		<h:column id="column1">
45: 			<f:facet name="header">
46: 				<h:outputText value="Nome"></h:outputText>
---------------------------------------------------
Qualcuno mi sa dare qualche dritta o qualche consiglio? dove sto
sbagliando?
Grazie a tutti in anticipo.


ho fatto delle modifiche per quello fin dove potevo arrivare a
capire...
La funzione ListaDottori adesso ha il suo get, quindi:
---------------------------------------------------
	private List listadottori;
	public List<Dottore> getListadottori() {
	    Session session = sf.getCurrentSession();
	    session.beginTransaction();
	    List listadottori = session.createQuery("from Dottore").list();
	    session.getTransaction().commit();
	    return listadottori;
	}
---------------------------------------------------
poi il tag della datatable è stato modificato in questo modo:
---------------------------------------------------
	<h:dataTable border="1" value="#{io.listadottori}" var="current">
---------------------------------------------------
visto che il managedbean della classe IO è questo:
---------------------------------------------------
	<managed-bean>
		<managed-bean-name>io</managed-bean-name>
		<managed-bean-class>util.IO</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>
---------------------------------------------------
però mi scaturisce sempre lo stesso errore... :-/
---------------------------------------------------
An error occurred at line: 50 in the jsp file: /test.jsp
The method setVar(String) in the type DataTableTag is not applicable
for the arguments (JspValueExpression)
47:
48:
49:
50: 	<h:dataTable border="1" value="#{io.listadottori}" var="current">
51: 		<h:column id="column1">
52: 			<f:facet name="header">
53: 				<h:outputText value="Nome"></h:outputText>
---------------------------------------------------
ora magari, sarà il venerdi, ma mi sto abbattendo... :D
Datemi qualche dritta!!! ;)
Grazie a tutti!

 [CUT]
Era una maledetta libreria buggata...
ho trovato la soluzione qui, magari interessa anche a
qualcun'altro... :)
http://devtribalknowledge.blogspot.com/2008/05/datatabletag-broken-in-suns-javaserver.html
ciao a tutti :)

 La funzione ListaDottori adesso ha il suo get, quindi:
Sei conscio vero che quel getListadottori potrebbe essere chiamato piu' 
di una volta per richiesta? Grazie alla cache di primo livello di 
Hibernate ti salvi pure decentemente, ma rimane cosa da non fare.
Altra cosa, passa a Facelets prima che puoi (avresti pure evitato questo 
bug). 
In JSF 2.0 sarà pure la tecnologia standard.

 In JSF 2.0 sarà pure la tecnologia standard.
capisco, intanto comunque mi studio JSF che per me gia è cosa nuova...
puoi consigliarmi qualche libro/sito?
grazie delle dritte :)

 grazie delle dritte :)
Facelets sarebbe al posto delle JSP, non di JSF.

 Facelets sarebbe al posto delle JSP, non di JSF.
ah ok... vedrò più avanti... ;)

 puoi spiegarmi meglio? grazie :)
<h:dataTable value="#{bean.list}">...</h:dataTable>
Il tuo Bean.getList() fa una query ogni volta che viene chiamato.
JSF puo' eseguire quell'espressione (#{bean.list}) anche due o tre
volte durante la richiesta, per motivi suoi, e questo causa un sacco
di chiamate ad Hibernate inutili.
Basterebbe un getter un po' furbo:
public List getList() {
  if (list == null) {
    list = em.createQuery("....").getResultList();
  }
  return list;
}


ora ho capito... grazie 1000 per la dritta ;)