grails - die suche hat ein ende (jax 2008)
TRANSCRIPT
![Page 1: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/1.jpg)
– Grails –
Der Gral der Webentwicklung
Stefan [email protected]
Bernd [email protected]
22.04.2008JAX
![Page 2: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/2.jpg)
21
![Page 3: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/3.jpg)
32
FAIL!
![Page 4: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/4.jpg)
43
FAIL!
![Page 5: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/5.jpg)
54 FAIL!
![Page 6: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/6.jpg)
65
![Page 7: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/7.jpg)
76
![Page 8: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/8.jpg)
87
![Page 9: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/9.jpg)
98
![Page 10: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/10.jpg)
109
![Page 11: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/11.jpg)
1110
FAIL!
![Page 12: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/12.jpg)
1211 FAIL!
![Page 13: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/13.jpg)
1312
![Page 14: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/14.jpg)
1413
![Page 15: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/15.jpg)
1514
![Page 16: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/16.jpg)
1615
![Page 17: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/17.jpg)
1716
FAIL!
![Page 18: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/18.jpg)
1817
![Page 19: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/19.jpg)
1918
FAIL!
![Page 20: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/20.jpg)
2019
![Page 21: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/21.jpg)
2120
![Page 22: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/22.jpg)
22
![Page 23: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/23.jpg)
23
Herzlich Willkommen!
Bernd Schiffer
� akquinet AG
� Softwareentwickler
� XP, Scrum, TDD, Groovy, Grails
Stefan Roock
� akquinet AG
� Coach für agile Methoden, Projektleiter, Softwarearchitekt
� XP, Scrum, Akzeptanztests, TDD, Refactoring …
![Page 24: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/24.jpg)
24
Was wir heute zeigen
� Vorstellung von Grails
� Live-Demo: Wir basteln uns eine Session
![Page 25: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/25.jpg)
25
Grails – Der Zuckerguss 1/2
![Page 26: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/26.jpg)
26
Grails – Der Zuckerguss 2/2
![Page 27: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/27.jpg)
27
Groovy – Grails' Dynamik 1/2
� Literale
� GStrings
def vorname = 'Micky'
def nachname = 'Maus'
assert 'Mein Name ist Maus, Micky Maus.' ==
"Mein Name ist $nachname, $vorname $nachname."
def list = [1, 2, 3, 4]def map = [a:1, b:2]
![Page 28: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/28.jpg)
28
Groovy – Grails' Dynamik 2/2
� Closures und Listenoperationen
� RegExp
� IO
def list = [5, 2, 1, 3, 4, 4].collect{ it > 2 }.sort().unique()
assert [3, 4] == list
'23.12.2007, 23.09.2004'.eachMatch(/(\d{2}\.\d{2}\.\d{4})/) { alles, datum ->
println datum
}
new File('file.txt').eachLine{
line -> println line
}
23.12.2007
23.09.2004
![Page 29: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/29.jpg)
29
Java – Die Basis
� Nahtlose Verschmelzung von Java und Groovy
� Nutzung aller vorhandenen Java-Resourcen
� Objekte, Klassen, Threads, Security – keine Überraschungen
![Page 30: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/30.jpg)
30
Domain-Objects & GORM 1/2
� Domain-Objects werden automatisch gemappt
class Kunde {static hasMany = [ adressen : Adresse ]
}
class Adresse {static belongsTo = [ kunde : Kunde ]
}
0..n
![Page 31: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/31.jpg)
31
Domain-Objects & GORM 2/2
� Statische Typisierung zwecks Mapping
class Adresse {String strasseint hausnummerString hausnummernzusatzint postleitzahlString ortDate gueltigVonDate gueltigBis
}
![Page 32: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/32.jpg)
32
Constraints – Validierung der Domäne
class Adresse {String strasseint hausnummer…Date gueltigVon//…static constraints = {
strasse(blank:false)hausnummer(blank:false, min:1)gueltigBis(validator: {
gueltigBis == null || gueltigVon <= gueltigBis})
}}
![Page 33: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/33.jpg)
33
Dynamic Finder – jetzt wird's interessant
Adresse.findAllByPostleitzahl(21502)
Adresse.findAllByPostleitzahlBetween(21000, 21999)
Adresse.findAllByPostleitzahlAndGueltigBis(21502, null)
Adresse.findAllByPostleitzahlBetween(21000, 21999,[sort:'postleitzahl', order:'desc'])
Adresse.list(max:10, offset:100, sort:'postleitzahl', order:'asc')
![Page 34: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/34.jpg)
34
Views – Wir wollen was sehen!
<html><head><title>${kunde.name}</title>
</head><body><ol><g:each in="${kunde.adressen}">
<li>${it.postleitzahl} ${it.ort}</li></g:each>
</ol></body>
</html>
![Page 35: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/35.jpg)
35
Controller – Model und View verbinden
class KundeController {
def index = { redirect action:show }
def show = { [kunde:Kunde.get(params.id)] }
def list = { [kunden:Kunde.list()] }
def save = {if(new Kunde(params).save()) {
render view: 'error'return
} redirect action:list
}}
![Page 36: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/36.jpg)
36
AJAX – Grails' Web-2.0-Tauglichkeit
� eingebaut� Prototype/Script.acoluo.us
� Yahoo! UI (Plugin)
� Dojo (Plugin)
� eingebunden
� benutzt
� JSON, XML-(Un-)Marshalling
<g:javascript library="prototype" />
<div id="message"></div><g:remoteLink action="delete" id="1" update="message">
Lösche Kunde</g:remoteLink>
import grails.converters.*
…
render kunde as JSON
![Page 37: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/37.jpg)
37
TagLibs – Vergessen ist JSP!
class MeineTagLib {def liste = { attrs, body ->
out << '<ol>'attrs.von.each{
out << '<li>'out << body(it)out << '</li>'
}out << '</ol>'
}}
<html><head><title>${kunde.name}</title>
</head><body><g:liste von="${kunde.adressen}">
${it.postleitzahl} ${it.ort}</g:liste>
</body></html>
![Page 38: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/38.jpg)
38
Plugins
� Grails selbst aufbaut aus Plugins
� per Plugin einbindbare Techniken
� Canoo Webtest, GWT, DWR, X-Fire, XML-RPC, Quartz, Spring Security
(Acegi), JCaptcha, Compass + Lucene, LiquiBase, dbmigrate, u.v.v.m.
� http://grails.codehaus.org/plugins
� Modularisierung mit eigenen Plugins
� pro Modul ein Plugin
� technisch oder fachlich geschnitten
� Beeinflussung durch Plugins
� Artefakte, Skripte, MetaObject-Programmierung, EventHandler, Bibliotheken,
uvm.
![Page 39: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/39.jpg)
39
Testen
� Grails ist agil …
� Unittests, Integrationstests (inhärent)
� Akzeptanztests (Plugins: Canoo Webtest und Selenium)
� … weil es Testen einbindet …
� Test-Skelette pro Domain-Class und Controller generiert
� Ausführung der Tests per Skript (einschl. Reports)
� … aber es ist noch viel zu un-extreme …
� Zu langsam!
� … woran gearbeitet wird!
� Interactive mode
� Tests einzeln oder gruppiert ausführbar
![Page 40: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/40.jpg)
40
REST (1/2)
� URL-Mapping
class UrlMappings {static mappings = {
"/kunde/$id?"(controller: 'kunde') {action = [
GET: 'show',PUT: 'update',DELETE: 'delete',POST: 'save'
]}
}}
![Page 41: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/41.jpg)
41
REST (2/2)
� Content-Negotiation
import grails.converters.*…def show = {
def kunden = params.id ? kunde.get(params.id) : kunde.list()withFormat {
html { render template: 'show', model: [kunden: kunden] }xml { render kunden as XML }json { render kunden as JSON }
}}
![Page 42: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/42.jpg)
42
Grails auf Erfolgskurs
� Grails 1.0 seit Anfang 2008
� Grails 1.0.2 momentan stabil
� großer internationaler Zuspruch:� SAP: Composition on Grails (Netweaver basiert)
� Webhoster Contegix' Management auf Grails-Basis
� showbiz.sky.com: > 180 Mio. Hits/Monat
� erste Webseiten in Deutschland� http://www.jobinsiders.de
� http://www.schnaeppchenfuehrer.com
� http://www.planet-ria.org
� http://team-radar.it-agile.de
� http://werkannwann.de
![Page 43: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/43.jpg)
43
Lust bekommen auf mehr?
� Groovy: http://groovy.codehaus.org
� Grails-Mailinglisten: http://grails.codehaus.org/Mailing+lists
� Grails: http://grails.org/
![Page 44: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/44.jpg)
44
Foto-Quellen
� Wrong: http://www.doingitwrong.com/
� 2, 10, 16, 18
� Shipment of Fail: http://www.shipmentoffail.com/
� 19, 21
� The FAIL Blog: http://failblog.wordpress.com/
� 1, 3-9, 11-15, 17, 20
21
![Page 45: Grails - Die Suche hat ein Ende (JAX 2008)](https://reader034.vdocuments.pub/reader034/viewer/2022052316/55a26ccd1a28ab3d4a8b483e/html5/thumbnails/45.jpg)
45
� Schulungen von akquinet it-agile GmbH zu
� Groovy: http://www.akquinet.de/content/java-sap/landing-pages/groovy.html
� Grails: http://www.akquinet.de/content/java-sap/landing-pages/grails.html
� Beratung, Coaching, Inhouse-Schulung
� Entwicklungsunterstützung
Und jetzt die Live-Demo!