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.

La pagina di esempio dopo la personalizzazione tramite beanprops file.
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-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/