|
Proseguiamo nella presentazione del framework Wicket Web Beans. Per la comprensione del presente articolo valgono le raccomandazioni fatte nel precedente [9] riguardo le conoscenze e le letture preliminari. La versione di Wicket Web Beans a cui faremo riferimento è sempre la 1.1.
Customizzazione
Come abbiamo visto nell’articolo precedente, Wicket Web Beans (WWB) ordina per default i campi in una pagina in base al nome della property che li rappresenta e li posiziona in una griglia di tre colonne. È possibile cambiare questo modo di ordinare i campi personalizzando i WWB Metadata di un Bean. La customizzazione può essere eseguita tramite uno dei seguenti strumenti:
- Wicket .properties file;
- Beanprops property file: è simile a un .properties file di un component Wicket, ma specifico per i bean;
- WWB annotations;
- WWB metadata API;
- JDO [10] o JPA [11] @Column annotations.
È anche possibile combinare l’utilizzo di più di uno di questi strumenti. Non esiste una regola generale per utilizzarne uno rispetto agli altri: la scelta dipende sempre dal caso specifico che si sta trattando. Per quanto riguarda poi il solo look and feel è sempre possibile personalizzare le pagine tramite CSS.
Wicket properties files in WWB
Come accennato al paragrafo precedente, anche in WWB è possibile utilizzare i file .properties di Wicket. Sono dei file contenenti delle coppie chiave-valore del tutto simili a quelli che vengono utilizzati per configurare la stragrande maggioranza delle applicazioni Java. Riprendendo il Bean (TestBean) di esempio dell’articolo precedente [9], nel caso in cui vogliamo evitare che per i due field operand1 e operand2 vengano generate le label di default "Operand 1" e "Operand 2", bisogna scrivere il file SimpleBeanPage.properties il quale deve contenere le seguenti due righe:
operand1.label=First Value operand2.label=Second Value
In questo modo l’override dei valori di default delle label verrà fatto per tutti i bean che definiscono due proprietà con quei nomi. È possibile restringere l’override solo a TestBean indicando il nome della classe prima della proprietà all’interno dei .properties file:
TestBean.operand1.label=First Value TestBean.operand2.label=Second Value
Personalizzazione tramite beanprops files
Un beanprops file deve avere lo stesso nome della Page (o del component) a cui si riferisce. Supponiamo di avere la seguente pagina di esempio
public class CustomSimpleBeanPage extends WebPage { public CustomSimpleBeanPage() { TestBean bean = new TestBean(); BeanMetaData meta = new BeanMetaData(bean.getClass(), null, this, null, false); 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.

Figura 1 - La pagina di esempio dopo la personalizzazione tramite beanprops file.
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-CM2_7f000001_11994537_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-6VT_7f000001_10911033_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-CYC_7f000001_18359738_ef2466ca
[10] Java Data Objects (JDO)
http://java.sun.com/jdo/
[11] Java Persitence API (JPA)
http://java.sun.com/developer/technicalArticles/J2EE/jpa/
|