Grails und Ajax - JAXenter

Grails und Ajax

Bevor wir die Betrachtung der Grails Ajax-Tags abschließen, stelle ich Ihnen noch den remoteField-Tag vor, der zusammen mit der passenden Grails Action eingesetzt werden kann, um einen sehr beliebten Use Case zu implementieren: die Aktualisierung einer Ergebnisliste, während der Benutzer die Suche formuliert. Zu beachten ist hierbei, dass der remoteField-Tag normalerweise nach jedem eingetippten Zeichen einen Ajax Call auslöst. Oftmals macht dies keinen Sinn, denn die Suche nach a in einer Titelspalte einer Produktdatenbank liefert mitunter tausende Ergebnisse. Die Beschränkung, dass erst nach drei Zeichen oder mehr ein Call ausgelöst wird, ist daher sinnvoll. Im Folgenden sehen Sie einen remoteField Tag, der ab drei Zeichen einen Ajax Call auslöst. Dabei wird der Wert des Textfelds als Parameter mit Namen search an die Grails Action quickSearch übermittelt.

Das Resultat der Anfrage, in unserem Fall ein HTML-Fragment, aktualisiert das HTML-Element tableContent. Da das Ergebnis in Listenform dargestellt wird, referenziert tableContent den TBODY einer HTML-Tabelle. Damit ist die Aktualisierung der HTML-Seite auch schon abgeschlossen. Die zum Aufruf passende Action sowie die Erzeugung der Antwort zeigt die quickSearch Action:

    /* ajax search */
    def quickSearch = {
        log.info("Search expression is: ${params.search}")
        def devices = Device.findAllByModelLike("%${params.search}%", [max:20, sort:"model", order:'asc'])
        log.info("found ${devices.size()} devices")
        render(template:'tableContent', model:[deviceList:devices])
    }

Dank GORM, dem Grails Object Relational Mapping, und den dynamischen Finder-Methoden wird die Abfrage kinderleicht. Die render-Methode wird hier dazu verwendet, ein Template (in diesem Fall: grails-app/<controller-name>/_tableContent.gsp) zu rendern. Innerhalb des GSP Template werden wiederum GSP Tags dazu benutzt, um pro Ergebniszeile eine neue HTML Row zu erstellen:

${device.id}
        
             ${device.model}
        
               ...
        
             Show
        
     
Die render()-Methode

Im Folgenden wird Ihnen ein kurzer Überblick über die für Ajax besonders relevanten Features gegeben. In Tabelle 2 sind die Parameter aufgelistet, die Sie mit der render()-Methode verwenden können. Für weitere Informationen bietet sich auch die Online-Dokumentation der „Grails Dynamic Methods“ an.

Eines der trivialsten Features dieser Methode ist es, einfach puren Text an den Web-Client zurückzugeben. In anderen Frameworks müssen Sie dazu meist zunächst die HttpResponse referenzieren, dann den OutputStream und so weiter… In einem Grails Controller schreiben Sie einfach: render „Eine Antwort vom Controller“. Damit wird der Text in Anführungszeichen zum Browser zurückgeschickt. Dies ist daher so praktisch, da viele Ajax-Funktionen keine ganzen Websites als Antwort erwarten, sondern eben nur die tatsächlich relevanten Daten. Die so zurückgelieferten Daten können dann vom Web-Client beliebig weiterverarbeitet werden, häufig wird einfach der Inhalt eines DIV-Elements mit der erhaltenen Antwort ausgetauscht.

Tabelle 2: Parameter der render()-Methode
Text der an den Browser zurückzugebende Text
builder der zu benutzende Groovy Builder für die Ausgabe des Texts; der JSONBuilder gibt die Daten beispielsweise im JSON-Format zurück an den Browser
view der Name der View, an welche das Rendering delegiert werden soll, wird meist zusammen mit den Parameter model verwendet
template hiermit kann das zu verwendende Template (GSP-Fragment) angegeben werden, welches dann gerendert wird
var dient der Angabe eines eigenen Variablennamens, welcher dann innerhalb der Templates verwendet werden kann – der Standard-name lautet „it“, wie in Groovy üblich
bean die (Java)Bean, welche für das Rendern der Antwort benutzt werden soll
model ähnlich wie bean, nur handelt es sich hier um ein Grails-Domain-Model, also eine per GORM persistierte Bean, die innerhalb ihrer Grails-Applikation verwendet wird
collection hiermit kann eine Collection übergeben werden; für jedes einzelne Element wird dann das Template gerendert
contentType Angabe des contentTypes, also z.B. „text/xml“
encoding Angabe des Encodings, also z.B. „UTF-8“

Die Funktion von render() im Zusammenhang mit dem Model-Parameter sowie einem GSP-Template haben Sie bereits gesehen. Hierbei hat das Template als Model eine Liste mit Device-Objekten erhalten, welche es dann per GSP-Tags dargestellt hat. Alternativ hätte man den Parameter Collection benutzen können und das Template je eine Zeile der Daten darstellen lassen können. Damit hätte man die Logik der Iteration von der GS-Pages in den Controller oder besser die render()-Methode verlagert. Welche Variante zu wählen ist, ist Geschmacksache, die MVC-Puristen unter Ihnen bevorzugen wahrscheinlich die Erstere.

Wenn nur sehr kurze HTML-Fragmente an den Browser zurückgegeben werden, so ist es aus praktischer Sicht sicherlich sinnvoll, das nötige HTML Markup direkt im Textparameter der render()-Methode anzugeben: Zumindest gibt die Grails-render()-Methode auch gerne Text mit einem HTML Markup an den Browser zurück: render „<strong>25 Stück</strong>“

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.