Nel primo articolo di questa serie [9] abbiamo introdotto Wicket Web Beans (WWB), un toolkit per Wicket che permette di visualizzare e editare JavaBeans in modo automatico. Abbiamo visto come WWB genera automaticamente le interfacce utente basandosi sulle proprietà dei Bean e su convenzioni predefinite. In questo secondo articolo approfondiamo le tecniche di personalizzazione, illustrando i diversi modi con cui è possibile modificare il comportamento di default di WWB per adattarlo alle specifiche esigenze dell'applicazione.
Personalizzazione tramite beanprops file
WWB mette a disposizione i beanprops file, file di configurazione che consentono di personalizzare il layout e il comportamento dei Bean senza modificare il codice Java. Supponiamo di avere una Page con il seguente codice:
add( new BeanForm("beanForm", bean, meta) );
}
}
e di volerla personalizzare disponendo su un'unica colonna i field di TestBean e secondo un ordine diverso da quello alfabetico crescente di default. Il contenuto del beanprops file specifico (CustomSimpleBeanPage.beanprops) sarà il seguente:
# Customize TestBean.
TestBean {
cols: 1;
props: firstName, lastName, operand1, operand2, result, -number;
}
Il segno meno davanti alla proprietà number sta ad indicare che non vogliamo visualizzarla. Il layout della Page è quello mostrato in figura 1.
All'interno del file abbiamo indicato il Bean con il solo nome della sua classe. Il nome del package è opzionale. Se però l'applicazione ha due bean classes con lo stesso nome, ma appartenenti a package diversi, bisogna indicare il nome completo per essere sicuri che WWB faccia riferimento a quella corretta. WWB consente l'utilizzo di resource anche all'interno di beanprops file. È possibile quindi fare una cosa del genere:
# Customize TestBean.
TestBean {
cols: 1;
props:
firstName, lastName,
operand1{ label: "This is ${propertyKey} Value" },
operand2,
result, -number;
}
In questo modo abbiamo indicato che la label della proprietà operand1 è costituita da una parte fissa e da una parte variabile in base al valore di una proprietà propertyKey presente in un file .properties applicativo. Per default, i field dei Bean in una pagina sono editabili. Per rendere un field non editabile bisogna impostare la variabile viewOnly a true. Esempio:
# Customize TestBean.
TestBean {
cols: 1;
props:
firstName,
lastName{ label: "Last Name (informational)"; viewOnly: true },
operand1,
operand2,
result, -number;
}
Tramite i .beanprops file è possibile personalizzare anche le action. Riprendendo in esame l'esempio dello scorso articolo e supponendo di voler visualizzare il button relativo alla action clearLastName, il beanprops file diventa:
# Actions Example
TestBean {
props: firstName, lastName, action.clearLastName,
operand1, operand2, result, -number;
}
Le action vanno sempre prefissate con action. Tramite beanprops file è inoltre possibile specificare dei parametri per le action. Esempio:
# Actions Example
TestBean {
actions: save{ ajax: true };
props: firstName, lastName, action.clearLastName,
operand1, operand2, result, -number;
}
In questo modo forziamo l'invocazione del button associato alla action save tramite Ajax (il parametro di tipo org.apache.wicket.ajax.AjaxRequestTarget in ingresso alla action non è più null). Così come per i field, anche per le action è possibile rimuoverle prefissandole con un meno.
WWB annotations
In alternativa ai beanprops file è possibile usare le annotations di WWB per personalizzare una applicazione. Il ricorso alle annotations non esclude i beanprops e viceversa: è sempre possibile combinare le due cose. WWB mette a disposizione le seguenti annotations: @Beans: usata a livello di classe per contenere più di una @Bean annotation. È equivalente a un beanprops file che contiene più di un Bean. @Bean: usata a livello di classe per descrivere un singolo Bean. @Action: usata per personalizzare una action. @Property: usata per personalizzare sia una proprietà che un property method (sia getter che setter) di un Bean. @Tab: usata per personalizzare un Bean.tabs. La descrizione dei tabs verrà fatta nel prossimo articolo di questa serie. @Parameter: usata insieme a @Bean, @Action, @Property, @Tab per impostare parametri non standard. All'interno del codice di una applicazione è possibile aggiungere annotations alle Page, ai Bean o a classi Metadata implementate appositamente dallo sviluppatore.
WWB Metadata API
WWB fornisce anche delle API Java che hanno le stesse funzionalità delle annotations. È più utile ricorrere a queste API nei casi in cui si necessita di impostare la configurazione dei matadati in maniera condizionale. È possibile combinare l'utilizzo di queste API con le annotations e con i beanprops files. Le WWB Java API comprendono: JBeans: contenitore di uno o più Bean. JBean: descrittore di un Bean. Può sostituire JBeans nel caso in cui si abbia un solo Bean. JAction: usata per personalizzare le action. JProperty: usata per personalizzare le proprietà di Bean e Tab. JTab: usata per personalizate i tabs. JParameter: usata per impostare parametri non standard di JBean, JAction, JProperty e JTab.
Conclusioni
In questo secondo articolo sono stati descritti i vari modi (basati sia su funzionalità Wicket che soprattutto su specifiche Web Beans) con cui è possibile personalizzare una applicazione WWB based e darle comportamenti diversi da quelli di default. Nel prossimo e ultimo articolo verranno dettagliatamente descritti altri importanti WWB components quali i tabs e le tables.
Riferimenti
- [1] Karthik Gurumurthy, "Pro Wicket", Apress, 2006
- [2] Guglielmo Iozzia, serie di articoli su Wicket framework pubblicati su Mokabyte a partire da
http://www2.mokabyte.it/cms/article.run?articleId=XIU-464-LXV-CM27f00000111994537_f9c9053a
- [3] Guglielmo Iozzia, serie di articoli su Web Beans pubblicati su Mokabyte a partire da
http://www2.mokabyte.it/cms/article.run?articleId=2U2-E3P-NNC-6VT7f00000110911033_0a4a63e2
- [4] Specifiche Sun JavaBeans
http://java.sun.com/javase/technologies/desktop/javabeans/docs/spec.html
- [5] Sito ufficiale di Wicket Web Beans presso Google
http://code.google.com/p/wicket-web-beans/
- [6] Wicket Web Beans SVN repository
http://wicket-web-beans.googlecode.com/svn/trunk/
- [7] Apache Maven 2
http://maven.apache.org/
- [8] Apache Common BeanUtils
http://commons.apache.org/beanutils/
- [9] Guglielmo Iozzia, primo articolo su Wicket Web Beans su Mokabyte
http://www2.mokabyte.it/cms/article.run?articleId=DSB-E31-MQS-CYC7f00000118359738_ef2466ca
- [10] Java Data Objects (JDO)
http://java.sun.com/jdo/
- [11] Java Persitence API (JPA)
http://java.sun.com/developer/technicalArticles/J2EE/jpa/
