Newsgroup: it.comp.java
Titolo: Struts: problema con ActionForm e validazione

Ciao a tutti.
Ho cominciato da poco a studiare il framework Struts. Spero che possiate 
aiutarmi perché la vedo buia :(
Il mio problema: devo raccogliere in una pagina una serie di link che 
rimandano a delle opportune azioni; ad esempio "login", "iscrizione", 
"vediListaItem", ecc.
Ho pensato di utilizzare come Action la LookupDispatchAction (lo so ,è 
una scelta strana, infatti non ne sono sicuro), così ci metto tutti 
pulsanti submit che mi selezionano il metodo giusto da eseguire. Il 
metodo funziona se non c'è validazione, ma se provo ad attivare la 
validazione dei campi username/password ogni volta che faccio un'azione 
diversa del login il DynaValidatorForm mi impedisce di proseguire perché 
giustamente vede che i campi username/pwd sono vuoti; ma io non voglio 
riempirli se mi iscrivo!!
Una soluzione è usare il pulsante cancel per l'iscrizione che mi 
permette di saltare la validazione. Ok, ma se mi serve ancora un'altro 
cancel? Potrei anche usarne un altro, ma a quel punto Struts non 
riconosce più la funzione cancel! (documentato in 
http://struts.apache.org/userGuide/struts-html.html#cancel
).
Potrei risolvere con DispatchAction? (anche se significa per me 
riscrivere daccapo tutte le action che ho fatto; mi ci ero affezionato, 
almeno finché funzionavano).
Come posso fare quindi a selezionare tutta una serie di azioni senza 
incappare in validazione di campi che in quel momento non servono?
Grazie.

Ora non ricordo bene i dettagli di come l'avevo implementata, però
anch'io ho avuto un problema simile e anzichè utlizzare la normale
classe validator, ne avevo scritta una ereditando da questa che non
faceva altro che controllare nel metodo (se non ricordo male
validate(..)) se un campo preso per convenzione e sempre presente sui
form per i quali volevo poter attivare/disattivare la validazione...
In breve:
nella jsp:
<form action="xxxx">
<campo hidden id="da_validare" value="true">
</form>
nel metodo validate (non ricordo la sintassi - la invento):
if (DynaForm.Item("da_validare").equals("true"))
    super.validate();
return true;
Spero di essere stato abbastanza chiaro

PS: Dimenticavo...
ovviamente con javaScript in base al tasto che effettua la submit puoi
cambiare il valore del campo hidden!!!

Grazie per la risposta!
Perň voglio evitare del tutto l'uso di Javascript perché non voglio fare 
affidamento sul client per nessuna funzione del server (e poi perché lo 
dovrei studiare da zero).
Sto leggendo ora qualcosa a proposito della disabilitazione selettiva 
delle regole di validazione del framework Validator in base all'azione 
da svolgere, ma per me č tutto da vedere...

 da svolgere, ma per me è tutto da vedere...
Beh allora anzichè il campo hidden che determina la validazione in
ogni metodo validate anzichè tale campo controlli il campo che indica
l'azione (ce l'hai vero?)
ovvero, in brevissimo:
metodo validate()
  if (form.hidden_azione.equals("inserisci") ||
tutte_le_azioni_che_vuoi)
         super.validate();
  return true;

Scusa stai usando LookupDispatchAction, ti ho detto una ca...a
ultima soluzione:
imposta validate=false
nei metodi dell'action che necessitano validazione chiami il metodo
validate dell'oggetto ActionForm che ti viene passato come parametro...
Spero funzioni... ciao

Alex ha scritto:

Uhm, per adesso ho rimandato il problema ad una pagina successiva che 
devo costruire ancora. Intanto ho risolto rinunciando alla 
LookupDispatch e usando tante action quante sono le operazioni (tedioso, 
ma efficace).
Pensando alla tua soluzione, mi pare che possa andare, anche se di fatto 
si rimescola la sequenza ordinaria del controller: cioč l'originale 
sarebbe (tagliando..)
- ActionForm: creazione(o riutilizzo), popolamento, _validazione_
- creazione ActionErrors (eventuali) e rinvio della request
- _se tutto č andato bene_ invocazione Action associata alla request.
- forward finale
Tu dici di fare:
- ActionForm: creazione, popolamento.
- invocazione Action
- invocazione validate()
- e qui la procedura non č piů standard; forse il Form ritorna in 
maniera corretta la request con dentro gli ActionErrors se ci sono 
errori; se non ci sono errori la palla a chi passa? Forse richiama 
ActionForward tutto da solo e prosegue con una request senza errori. 
Boh, per allestire la prova mi ci vorrŕ un pň di tempo...
Grazie ancora per l'interessamento, ciao!
P.S.
A proposito, io sto andando avanti dall'inizio con ActionMessages perché 
  ActionError č deprecato, ed anche saveErrors(request, _ActionErrors_). 
Fino ad ora ha funzionato con html:messages ma non so se andando avanti 
potrei avere problemi, tu ne sai niente?

 potrei avere problemi, tu ne sai niente?
java.lang.Object
  |
  +--org.apache.struts.action.ActionMessages
        |
        +--org.apache.struts.action.ActionErrors
Non dovresti avere problemi in quanto ActionErrors eredita da
ActionMessages... poi sicuramente tu utilizzi saveErrors(request,
_ActionMessages_)

 
Ebbene, non so cosa ho toccato, ma non riesco più a vedere i messaggi 
ActionMessages. Il tag html:messages non li mostra, eppure guardando gli 
oggetti in scope request c'è tutto quello che ci dovrebbe essere, cioè 
ad esempio, nel caso di password diverse ho in memoria:
org.apache.struts.action.ACTION_MESSAGE
     {iscrizione=[errore.iscrizione.passworddiverse[Password 2, Password]]}
Però il tag non fa vedere il messaggio associato alla chiave 
errore.iscrizione.passworddiverse

 errore.iscrizione.passworddiverse
Ho risolto la seconda parte, mi confondevo con i tag. In pratica usavo 
saveMessages invece che saveErrors. Con saveErrors poi si deve usare per 
forza il tag html:errors, non html:messages.
Mi pare di aver capito che andrebbe bene anche saveMessages (accoppiato 
però necessariamente con html:messages, ma bisogna impostare anche 
un'altra proprietà messages a true. Dove vada specificata questa 
proprietà al momento non ne ho idea).
(ah, la risposta è per i posteri.. :)
Ciao.

 vuoti, anche se in effetti li vedo per la prima volta.
Ho risolto anche questo, è che non avevo capito una "mazza" sui forward. 
Qui il problema era che invocavo la pagina proprio con il path della 
action che necessitava dei dati del form. Invece usando una 
ForwardAction intermedia non ho più nessun problema.
(sempre per i posteri, come l'altra risposta... ;) ).