Da man neben der Möglichkeit des ganztäglichen Essens während der Weihnachtszeit die Zeit auch zu etwas Produktivem nutzen kann, habe ich mir mal die Kombination JPA im Backend, Spring als Controller sowie FreeMarker und Dojo als Frontend angeschaut. Was soll ich sagen? Von Spring3 (momentan nur als Beta verfügbar) mit REST Support bin ich durchaus begeistert.
OpenJPA
JPA generell besticht durch seine Einfachheit, um eine Klasse zu persistieren, reicht es aus, diese mit einigen Annotationen zu versehen (alternativ kann allerdings auch eine XML Datei benutzt werden, bei größeren Projekten ist das vielleicht übersichtlicher), die sowohl Constraints als auch Keys und Spaltennamen definieren können. So hat man in kurzer Zeit ein eigenes Model entwickelt (selbstverständlich auch mit komplexen One-To-Many Mappings sowie lazy oder eager loading eben dieser Verbindungen). Eine Beispielimplementierung für JPA ist OpenJPA, auch Hibernate oder Toplink folgen der JPA Spezifikation. JPA kommt mit einer abstrakten datenbankunabhängigen Query Language, der JPQL. Auch die Integration in Spring ist mit ein paar Konfigurationschritten erledigt. Die Integration von NamedQueries (vorgefertigte JPQL Statements) in die normalen Klassen finde ich sehr praktisch. Wer vom Entwickler persönlich mal eine Einführung zum Thema JPA sehen will, dem sei sein Talk von der Spring One empfohlen (bei parleys.com finden sich noch einen Menge anderer interessanter Vorträge).
Spring 3 mit REST Unterstützung
Erst vor kurzem ist eine Spring 3.0 Version mit vollständiger REST Unterstützung erschienen, welche aber noch in der Testphase ist. Interessanterweise berichteten über diesen Support am meisten asiatische Blogs, während man in englischen oder europäischen Blogs da sehr viel weniger drüber liest. Ich habe mir als ersten Test einen kleinen Registrationsdienst geschrieben, der nach Eingabe der Daten eine Email mit einer erzeugten UUID schickt (diese Mail ist übrigens ein FreeMarker Template), welche der User dann nur noch aufrufen muss, um seine Anmeldung zu bestätigen. Wer sich zum Thema Spring 2.5/3.0 informieren will, kann dies auch sehr gut bei parleys.com mit einem Vortrag von Jürgen Holler auf der Spring One. Nun aber zurück zu den neuen tollen Annotations bei Spring3. Ich poste bei cryopaste (die haben schönes Syntaxhighlighting) mal den RegistrationController, der die eigentliche Registrierung sowohl triggert als auch verarbeitet. Hier mal einige Features der Klasse:
- Die @Controller Annotation markiert die Klasse als Controller für Spring MVC - keine weitere Konfiguration nötig.
- Die Vererbung ist nicht mehr zwingend (ich vererbe hier von meiner eigenen Klasse, die nur noch zusätzliche Getter für meine Services hat
- Die @RequestMapping Annotation ist recht selbsterklärend. Mit dem EL-Ausdruck "{registration}" kann man in der Methodendeklaration mit Hilfe der Annotation @PathVariable genau diesen Teil der URL einem String zuordnen.
- Auch das Anhängen der HTTP-Session in der Methodendeklaration wird automatisch von Spring erledigt
- Die zweite Methode "startRegistration" startet eine Registrierung, schickt eine Mail und fügt den User als "inaktiv" hinzu.
- Die @RequestParam bezieht sich auf eine Variable die als POST oder GET Variable übermittelt wurde (aber nicht Teil der URL war)
- StartRegistration hat den Returntype "void", das bedeutet, dass automatisch probiert wird, ein Template mit dem Namen der Methode aufzurufen
Interessant sind auch die Möglichkeiten, die all das in der Zukunft noch bieten. Zum Beispiel könnte DWR für einfache Tätigkeiten mit ein paar Zeilen Code überflüssig werden (beispielsweise teste ich gerade mit DWR, ob ein Benutzer bei der Registrierung schon existiert - mit Dojo über einen AJAX Request). Da mir DWR aus Sicherheitsgründen immer ein wenig zuwider läuft, würde das ein wenig Magengrummeln vernichten. Allerdings hat DWR auch interessante Features in der neuen Version, wie den Support für Dojo Datastores.
Ansonsten gilt: Fragen zum Code einfach in die Kommentare packen.
Compass
Um Volltextsuche mit Lucene zu ermöglichen, ohne die Komplexität von Lucene verstehen zu müssen, existiert Compass. Als Einführung eignet sich diese Präsentation vom Gründer wohl ganz gut. Theoretisch hat Compass auch ein JPA Plugin - eine der Hauptzwecke von Compass ist die Integration in existierende Anwendungen. Allerdings habe ich das noch nicht erfolgreich ans Laufen bekommen. Hat eventuell jemand der Leser hier damit Erfahrung?
Schlusswort
Was mir bei all dieser Rumspielerei immer auffällt. Der Schlüssel, sich in der Zukunft am Arbeitsmarkt zu differenzieren ist nicht die Expertise in einem dieser Gebiete, sondern schlicht und ergreifend die Integration all dieser Techniken. Tiefes Wissen schadet nicht, aber breites Wissen (bei einer gewissen Grundtiefe) von verschiedenen Technologien hilft hier weitaus mehr.
Abschließend gilt noch zu sagen: Falls jemand Interesse am Code oder weiterführendem Informationsaustausch hat, so reicht eine Mail an mich. Ich hätte da noch die ein oder andere Idee für fortgeschrittene Dinge und Tätigkeiten im Bereich J2EE/Web 2.0 Integration.