Mehr Spaß bei der Arbeit mit dem Wicket-Framework

Tutorial: World Wide Wicket 2.0

Martin Dilger

Im ersten Teil dieses Tutorials [1] haben wir Herrn K., einen desillusionierten Onlinevideotheken-Benutzer, auf dem Weg zu seiner eigenen Onlinevideothek begleitet. Die Umsetzung der Webanwendung erfolgte hierbei mit Apache Wicket, einem komponentenorientierten und effizienten Webframework. Sehen wir mal, wie die Geschichte weitergeht.

Im vorigen Artikel hatte sich Herr K. die Grundlagen des Wicket-Frameworks erarbeitet und eine erste Wicket-Seite implementiert, die sowohl verschiedene Eingabekomponenten wie Textfelder und Radiobuttons als auch Formvalidierung beinhaltet hatte. Im vorliegenden Artikel wird Herr K. versuchen, eine weitere Wicket-Seite für die Filmauswahl zu implementieren, und wir betrachten hierfür die Anbindung an das Spring Framework, Templatevererbung, DataTables und das Thema „Ajax“ ein wenig genauer.

Eine kleine Anmerkung des Autors: Im Fokus des Artikels steht die Implementierung einer funktionsfähigen Webanwendung und nicht die möglichst umfangreiche Abdeckung der Grundlagen des Wicket-Frameworks.

Der Frühling kommt bestimmt – die Anbindung an Spring

Herr K. entscheidet sich dafür, die Kommunikation mit dem Backend über eine Servicefassade zu kapseln. Das Interface für die Fassade ist in folgendem Beispiel dargestellt:

public interface VideoStoreFacade {
    public List getMovies();
    public void submitOrder(Customer customer, Set movies) throws SubmitOrderFailedException;
 }

Die Schnittstelle definiert die Methode getMovies(), über die eine Liste an verfügbaren Filmen geladen werden kann. Weiterhin bietet die Methode submitOrder()die Möglichkeit, eine Liste an Filmen für einen bestimmten Kunden zu bestellen. Herr K. verwendet das Spring Framework [2], um die Fassade elegant in die entsprechenden Wicket-Komponenten zu injizieren. Hierfür definiert Herr K. im Package de.pentasys.k einen sehr einfachen Spring-Kontext (Listing 1).

Listing 1

Wie aber funktioniert die Anbindung an Spring nun genau? Glücklicherweise gibt es das Wicket-Spring-Projekt [3], das eine nahtlose Integration von Spring in Wicket ermöglicht. Um das Wicket-Spring-Projekt verwenden zu können deklariert Herr K. zunächst folgende Abhängigkeit in der pom.xml des Projekts:

org.apache.wicketwicket-spring1.4.9jar

Zusätzlich muss die Abhängigkeit auf das Spring Framework deklariert werden:

org.springframeworkspring2.5

Weiterhin definiert Herr K. folgenden ContextListener in der web.xml, der das Laden des Spring-Kontextes beim Start der Anwendung übernimmt:

 org.springframework.web.context.ContextLoaderListener

Der ContextLoaderListener erwartet den Parameter contextConfigLocation. Dieser definiert, wo sich der Spring-Kontext in der Anwendung befindet:

contextConfigLocationclasspath:de/pentasys/k/spring-context.xml

Das Wicket-Spring-Projekt definiert die Annotation @SpringBean, mit der eine Spring Bean in jede Wicket-Komponente durch einfache Deklaration einer annotierten Instanzvariablen nach folgendem Muster injiziert werden kann:

@SpringBean(name="videoStoreFacade")
private VideoStoreFacade facade;

Hierfür nutzt das Projekt ein interessantes Konzept des Wicket-Frameworks, und zwar die IComponentInstantiationListener. Diese werden immer dann benachrichtigt, wenn eine Wicket-Komponente instantiiert wird. Dies macht sich das Wicket-Spring-Projekt zunutze, indem es die Klasse SpringComponentInjector bereitstellt, die das Interface IComponentInstantiationListener bereits implementiert und für das Injizieren der Spring Beans verantwortlich ist.

Den SpringComponentInjector erzeugt Herr K. in der Methode init()der Klasse VideoStoreApplication. Diese wird automatisch beim Start der Anwendung durch das Framework aufgerufen:

protected void init() {
super.init();
addComponentInstantiationListener(new SpringComponentInjector(this));
}

Wann immer eine Wicket-Komponente nun instantiiert wird und eine Abhängigkeit auf eine Spring Bean mit der @SpringBean-Annotation deklariert, wird diese Abhängigkeit automatisch aufgelöst.

Geschrieben von
Martin Dilger
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.