Lift - Vehikel zum nächsten Web-Framework-Level?
Seite 2: Formulare erstellen
Formulare erstellen
Die XHTML-Webseite für Lift erlaubt eine Vorschau im Browser. Auf der anderen Seite ist es nicht möglich, Scala-Code in XHTML zu verwenden, wie man es aus der JSP- oder PHP-Welt kennt. Die Logik findet sich in Scala-Klassen, in sogenannten Snippets, die sich direkt per Tag-Bibliothek – vergleichbar mit JavaServer Pages (JSP) oder JavaServer Faces (JSF) – referenzieren lassen. Das in Abbildung 3 gezeigte Verfahren, um Daten anzuzeigen, ist jedoch nicht das einzige. Lift kann neben dem Einfügen ganzer Snippets Operationen aufrufen und ihren Rückgabewert in die HTML-Seite einbetten. Das folgende Beispiel gibt den im Textfeld eingegebenen Namen als Begrüßung aus. Das Formular benötigt noch nicht Lift.
Hello <lift:HelloForm.who />
<br/>
<form>
<label for="whoField">Who :</label>
<input type="text" name="whoField"/>
<input type="submit" value="send"/>
</form>
Dazu liest der Entwickler den Parameter aus dem Request aus und gibt den Wert oder einen Leer-String zurück. Zusätzlich lässt sich eine beliebige Markup (Auszeichnung) mit angeben. Das Beispiel gibt den Namen fett gedruckt aus. Im Gegensatz zum vorangegangenen Beispiel referenziert die XHTML-Markup die Scala-Klasse nicht durch ein Snippet-Tag (<lift:snippet type="HelloForm:who"/>), sondern direkt im Lift-Namensraum (<lift:HelloForm.who />). Lift unterstützt beide Arten der Referenzierung.
import net.liftweb.http.S
class HelloForm {
def who = <b>{S.param("whoField").openOr("")}</b>
}
Man liest aus dem aktuellen Request (Singleton Object S) den Parameter aus und zeigt ihn an oder gibt einen leeren String zurück. Der gezeigte Weg des Auslesens ist aus dem Servlet-Umfeld bekannt. Frameworks wie JSF bieten einen Binding-Mechanismus, der die Oberflächenelemente mit den Datenquellen deklarativ verknüpft. Lift unterstützt eine Art Binding, jedoch verwendet es das Binding nicht im Markup wie bei JSF üblich, sondern es geschieht in der Operation, die das Absenden des Formulars ansteuert.
<lift:HelloForm2.show form="POST">
Hello <hello:who/>
<br/>
<label for="whoField">Who :</label>
<hello:whoField/>
<hello:submit/>
</lift:HelloForm2.show>
Besonders fällt die Verwendung des hello Namespace auf. Der eigene Namensraum definiert Punkte, an denen Lift die XHTML-Präsentation mit Daten verbindet. Die aufgerufene Operation show verbindet durch bind den Namespace mit dem übergebenen xhtml und ersetzt die deklarierten durch XHTML-Elemente wie Input-Field (text) und Submit-Button (submit).
object who extends RequestVar("")
def show(xhtml: NodeSeq): NodeSeq = {
bind("hello", xhtml, "whoField" --> SHtml.text(who.is, who(_) ) %
("id" -> "whoField"),
"submit" --> SHtml.submit("Send",
() => { println("value:" + who.is}),
"who" --> who.is
)
}
Durch eine XHTML-Element-Eingabe ersetzt man whoField mit dem Wert des who-Objekts. Das who-Objekt ist im Request-Bereich definiert und mit einem Leer-String initialisiert. Zudem ist das XHTML-Attribut id des Felds zu setzen und beim Senden eine anonyme Funktion auszufĂĽhren, die inline definiert ist und per println-Funktion den Wert des who-Objekts auf der Konsole ausgibt. Die letzte Zeile besetzt den Knoten who mit dem Wert des who-Objekts.
Lift bietet durch die Klassen RequestVar und SessionVar eine typsichere Behandlung von Daten, die innerhalb eines Requests oder einer Session gehalten werden müssen. Sie lassen sich initial definieren und ermöglichen die Freigabe eventuell gehaltener Ressourcen am Ende ihres Lebenszyklus durch eine cleanup-Function. Darüber hinaus bietet die Operation S.param einen einfach Zugriff auf die HTTP-Request-Parameter.
Templates und MenĂĽ
Lift verfügt über eine einfach zu verwendende Template Engine. Man definiert zuerst einen Platzhalter mit Namen im Template. Auf der Seite, die es verwenden soll, fügt man die im Beispiel am Anfang erwähnten lift:surround-Tags ein.
<body>
<lift:bind name="content" />
</body>
[[Template-Definition (Hook)]]
<lift:surround with="default" at="content">
</lift:surround>
Das Framework enthält ein vorgefertigtes Menükonzept, das die XHTML-Seiten einbindet und ihre Sichtbarkeit zum Beispiel in Abhängigkeit zum angemeldeten Benutzer festlegt.