Visualizzazione dei risultati da 1 a 9 su 9

Discussione: struts 2 validazione

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    309

    struts 2 validazione

    Ciao a tutti,
    avrei 2 quesiti:
    ho fatto una form usando i tag di struts. in particolare s:select la popolo prendendo dei dati da un db (nella classe sotto la popolo si stringhe). Ho creato una Action che mi porta alla visualizzazione del form:
    codice:
    import com.opensymphony.xwork2.*;
    import java.util.ArrayList;
    
    public class CreaForm extends ActionSupport{
        
        private ArrayList<String> arr = new ArrayList<String>();
        
        public void setArr(ArrayList<String> a){
            this.arr = a;
        }
        public ArrayList<String> getArr(){
            return this.arr;
        }
        
        @Override
        public String execute()  {
            arr.add("primo");
            arr.add("secondo");
            arr.add("terzo");
            return SUCCESS; 
        }
        
    }
    la select viene popolata.
    per la validazione ho creato il file xml e mi da errori in caso i campi che voglio controllare sono vuoti. Il problema che mi sta facendo impazzire da ieri è che se non compilo i campi e ho gli errori, la select non riprende i dati....

    altro dubbio è che quando popolo la select da db, la popolo nel seguente modo:
    codice:
    <s:select label="periodo" name="periodo" list="lista" listKey="idPeriodo"  
                                listValue="periodo" emptyOption="true">
    in pratica imposto sia il value della option della select che il valore che visualizza.
    come faccio a verificare il valore di listKey oppure il valore di listValue?

    grazie mille
    tomcat 6.016
    netbeans 6.1

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    309
    ciao
    sono riuscito a risolvere, di seguito la soluzione magari torna utile a qualcuno:
    uno spunto l'ho avuto da
    link
    in pratica nella action si deve implementare l'interfaccia Preparable. si fa l'override del metodo prepare().
    il link postato mi aveva però madato fuori strada. il metodo prepare da li semra debba restituire una stringa invece è void
    tomcat 6.016
    netbeans 6.1

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    309
    dimenticavo, per la seconda domanda viene preso il value della option di <s:select>

    ciao
    tomcat 6.016
    netbeans 6.1

  4. #4
    Mi stavo scornando praticamente con lo stesso problema...grazie delle preziose info, dovrei aver risolto anche io!

  5. #5
    dardo scusami... posso chiederti di postare la tua soluzione dato che nn sto proprio riuscendo a far funzionare nè nella maniera "prepare" nè con il secondo metodo, quello dell'action tag (che mi restituisce un form vuoto con solo il pulsante submit).
    Ti ringrazio anticipatamente della risposta

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    309
    Ciao
    riporto il codice scritto precedentemente con l'aggiunta del prepare:
    codice:
    import com.opensymphony.xwork2.*;
    import java.util.ArrayList;
    
    public class CreaForm extends ActionSupport implements Preparable{
        
        private ArrayList<String> arr = new ArrayList<String>();
        
        public void setArr(ArrayList<String> a){
            this.arr = a;
        }
        public ArrayList<String> getArr(){
            return this.arr;
        }
        
         private String s;
         public void setS(String s){
           this.s = s;   
         }
         public String getS(){
            return this.s;
         }
        
        @Override
        public void prepare(){
            arr.add("primo");
            arr.add("secondo");
            arr.add("terzo");
        }
    
        @Override
        public String execute()  {
            arr.add("primo");
            arr.add("secondo");
            arr.add("terzo");
            return SUCCESS; 
        }
        
    }
    in pratica nell'override del metodo prepare devi riportare le liste che popolono le " s:select" di struts.

    naturalmente invece di fare come scritto nulla ti vieta di richiamare un metodo che restituisce un ArrayList che prende dati da un db.
    Ti dico di crearti un metodo visto che come noti il codice è ripetitivo.
    altra cosa se popoli la lista direttamente nel tag s:select. se la lista la scrivi nel tag non c'è bisogno di estendere preparable. Per quanto riguarda il valore devi, nella action che hai scritto dichiarare la variabile String o altro con i suoi soliti metodi set e get in modo da prendere il valore selezionato. naturalmente il nome della variabile che inserisci nella action deve corrispondere al valore che dai all'attributo name del tag a cui ti riferisci.
    Da notare che il metodo prepare è da inserire nella classe che gestisce la validazione quindi nella action (attributo) del tag s:form
    spero di aver spiegato bene...
    magari se posti un pò di codice, con anche la porzione del file struts.xml posso provare a dare un'occhiata e vedere dove può essere l'errore.
    tomcat 6.016
    netbeans 6.1

  7. #7
    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

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    309
    allora, io personalmente o provato a dare un resul personalizzato ma non lo considerava poi o raggirato il problema in altro modo...
    tornando al problema
    la action SelectNazioni che ti rimanda alla pagina di registrazione la quale visualizza la lista.
    La classe che gestisce l'azione sopra popola la lista che ti serve.
    L'azione ti manda nella pagina di registrazione. a questo punto la classe register si occupa di registrare l'utente e controllare che i dati inseriti sono giusti.
    è in questa classe che devi inplementare Prepare. poi nel metodo prepare di cui farai l'override scriverai il codice (come in selectNazioni) per popolare la lista. questo è il motivo per cui ti dicevo che magari è preferibile fare una classe di utility dove avrai i metodi che serviranno a popolare le select.
    nel caso tuo:
    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 implements Preparable{
    
    
    //il codice da aggiungere alla classe register
    
    // set e get delle liste
    private List<Nazione> listaNazioni;
    public void setListaNazioni(List<Nazione> value){
    	listaNazioni = value;
    }
    public List<Nazione> getListaNazioni(){
    	return listaNazioni;
    }
    
    
    public void prepare(){
       //qui viene inserito il codice per popolare le select
       
       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);
       }
    
    }
    personalmente non uso hibernate e non ho esteso il validator, mi sono accontentato di quello che ho a disposizione. aggiungendo questo codice alla classe register dovrebbe ripopolare la select.
    tomcat 6.016
    netbeans 6.1

  9. #9
    Ti ringrazio tantissimo! Funziona praticamente tutto!! Grazie ancora sei stato molto gentile, finalmente va!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.