ok,innanzitutto grazie della risposta tempestiva!! Meglio se ti posto qualcosa così hai elementi reali con cui darmi una mano... dato che sono un pò alle prime armi con struts2...
allora, ho una pagina di registrazione ad un sito, alla quale accedo tramite un collegamento ipertestuale del tipo
<s:url id="url" action="SelectNazioni"></s:url><s:a href="%{url}">Registrati</s:a>
quindi questa action si collega al DB, crea una lista di nazioni e come result mi porta alla pagina vera e propria di registrazione, chiamata "registerUser.jsp". Ora, la pagina "registerUser.jsp" conterrà un form che una volta inviato, chiamerà prima il validator(di cui ometterò il codice) e poi la classe java di registrazione. Se per qualsiasi motivo la validation non va a buon fine(tipo ad esempio campi nulli..), dovrebbe ritornare alla pagina "registerUser.jsp" e darmi gli errori di validazione. Il problema è che chiaramente non ripopola la select in quanto questo dovrebbe essere fatto dalla action "SelectNazioni" che non viene richiamata. Ti posto un pò di codice:
struts.xml
codice:
<struts>
<package name="Pacchetto" extends="struts-default">
<action name="Register" class="actions.register">
<result name="input">/registerUser.jsp</result>
<result name="error">/registerUser.jsp</result>
<result name="okay">/registerSuccess.jsp</result>
</action>
<action name="SelectNazioni" class="actions.selectNazioni">
<result name="input">/registerUser.jsp</result>
<result name="okay">/registerUser.jsp</result>
</action>
</package>
</struts>
register.java
codice:
package actions;
import com.opensymphony.xwork2.*;
import java.util.*;
import hibernate.Cliente;
import hibernate.ClienteDAO;
import hibernate.Nazione;
import hibernate.NazioneDAO;
public class register extends ActionSupport{
private String nomeNew = null;
... // altre dichiarazioni
private int nazioneNew;
public String execute() throws Exception{
// Apertura sessione e ricerca di clienti già registrati con la stessa e-mail inserita nel campo "e-mail"
ClienteDAO cDAO = new ClienteDAO();
cDAO.getSession().beginTransaction();
List<Cliente> controlloClienteEmail = cDAO.findByMail(emailNew);
if(controlloClienteEmail.isEmpty()){
// creazione di un nuovo oggetto Cliente e salvataggio dei dati personali all'interno dello stesso
Cliente c = new Cliente();
c.setNome(nomeNew);
... //altri set vari
c.setIdnazione(nazioneNew);
// salvataggio dell'oggetto Cliente appena creato
cDAO.save(c);
cDAO.getSession().flush();
cDAO.getSession().getTransaction().commit();
return "okay";
} else
cDAO.getSession().flush();
cDAO.getSession().getTransaction().commit();
addActionError("E-mail già esistente");
return "error";
}
...
// metodi get e set
selectNazioni.java
codice:
// solita intestazione e import
public class selectNazioni extends ActionSupport{
private List<Nazione> listaNazioni;
public String execute() throws Exception{
listaNazioni = new ArrayList<Nazione>();
NazioneDAO nDAO = new NazioneDAO();
nDAO.getSession().beginTransaction();
List<Nazione> nazioni = nDAO.findAll();
nDAO.getSession().flush();
nDAO.getSession().getTransaction().commit();
int lunghezza = nazioni.size();
for (int h=0; h < lunghezza; h++){
Nazione nazAppoggio = new Nazione();
nazAppoggio.setId(nazioni.get(h).getId());
nazAppoggio.setNazione(nazioni.get(h).getNazione());
listaNazioni.add(nazAppoggio);
}
return "okay";
}
public void setListaNazioni(List<Nazione> value){
listaNazioni = value;
}
public List<Nazione> getListaNazioni(){
return listaNazioni;
}
}
e chiaramente nella "registerUser.jsp" ci sarà:
codice:
<s:form action="Register" method="POST">
<s:select
label="NAZIONE"
name="nazioneNew"
headerKey="0"
headerValue="--seleziona una nazione--"
list="listaNazioni"
listKey="id"
listValue="nazione"
/>
<s:submit value="invia dati"/>
</s:form>
per favore, non stavo proprio riuscendo a implementare prepare (sopratutto dove?) oppure se c'è una soluzione più semplice