Lift - Vehikel zum nächsten Web-Framework-Level?
Lift nimmt bewährte Bestandteile bestehender Web-Frameworks und würzt sie mit der Effizienz und Typsicherheit der Programmiersprache Scala, die das Beste aus funktionaler und objektorientierter Welt vereinen möchte.
- Guy Philipp Bollbach
- Christian J. Dietrich
- Alexander Neumann
Lift nimmt bewährte Bestandteile bestehender Web-Frameworks und würzt sie mit der Effizienz und Typsicherheit der Programmiersprache Scala, die das Beste aus funktionaler und objektorientierter Welt vereinen möchte. Lohnt sich der Blick auf den bunten Mix angesichts der großen Konkurrenz an Web-Frameworks?
Die Lift-Entwickler wollten ein ausdrucksstarkes und elegantes Web-Framework mit den Eigenschaften Performance, Sicherheit, schnelle Entwicklung und einfaches Deployment zur Verfügung stellen. Dafür griffen sie auf die Sprachen Scala und XHTML zurück und schauten sich wichtige Funktionen bei anderen Frameworks ab. Die Paten des freien Lift sind unter anderem das Smalltalk-Framework Seaside (HTML-Generierung und sichere Formulare), das Python-Projekt Django (mehr als CRUD – Create, Read, Update, Delete – zum Beispiel Benutzerverwaltung), das Java-Framework Wicket (Templates, XHTML, designerfreundlich) und Rails auf Ruby-Basis (schnelle Entwicklung, Object-Relational Mapper, Convention over Configuration). Jede Menge guter Ideen gepaart mit der Java-Plattform könnten ein schlagkräftiges Paket abgeben, denn weil Scala Code in Java-Bytecode übersetzt, ist die Sprache und damit Lift auf der Java Virtual Machine (JVM) lauffähig. Deswegen lässt sich Lift auf jedem Servlet-Container einsetzen.
Historie
David Pollak startete Lift als "Scala with Sails" im Dezember 2006. Anfang 2007 nannte er das Framework – zeitgleich mit der Veröffentlichung der Version 0.1.0 – aufgrund der Namensähnlichkeit zu Ruby on Rails in Lift um. Aktuell liegt es in Version 1.0 vor.
Eine erste Beispielanwendung
Neben Installationspaketen für Windows und Mac OS X unterstützt Lift Maven. Das Build-Werkzeug übernimmt nicht nur die Verwaltung der Abhängigkeiten, sondern unterstützt auch die Generierung von Grundprojekten auf Basis unterschiedlicher Templates (Maven-Archetypen). Zusätzlich integriert es mit Jetty einen Servlet-Container, der die Anwendung startet. Zuerst erzeugt man aber den Archetyp:
mvn archetype:create -U -DarchetypeGroupId=net.liftweb
-DarchetypeArtifactId=lift-archetype-basic -DarchetypeVersion=1.0
-DremoteRepositories=http://scala-tools.org/repo-releases
-DartifactId=hellolift -Dversion=1.0-SNAPSHOT
Dann ist in das cd hellolift-Verzeichnis zu wechseln. Nun kompiliert man das Lift-Projekt und bringt es mit mvn jetty:run zum Laufen. Die erste Lift-Anwendung findet man darauf unter http://localhost:8080/.
Die gezeigte Beispielanwendung besitzt eine Benutzerverwaltung und ein Menü zum Ansteuern der einzelnen Seiten. Für die Seiten verwendet man den unten erläuterten Lift-Template-Mechanismus. Die Grundstruktur der gezeigten Webanwendung ist von Maven beeinflusst. Scala-Code und XHTML/XML-Artefakte sind, wie aus dem Java-Umfeld bekannt, durch unterschiedliche Verzeichnisse getrennt. Möchte ein Entwickler eine eigene Seite anlegen, benötigt er zuerst das von Lift im Verzeichnis webapp abgelegte XHTML.
(src/main/webapp/hellolift.html)
<lift:surround with="default" at="content">
<lift:snippet type="HelloLift:show" /><br/>
</lift:surround>
Das Tag lift:surround gibt an, welches Template zu verwenden (with="default") und wo bei diesem der eigene Inhalt einzusetzen ist (at="content"). Als Nächstes ruft man im Beispiel eigenen Scala-Code auf. Lift definiert dafür mit <lift:snippet> ein eigenes Tag, das als Typ eine Methode einer Scala-Klasse angibt (Klasse:Methode). Um die Methode aufzurufen, legt man im Verzeichnis snippet eine Scala-Klasse mit folgendem Inhalt an:
(src/main/scala/hellolift/snippet/HelloLift.scala)
package hellolift.snippet
class HelloLift {
def show = <span>Hello Lift!</span>
}
def legt eine Scala-Methode fest, die ein StĂĽck typisiertes XHTML zurĂĽckgibt, das man an die mit dem lift:snippet-Tag definierte Stelle einfĂĽgt. Als letzten Schritt ist die Seite zu registrieren, damit sie durch eine URL aufrufbar ist und im MenĂĽ erscheint. Das erledigt die Klasse Boot im package bootstrap.
(src\main\scala\bootstrap\liftweb\Boot.scala)
package bootstrap.liftweb
class Boot {
def boot {
val entries = Menu(Loc("Home", List("index"), "Home")) ::
Menu(Loc("HelloLift",List("hellolift"),"Hello Lift")) ::
User.sitemap
}
}
Die Liste der Einträge (entries) besteht im Beispiel aus zwei Menüeinträgen und der Sitemap.
AnschlieĂźend beendet man Jetty (Strg + c) und startet mit mvn jetty:run die Anwendung neu. Die Seite ist jetzt in die Applikation eingebunden.