Secondo articolo su Wicket Web Beans, un toolkit che combina insieme le potenzialità del framework Wicket con quelle dei Java Web Beans. In questa seconda parte vengono descritti diversi modi con cui è possibile personalizzare le applicazioni basate su questo framework.
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.
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
https://www.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
https://www.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
[8] Apache Common BeanUtils
http://commons.apache.org/beanutils/
[9] Guglielmo Iozzia, primo articolo su Wicket Web Beans su Mokabyte
https://www.mokabyte.it/cms/article.run?articleId=DSB-E31-MQS-CYC_7f000001_18359738_ef2466ca
[10] Java Data Objects (JDO)
[11] Java Persitence API (JPA)
http://java.sun.com/developer/technicalArticles/J2EE/jpa/