Irgendwann im Frühsommer 2005 war es, als Jim Weirich seinem Freund Chris Nelson bei einem Treffen der Java-Usergroup von Cincinnati das Video von Ruby on Rails [1] vorspielte. Chris war beeindruckt von dem schnellen und einfachen Weg, Webanwendungen zu entwickeln, und fasste den Entschluss, dies auch in seiner Lieblingsprogrammiersprache Java hinzubekommen.
Nach einigen Monaten war es so weit: Chris stellte die erste Version von Trails [2] fertig. Der Name Trails lehnt sich an Rails an und setzt noch das T von Tapestry [3] davor. Seine Kernidee ist es, die Entwicklung von J2EE-Anwendungen zu vereinfachen und zu beschleunigen. Chris wollte nicht das Rad neu erfinden und setzte bei der Entwicklung von Trails auf bereits erprobte Frameworks wie Apache Ant, Tapestry, Aspect-J [4], Spring [5] und den objektrelationalen Mapper Hibernate [6].
Voraussetzung, um mit Trails arbeiten zu können, sind ein installiertes Ant und das fast 20 MByte große Trails-Archiv von [2], das alle weiteren Frameworks enthält. Tomcat 5.5 als Application Server sollte bereits installiert haben, wer sofort loslegen möchte. Ist »ANT_HOME« gesetzt und Trails in ein entsprechendes Verzeichnis entpackt, kann mit Hilfe von »ant install-apt« die nötige Ant-Bibliothek für Trails in das Ant-Lib-Verzeichnis installiert werden.
Schnellstart
Ein Beispiel demonstriert im Folgenden die Verwendung von Trails: eine kleine Webanwendung, die Videofilme und die entsprechenden Schauspieler verwaltet. Trails generiert das Skelett einer solchen Anwendung (in Rails auch als Scaffolding bezeichnet) vollautomatisch und bestückt es mit Bibliotheken und Konfigurationsdateien. Dazu genügt es, im Trails-Verzeichnis »ant create-project« auszuführen (Abbildung 1).
Abbildung 1: Mit Trails lassen sich Java-Webanwendungen wie diese Schauspielerdatenbank fast ohne manuelles Programmieren erstellen.
Nach dem Eingeben des Basisverzeichnisses und des Namens der neuen Anwendung, im Beispielfall »meinevideos«, legt Trails ein entsprechendes Verzeichnis, alle nötigen Unterverzeichnisse und Bibliotheken an, einschließlich einer »build.xml« für die Erzeugung und das Deployment der neuen Webanwendung. Die angelegte Verzeichnisstruktur sieht folgendermaßen aus:
-
»Basisverzeichnis/meinevideos/« ist das
Hauptverzeichnis der Webanwendung. Es kann als Startpunkt für
den Import in eine IDE wie Eclipse dienen.
-
»Basisverzeichnis/meinevideos/src« ist das
Quellcodeverzeichnis der Applikation. Hier werden die eigenen
Klassen implementiert.
-
»Basisverzeichnis/meinevideos/context« ist das
Verzeichnis der eigentlichen Webapplikation.
-
»Basisverzeichnis/meinevideos/context/WEB-INF«
enthält die Konfigurationsdateien »web.xml«,
»hibernate.properties« und so fort sowie alle
Tapestry-Pages und HTML-Fragmente.
-
»Basisverzeichnis/meinevideos/lib« enthält
alle Archive der einzelnen Frameworks (Hibernate, Tapestry, Apache
Commons und so fort).
Zusätzlich ist noch der Ort der Tomcat-Installation in der Datei »build.properties« einzutragen.
Domänen-getriebene Entwicklung
Startpunkt jeder Trails-Webapplikation sind ein oder mehrere POJOs (Plain Old Java Objects), die den Domäne(n)-Objekten der Anwendung entsprechen. Mit diesem ersten wichtigen und entscheidenden Unterschied zu Ruby on Rails wird der Programmierer bereits vor dem ersten Schritt konfrontiert: Trails startet nicht mit einer Datenbanktabelle, sondern erwartet als Ausgangspunkt eine einfache Java-Klasse. Die Klasse in Listing 1, die im Beispiel Videos verwalten soll, lässt sich in einer modernen IDE wie Eclipse leicht erzeugen (Abbildung 3). Dazu deklariert man die Klassenattribute »id«, »title« und »year« und erzeugt mit dem Getters- und Setters-Generator die Zugriffsmethoden.
Um Hibernate mitzuteilen, welche Klasse es persistieren soll, muss der Entwickler Java-5-Annotationen im Sinne des neuen EJB-3.0/JSR-220-Standards ([7], [8]) benutzen. Die Annotation »@Entity« (Listing 1, Zeile 12) gibt dabei an, dass Hibernate die Klasse »Movie« in der Datenbank speichern soll. Dann fehlt noch eine eindeutige Identifikationsnummer, die durch die Annotation »@Id(generate=GeneratorType.AUTO)« über das »id«- Attribut erzeugt wird.
Um einzelne Filme in der Datenbank zu unterscheiden, bedarf es noch einer Methode »equals«, die sich jedoch trivial mit Hilfe eines »EqualsBuilder« aus dem Framework »apache.commons.lang.builder« implementieren lässt (Zeilen 10 und 44). Nach dem Aufruf des Ant-Targets »ant deploy« findet sich die Webanwendung prompt unter der Adresse »http://localhost:8080/meinevideos/« im Browser - vorausgesetzt der Tomcat-Pfad in »build.properties« stimmt.
01 package de.wartala.meinevideos;
02
03 import java.util.HashSet;
04 import java.util.Set;
05
06 import javax.persistence.Entity;
07 import javax.persistence.GeneratorType;
08 import javax.persistence.Id;
09
10 import org.apache.commons.lang.builder.EqualsBuilder;
11
12 @Entity
13 public class Movie {
14 private Integer id;
15 private String title;
16 private Integer year;
17
18 @Id(generate=GeneratorType.AUTO)
19 public Integer getId() {
20 return this.id;
21 }
22
23 public void setId(Integer id) {
24 this.id = id;
25 }
26
27 public String getTitle() {
28 return title;
29 }
30
31 public void setTitle(String title) {
32 this.title = title;
33 }
34
35 public Integer getYear() {
36 return year;
37 }
38
39 public void setYear(Integer year) {
40 this.year = year;
41 }
42
43 public boolean equals(Object obj) {
44 return EqualsBuilder.reflectionEquals(this, obj);
45 }
46
47 public String toString() {
48 return this.getTitle();
49 }
50 }
|
Abbildung 2: Der Aufruf von »ant create-project« erzeugt das Grundgerüst.
Abbildung 3: Trails-Webanwendungen lassen sich bequem in der Eclipse-IDE editieren.