45
Grails Der Gral der Webentwicklung Stefan Roock [email protected] Bernd Schiffer [email protected] 22.04.2008 JAX

Grails - Die Suche hat ein Ende (JAX 2008)

Embed Size (px)

Citation preview

Page 1: Grails - Die Suche hat ein Ende (JAX 2008)

– Grails –

Der Gral der Webentwicklung

Stefan [email protected]

Bernd [email protected]

22.04.2008JAX

Page 2: Grails - Die Suche hat ein Ende (JAX 2008)

21

Page 3: Grails - Die Suche hat ein Ende (JAX 2008)

32

FAIL!

Page 4: Grails - Die Suche hat ein Ende (JAX 2008)

43

FAIL!

Page 5: Grails - Die Suche hat ein Ende (JAX 2008)

54 FAIL!

Page 6: Grails - Die Suche hat ein Ende (JAX 2008)

65

Page 7: Grails - Die Suche hat ein Ende (JAX 2008)

76

Page 8: Grails - Die Suche hat ein Ende (JAX 2008)

87

Page 9: Grails - Die Suche hat ein Ende (JAX 2008)

98

Page 10: Grails - Die Suche hat ein Ende (JAX 2008)

109

Page 11: Grails - Die Suche hat ein Ende (JAX 2008)

1110

FAIL!

Page 12: Grails - Die Suche hat ein Ende (JAX 2008)

1211 FAIL!

Page 13: Grails - Die Suche hat ein Ende (JAX 2008)

1312

Page 14: Grails - Die Suche hat ein Ende (JAX 2008)

1413

Page 15: Grails - Die Suche hat ein Ende (JAX 2008)

1514

Page 16: Grails - Die Suche hat ein Ende (JAX 2008)

1615

Page 17: Grails - Die Suche hat ein Ende (JAX 2008)

1716

FAIL!

Page 18: Grails - Die Suche hat ein Ende (JAX 2008)

1817

Page 19: Grails - Die Suche hat ein Ende (JAX 2008)

1918

FAIL!

Page 20: Grails - Die Suche hat ein Ende (JAX 2008)

2019

Page 21: Grails - Die Suche hat ein Ende (JAX 2008)

2120

Page 22: Grails - Die Suche hat ein Ende (JAX 2008)

22

Page 23: Grails - Die Suche hat ein Ende (JAX 2008)

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)

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)

25

Grails – Der Zuckerguss 1/2

Page 26: Grails - Die Suche hat ein Ende (JAX 2008)

26

Grails – Der Zuckerguss 2/2

Page 27: Grails - Die Suche hat ein Ende (JAX 2008)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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!