Prima però occorre fare una distinzione per capire come funzionano le cose in Wicket a differenza di quanto accade in altri linguaggi come PHP.
In quest'ultimo si crea una form in qualche modo e nella pagina di arrivo della action si leggono i dati tramite variabili come $_POST o $_REQUEST o $_GET in base al method della form.
In Wicket tutto questo è bypassato dal fatto che la form è una componente stessa di Wicket e quindi vive di vita propria ed è provvista di tutte le utility per gestire i dati, la validazione ed i messaggi di output.
La cosa che occorre capire prima di tutto è che una FORM deve essere bindata su un modello. Un modello è in pratica una maschera dell'output della form stessa e sul cui oggetto è possibile ricavare i dati inseriti.
Nel nostro esempio creeremo una semplice form con un solo campo bindato sul modello di una classe Country con una sola proprietà di tipo Stringa.
private String country; public void setCountry(String country) { this.country = country; } public String getCountry() { return country; } }
La classe Country è banale e ci serve più che altro per far capire come funziona il modello della form. Nel caso più comune, una form lancia poi una stampa o un inserimento/salvataggio da qualche parte. Solitamente si ha un oggetto con le sue proprietà che sono poi mappate sui campi della form.
Se per esempio abbiamo una classe "Utente" con proprietà userid, password ed email, è presumible che la form richieda questi tre campi.
In questi casi, che sono i più semplici, si crea una form in Wicket associandogli l'oggetto di bind che in gergo viene chiamato Model.
I campi della form vengono poi legati ad una proprietà dell'oggetto modello che verrà riempito in automatico al momento della submit.
Nell'esempio sopra il nostro oggetto modello ha una sola proprietà di tipo stringa mentre la nostra form avrà un solo campo TEXT legato ad esso.
<wicket:panel> <form wicket:id="countryForm"> <input wicket:id="country" /> <input wicket:id="submit" type="submit" /> </form> </wicket:panel>
Per l'occasione ho creato un oggetto Panel con dentro la form.
Il codice come vedete è molto semplice. Occorre solo ricordarsi di associare i wicket:id agli elementi opportuni.
final Form cForm = new Form("countryForm",new CompoundPropertyModel(new Country())); final TextField<String> cField = new RequiredTextField<String>("country"); Button sButton = new Button("submit"){ private static final long serialVersionUID = 1L; public void onSubmit(){ //String value = cField.getValue(); Country ciao = (Country) cForm.getModelObject(); System.out.println("Hai inserito: "+ciao.getCountry()); } }; cForm.add(cField); cForm.add(sButton); return cForm;
Il codice della form è molto semplice.
Come prima cosa creiamo un oggetto FORM (che è un oggetto di Wicket) dandogli il nome (ovvero il wicketID del codice HTML e successivamente il CompoundPropertyModel.
NB: Wicket ha diversi tipi di modelli. Se la vostra FORM è mappabile 1:1 con le proprerty di un oggetto, allora conviene usare la CompoundPropertyModel.
Nell'esempio sopra come modello gli passiamo una istanza al volo dell'oggetto Country. La form adesso sa che nelle sue input possiamo creare un legame tra un input ed una proprietà dell'oggetto.
Subito sotto infatti creiamo un input di tipo text obbligatorio (RequiredTextField) di tipo String, bindato su "country". Quel country altro non è che il nome della proprietà dell'oggetto Country ovvero la sua variabile Stringa interna.
Il secondo input è il tasto submit (Button per Wicket). Sovrascrivendo il metodo onSubmit possiamo effettuare operazioni dopo che la form è stata inviata ed è stata validata da Wicket.
Nell'esempio sopra chiediamo quindi alla form stessa, di ritornarci un oggetto di tipo Country che ovviamente sarà automaticamente riempito da ciò che avevamo messo nella form.
L'istruzione getModelObject() significa proprio: "Dammi l'oggetto su cui eri basato". La variabile ciao è a tutti gli effetti un oggetto Country il cui parametro interno è stato riempito dal valore del campo TEXT che gli avevamo legato.
Usando poi il metodo getCountry possiamo stamparlo in console.
Nessun commento:
Posta un commento