Continuiamo ad analizzare le form espandendo il controllo di prima.
Per prima cosa aggiungiamo un nuovo campo input che chiameremo età nella quale andremo a mettere un intero. Impostando la proprietà myAge ad Integer, Wicket attuerà in automatico il controllo se il dato inserito è effettivamente un numero. Per aggiungere un ulteriore controllo similmente a quello sul name, useremo il validatore chiamato RangeValidator che è una classe di Wicket che gestisce le validazioni di Interi all'interno di un range indicato.
Il codice corrispettivo sarà quindi:
TextField age = new TextField ("age",new PropertyModel(this,"myAge")); age.setRequired(true); age.add(new RangeValidator(5,50));
Come vedete è anche qui molto semplice aggiungere controlli. Non ci dovremo preoccupare di nient'altro e sarà Wicket a fare controlli al posto nostro.
A questo punto però complichiamo le cose. Per il campo surname vogliamo aggiungere un controllo customizzato non presente nei controlli base di Wicket. Per fare questo occorre definire un nostro Validator e aggiungerlo quindi all'oggetto. E' questa una pratica molto usata e che sfrutta molto la componentistica di Wicket perché definendo un validator esterno, lo potremo usare anche in altre form oppure, cosa altrettanto comune, possiamo ridefinire un nostro TextField particolare aggiungendogli un validator inscritto direttamente nella classe.
Andiamo a vedere entrambe le soluzioni.
Per la prima proviamo a creare un validatore esterno.
package it.trewps.testajax.web; import org.apache.wicket.validation.IValidatable; import org.apache.wicket.validation.IValidator; import org.apache.wicket.validation.ValidationError; public class SurnameValidator implements IValidator<String>{ private static final long serialVersionUID = 1L; @Override public void validate(IValidatable<String> validatable) { String value = validatable.getValue(); if (!value.matches("[A-Z]{3}[0-9]{2}")){ ValidationError error = new ValidationError(); error.setMessage("Non va molto bene"); validatable.error(error); } } }
I validatori devono implementare l'interfaccia IValidator a cui ovviamente va impostato il tipo di oggetto da validare (in questo caso stringa). Il metodo obbligatorio da implementare è ovviamente validate che si occupa ovviamente di fare l'effettivo controllo sul dato che viene passato come parametro in ingresso nell'oggetto validatable sui cui possiamo lanciare la getValue() per farci tornare il valore effettivo.
In questo esempio controlliamo il campo con una espressione regolare ed in caso di incorrettezza, istanziamo un oggetto error impostando poi il parametro validatable.error. Se questo dato è settato, allora il validatore avverte l'oggetto a cui è associato, che il campo è sbagliato ritornando poi il testo contenuto nel messaggio dentro l'oggetto error passato al metodo.
Associare questo Validator all'oggetto TextField è molto semplice. Basterà aggiungere l'oggetto validator per implementare automaticamente l'operazione.
TextField surname = new TextField ("surname",new PropertyModel(this,"mySurname")); surname.setRequired(true); surname.add(new SurnameValidator());
Il controllo viene ovviamente operato dopo che Wicket avrà controllato l'effettivo riempimento del campo dato che la setRequired agisce ovviamente prima.
Ecco al lato pratico cosa succede.
Il campo cognome ha effettivamente un valore ma non essendo conforme al Validator, viene ritornato il messaggio di errore che avevamo impostato.
Qua sotto invece abbiamo un esempio molto comune in ambito Wicket. Se il validator è molto personalizzato su uno specifico input, possiamo pensare di ridefinire direttamente tutto l'imput implementandovi dentro il validator stesso.
Qua sotto abbiamo creato un nuovo TextField chiamato MySurnameTextField estendendo il TextField base di Wicket. Privatamente alla classe abbiamo ricreato il validatore che altri non è che la copia pari pari della classe vista sopra con la differenza che questa è private.
Ridefiniamo poi tutti i costruttori dell'oggetto originale (anche se non siamo obbligati) ed aggiungiamo ad ognuno l'istruzione per aggiungere il validatore.
package it.trewps.testajax.web; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.IModel; import org.apache.wicket.validation.IValidatable; import org.apache.wicket.validation.IValidator; import org.apache.wicket.validation.ValidationError; public class MySurnameTextField extends TextField<String>{ private static final long serialVersionUID = 1L; public MySurnameTextField(final String id) { super(id); add(new SurnameValidator()); } public MySurnameTextField(final String id, final Class<String> type) { super(id); setType(type); add(new SurnameValidator()); } public MySurnameTextField(final String id, final IModel<String> model) { super(id, model); add(new SurnameValidator()); } public MySurnameTextField(final String id, IModel<String> model, Class<String> type) { super(id, model); setType(type); add(new SurnameValidator()); } private class SurnameValidator implements IValidator<String>{ private static final long serialVersionUID = 1L; @Override public void validate(IValidatable<String> validatable) { String value = validatable.getValue(); if (!value.matches("[A-Z]{3}[0-9]{2}")){ ValidationError error = new ValidationError(); error.setMessage("Non va molto bene personale"); validatable.error(error); } } } }
Al lato del richiamo basterà creare un nuovo oggetto del tipo che abbiamo creato. Non c'è bisogno di aggiungere il validator dato che sarà incluso direttamente nell'oggetto MySurnameTextField.
MySurnameTextField mySurname = new MySurnameTextField("surname",new PropertyModel(this,"mySurname")); mySurname.setRequired(true);
Nessun commento:
Posta un commento