In questa sezione sono riportate le domande più frequenti emerse durante l' utilizzo di guigen relative alla validazione dei dati immessi da utente.
Q: Ho letto che esiste la possibilità di modellare i constraint di validazione dei dati immessi mediante gli attributi datatypeModifier e required presenti sia nella classe Widget che nella classe Field: qual'è la differenza?
A: gli attributi datatypeModifier e required presenti sul Widget vanno utilizzati quando:
Q: qual'è la sintassi da utilizzare per indicare i constraints di validazione che devono essere inseriti nell'attributo datatypeModifier?
A: Riportiamo qui di seguito un estratto sintetico delle impostazioni possibili.
Tutti i controlli modellabili mediante l'attributo dataTypeModifier del widget devono avere formato
<validatore>:<regole>.
L'elemento <validatore> è obbligatorio; in caso di assenza non verrà generata nessuna annotazione. L'elemento <regole> può essere obbligatorio o opzionale a seconda del tipo di validatore. Nel caso di regole opzionali, è indifferente la presenza o meno del segno due punti (:) che verrà comunque ignorato.
E' compito di chi utilizza lo strumento di modellazione assicurarsi che la sintassi del controllo modellato rispetti quella indicata per ciascun validatore. Il generatore effettua una serie limitata di controlli formali per ciascun tipo di validatore. In particolare:
Di seguito sono elencati i validatori utilizzabili per i vari tipi di dato.
Controlla che la lunghezza di una stringa sia compresa tra un minimo e un massimo numero di caratteri specificati.
sintassi:
size:<minsize>,<maxsize>
I due parametri sono mutualmente opzionali (ovvero uno dei due è obbligatorio) e la semantica è da intendersi in senso inclusivo.
Esempi:
size:3,10: lunghezza ammessa da 3 a 10 inclusisize:,10: lunghezza ammessa da 0 a 10 inclusisize:3,: lunghezza ammessa superiore o uguale a 3Controlla che l'aderenza della stringa all'espressione regolare specificata.
sintassi:
regexp:<espressione_regolare>
Controlla che il valore numerico sia compreso in un range specificato.
sintassi:
range:<min>,<max>
I due parametri sono mutualmente opzionali (ovvero uno dei due è obbligatorio) e la semantica è da intendersi in senso inclusivo.
Esempi:
range:30,1000: il valore deve essere compreso tra 30 e 1000 estremi inclusisize:,1000: il valore deve essere minore o uguale a 1000size:3,: il valore deve essere maggiore o uguale a 3Per il tipo DATE esiste un validatore di default attivato senza necessità di specificare nulla (valida le date nel formato dd/MM/yyyy).
sintassi:
short
Il formato verificato è:
hh:mm (HOUR)dd/MM/yyyy-hh:mm (DATETIME)sintassi:
extended
Il formato verificato è:
hh:mm:ss (HOUR)dd/MM/yyyy-hh:mm:ss (DATETIME)sintassi:
format:<pattern>
viene verificata l'aderenza al formato specificato. Il formato può essere:
gg/mm/aaaa (solo per il tipo DATE) che permette di
effettuare una validazione più precisa (non solo sintattica) della datasintassi:
custom:<classe java del validatore>
Per tutti i tipi di dato è possibile specificare un custom validator che deve essere implementato secondo le specifiche di struts2.
Q: vi sono delle limitazioni nell'uso dichiarativo dei meccanismi di validazione?
A: Si. Allo stato attuale sono presenti le seguenti limitazioni:
E' necessario pertanto implementare la validazione di obbligatorietà nella business logic.
Nota: la limitazione è legata alla tecnologia struts2: poichè le validazioni modellate si traducono in annotazioni java sugli oggetti dello strato model; in assenza del campo di input nella pagina html renderizzata (evenienza che accade in tutte le casistiche sopracitate) il browser non passa nessuna informazione di valori nella richiesta http e questo ingenererebbe un errore di campo obbligatorio mancante.
Q: come è possibile visualizzare a video gli eventuali errori di validazione?
A: Gli errori di validazione riferiti ai campi sono visualizzabili in due modalità
Q: sto eseguendo logica di validazione all'interno della logica applicativa. Come posso restituire all'utente un feedback sugli eventuali errori, associandoli ai widget che hanno manifestato l'errore?
A: Nella logica applicativa è possibile inserire gli errori rilevati
durante il processo di validazione programmatica nell'oggetto ExecResults.
In particolare per inserire un messaggio di errore non riferito ad un singolo campo è necessario utilizzare una istruzione simile alla seguente:
results.getGlobalErrors().add("messaggio di errore");
Per inserire invece un messaggio di errore relativo ad un determinato campo è necessario utilizzare il seguente codice:
String chiave = APPDATA_XXXXX+"."+"nomecampo";
String messaggio = "Il campo non e' corretto";
results.getFieldErrors().put(chiave, messaggio);
Dove:
Q: e' possibile fare in modo che, per qualche specifico evento, non venga eseguita la validazione?
A: Si, è sufficiente impostare a true il valore dell'attributo skipValidation sull'EventHandler per cui non si vuole far eseguire la validazione
Q: ho modellato un constraint di validazione su un Field di un ComplexType: è possibile fare in modo che tali vincoli agiscano solo quando il campo è collegato ad un certo widget e non agiscano se collegato ad un altro widget?
A: No non è possibile. Per avere il comportamento richiesto è necessario modellare due differenti strutture dato.