PDA

View Full Version : [JSF]....ma come faccio a...?


javacomelava
19-11-2009, 13:59
Ciao ragazzi.
Allora ho un'applicazione sviluppata con JSF+Spring+Hibernate.

Il problema è il seguente.

Ho una pagina in cui viene visulizzata una tabella (h: dataTable) con dei prodotti presi da database.

Per ogni prodotto(quindi per ogni riga della tabella)ho inserito un tasto DELETE,per permettere all'utente di poter cancellare dal database (e quindi dalla tabella quel prodotto).

Per cancellare un prodotto dalla tabella prodotto del database ho il solito oggetto Dao richiamato da un service,che si occupa appunto di eliminare il prodotto.

Però in questo caso ho questi due problemi:

il metodo dell'oggetto Dao che cancella dal db ha seguente signature:


public void eliminaProdotto(Prodotto prodotto);


Problema 1: A PARTIRE DALLA TABELLA VISUALIZZATA,COME FACCIO A PASSARE al metodo eliminaProdotto il prodotto di quella riga?

Problema 2: nel ipotetico metodo che effettuerà questa operazione,dovrei anche dire alla pagine di effettuare un refresh(per rendere visibili all'utente la modifica della tabella).Come faccio?


Spero di essere stato chiaro il piu possibile.

Saluti

javacomelava
19-11-2009, 17:28
Ho risolto!

Se a qualcuno può servire dò una piccola spiegazione:

I componenti UI di jsf come le tabelle corrispondo ad oggetti UIComponent.

Precisamente un <h: datatable> corrisponde alla classe UIData.

Fornendo il managed bean di una variabile di istanza UIData con relativi metodi get e set e facendo il binding della tabella nella pagine jsp con la variabile di istanza del managed bean è possibile richiamare il metodo Object getRowData() su quest'ultima in modo da memorizzare in un Object il contenuto della riga selezionata(ovvero della riga dove è stato premuto il bottone).

quindi:

nella pagina JSP:


<h: datatable binding="ManagedBean.dataTable" ..... action="ManagedBean.azioneDaEseguire >


nel MANAGED BEAN:


public class TuoManagedBeans{
.....
.....
private UIData dataTable;
.....
.....
//metodi set e get per dataTable
....
....
public String azioneDaEseguire(){
String result="";
try{
//METODO CHE ESEGUE LA LOGICA
result="success";
return result;
}catch(Exception e){
return result;
}
}



in faces_config.xml :



<managed-bean>
<managed-bean-name>tuoManagedBeans</managed-bean-name>
<managed-bean-class>web.TuoMostraProdotti</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
....
eventuali managed-propery
....
<managed-property>
<property-name>dataTable</property-name>
<value>#{dataTable}</value>
</managed-property>
</managed-bean>

..............
..............

<navigation-rule>
<description>elimina un prodotto dal catalogo</description>
<from-view-id>/tuapaginaJSP.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/tuapagina.jsp</to-view-id>
</navigation-case>
</navigation-rule>



Magari può essere d'aiuto a qualcuno.Ciao

gokan
19-11-2009, 18:56
Ciao, per eliminare una riga dalla tua dataTable e quindi anche dalla tabella che stava dietro hai utilizzato il metodo più corretto e semplice, ossia quello di recuperare la riga corrente tramite un oggetto UIData.

Per quanto riguarda il secondo punto, quello che puoi fare, è di fare una sorta di getList appena prima di tornare alla pagina in cui reindirizzi.

javacomelava
19-11-2009, 19:03
Ciao,grzie per la risposta.

Comunque risolvendo il primo punto ho risolto anche il secondo.

Infatti il metodo che si occupa di eseguire l'azione nel managed beans torna una stringa: "success"

Nelle regole di navigazione ho inserito un Navigation Case che mi "refresha" la pagina quando riceva quella stringa dal metodo!

Saluti