© DrHitch/Shutterstock.com
Vaadin mit Eclipse, Clojure und OSGi

2 Vaadin meets Clojure - Vaadin 7 für die Oberfläche einer Clojure-Anwendung


In diesem Kapitel wird anhand eines einfachen RSS Readers beschrieben, wie die Oberfläche einer Clojure-Webapplikation mit Vaadin 7 erstellt werden kann. Der RSS Reader bietet ein Eingabefeld, in das der Benutzer den URL eines RSS-Feeds einträgt. Ein Klick auf den Fetch-Button lädt den Feed und parst ihn. Die Applikation stellt die Titel der einzelnen Feedelemente in einer Tabelle dar. Klickt der Benutzer auf einen Tabelleneintrag, werden der Feedinhalt und der Link zum vollständigen Artikel unterhalb der Tabelle angezeigt (Abb. 2.1).

Abb.2_1.png

Abbildung 2.1: Oberfläche des RSS Readers

Die Webapplikation konfigurieren

Vaadin 7 weist gegenüber den früheren Versionen Änderungen im Bootstrap-Prozess auf. Das Framework liefert nun ein eigenes Servlet mit, das mit einer Klasse initialisiert werden muss, die von com.vaadin.ui.UI ableitet. Diese Klasse ist der Einstiegspunkt für den Start der Webapplikation. Sie enthält eine init-Methode, in der der Entwickler das UI aufbaut. Das Vaadin Servlet wird mit dieser Klasse in der web.xml konfiguriert (Listing 2.1).

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>Clojure Vaadin 7 RSS Reader</display-name>
<context-param>
<description>Vaadin production mode</description>
<param-name>productionMode</param-name>
<param-value>false</param-value>
</context-param>
<servlet>
<servlet-name>vaadinServlet</servlet-name>
<servlet-class>com.vaadin.server.VaadinServlet</servlet-class>
<init-param>
<description>Vaadin UI</description>
<param-name>UI</param-name>
<param-value>rsscljvaadin.RSSApplicationUI</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>vaadinServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>

Listing 2.1: web.xml

Hier ergibt sich die erste Besonderheit im Zusammenspiel mit Clojure: Clojure kompiliert den Code erst zum Zeitpunkt der Ausführung. Für eine Vaadin-Webapplikation muss die UI-Klasse aber bereits beim Deployment der Applikation vorhanden sein. Der Entwickler steht also vor der Aufgabe, diese Klasse aus seinem Clojure-Code erzeugen zu müssen. Clojure bietet hierfür Ahead-of-Time-Kompilierung (AOT) an. Mit dieser Funktionalität wird ein Clojure Namespace bereits zur Kompilierungszeit in JVM Bytecode übersetzt.

Bei unserem RSS Reader soll der Namespace rsscljvaadin.rssapplicationui alle UI-relevanten Anteile enthalten. Der Namespace enthält also auch die init-Methode und soll deshalb beim Paketieren der Webapplikation per AOT übersetzt werden, damit er von Java aus verwendet werden kann. Dazu fügt man im Namespace-Makro die Option :gen-class mit dem Namen der Klasse ein, die aus diesem Namespace generiert werden soll. Die Angabe eines Namens für die zu erzeugende Klasse ist optional. Gibt man ihn nicht an, heißt die Klasse genau wie der Namespace. Da sich aber die Namenskonventionen von Java für Klassen und Clojure für Namespaces unterscheiden, ist es ratsam, die :name-Option zu verwenden. Außerdem lässt sich mit :extends angeben, von welcher Klasse die generierte Klasse ableiten soll. In unserem Beispiel ist das com.vaadin.ui.UI (Listing 2.2).

 (ns rsscljvaadin.rssapplicationui
...
(:gen-class
:name rsscljvaadin.RSSApplicationUI
:extends com.vaadin.ui.UI))

Listing 2.2: Namespace-Deklaration

Damit der Namespace vorab kompiliert wird, gibt man in der Projektdefinition die Option :aot mit dessen Namen an (Listing 2.3).

 (defproject rsscljvaadin "1.0.0-SNAPSHOT"
:dependencies [[org.clojure/clojure "1.5.0"]
[com.vaadin/vaadin-server "7.0.3"]
[com.vaadin/vaadin-client-compiled "7.0.3"]
[com.vaadin/vaadin-t...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang