GRAILS <ul><ul><li>RAPID WEB APPLICATION DEVELOPMENT MADE EASY </li></ul></ul>
about: Sven Haiges <ul><li>Actionality Deutschland GmbH </li></ul><ul><li>Java EE / ME Entwickler </li></ul><ul><li>Diplom...
Ziele <ul><li>Was steckt hinter Grails, wie erzeuge ich meine erste App? </li></ul><ul><li>Welche Technologien verbergen s...
Agenda Basics Grails Foundations MVC Features Roadmap Weitere Infos, Tipps
Grails Basics
Grails MVC <ul><li>Grails ist ein MVC Web Framework </li></ul><ul><ul><li>Inspiriert von Ruby on Rails </li></ul></ul><ul>...
Grails History & Team <ul><li>Entstand aus E-Mail Diskussion: Guillaume LaForge, Steven Devijver and Graeme Rocher (aktuel...
Grails im Einsatz... <ul><li>Standalone </li></ul><ul><ul><li>Kein XML, keine aufwändige Konfiguration </li></ul></ul><ul>...
Die Basis von Grails <ul><li>Java EE </li></ul><ul><li>Groovy: perfekte Integration mit der Java Plattform, Groovy kompili...
Installation <ul><li>Keine separate Groovy-Installation benötigt, Groovy ist im Download enthalten </li></ul><ul><li>grail...
Ihre erste Grails-Applikation <ul><li>„ grails create-app“ </li></ul><ul><li>„ cd appName” </li></ul><ul><li>„ grails run-...
Grails Foundations
Spring <ul><li>Eine Grails Web Application wird durch Spring “zusammengehalten”, im Normalfall ist keine Anpassung dieser ...
Hibernate <ul><li>Hibernate ist der de facto Standard für O/R Mapping </li></ul><ul><li>Grails erzeugt das DB-Schema basie...
SiteMesh <ul><li>SiteMesh ist ein mächtiges Layout Framework und ist in Grails integriert </li></ul><ul><li>grails-app/vie...
Grails Philosophie <ul><li>Wiederverwendung bestehender Lösungen </li></ul><ul><li>Kein “Reinventing the Wheel” </li></ul>...
Grails MVC
Model <ul><li>Oben: eine Domain-Class </li></ul><ul><ul><li>.groovy-Dateiim grails-app/domain Verzeichnis </li></ul></ul><...
Model <ul><li>Normalerweise werden Domain-Classes per Grails command line tool erzeugt </li></ul><ul><li>Der Task fragt na...
Model <ul><li>1:1 mapping mit Author </li></ul><ul><li>Der “Eigentümer” für cascading update/save wird so festgelegt: </li...
Model <ul><li>1:n mapping: Author hat viele Books </li></ul><ul><li>Property “books” automatisch erzeugt </li></ul><ul><li...
Model <ul><li>m:n ebenso... </li></ul><ul><li>“belongsTo” definiert Eigentümer </li></ul><ul><li>class Book { </li></ul><u...
Model <ul><li>Constraints werden per Closure definiert </li></ul><ul><li>Auswirkungen auf die erzeugten Views </li></ul><u...
Model <ul><li>Dynamic Finder Methods </li></ul><ul><li>def results = Book.findByTitle(&quot;The Stand&quot;) </li></ul><ul...
Model <ul><li>Datenbank-Konfiguration im  grails-app/conf Verzeichnis </li></ul><ul><ul><li>DevelopmentDataSource.groovy <...
Model <ul><li>“grails war” erzeugt das Deployment WAR-File mit der  production  datasource </li></ul><ul><li>class  Develo...
Model <ul><li>*BootStrap-Files werden zum Start ausgeführt; idealer Ort für die Erzeugung von Test-Daten </li></ul><ul><li...
View <ul><li>Groovy Server Pages(GSP) oder  JavaServer Pages (JSP) </li></ul><ul><li>TagLibs für GSP & JSP, GSP ist groovi...
View <ul><li>Beispiel: GSP, benutzt das “main” Layout </li></ul><ul><li>< html > </li></ul><ul><li>< head > </li></ul><ul>...
View <ul><li>Dynamic Tag Libraries </li></ul><ul><li>Tags machen endlich wieder Spaß! </li></ul><ul><li>“grails create-tag...
View <ul><li>TagLib Beispiel  (“simple” tag) </li></ul><ul><li>class  MyTagLib { </li></ul><ul><ul><li>includeJs = { attrs...
View <ul><li>Logische und iterative Tags genauso easy </li></ul><ul><li>Tags können sogar als “Methoden” aus GSP-Seiten au...
View <ul><li>Einfaches Erzeugen von Markup aus Tags heraus: </li></ul><ul><li>def dialog = { attrs, body -> </li></ul><ul>...
Controller <ul><li>Alle Controller werden vom Grails dispatcher servlet gemapped </li></ul><ul><li>Neuer Controller per: “...
Controller <ul><li>Standard-Mapping (Konvention) http://.../appName/controller/action/id </li></ul><ul><li>Best. propertie...
Controller <ul><li>Generierter Controller: </li></ul><ul><li>class  AdvertisementController { </li></ul><ul><li>def  index...
Controller <ul><li>Es geht auch dynamisch: </li></ul><ul><li>class BookController { </li></ul><ul><li>def scaffold = Book ...
Controller <ul><li>Grails Services können die Business Logik kapseln </li></ul><ul><li>Services können sehr einfach in Con...
Controller <ul><li>Beispiel-Service </li></ul><ul><li>class CountryService { </li></ul><ul><li>def String sayHello(String ...
Scaffolding... <ul><li>Benutzen Sie es, um schnell eine voll benutzbare Web-Applikation zu haben und um etwas demonstriere...
Grails Features
Auto Reloading <ul><li>Im Development-Modus, synchronisiert Grails die aktuelle Applikation mit dem (Jetty-)Server </li></...
Spring Integration <ul><li>Zusätzliche Spring-Konfiguration kann im /spring-Verzeichnis abgelegt werden </li></ul><ul><li>...
Hibernate Integration <ul><li>Eigene Hibernate Mappings (HBM Files) für die Domain-Klassen </li></ul><ul><li>Die Arbeit mi...
Eclipse “Integration” <ul><li>Automatisch wird eine Eclipse Projekt-Datei erzeugt - einfach zu importieren: File > Import ...
AJAX <ul><li>Grails unterstützt AJAX mit unterschiedlichen  AJAX toolkits, momentan Prototype, Dojo und Yahoo </li></ul><u...
AJAX <ul><li>Serverseitig unterstützt Grails AJAX durch die render()-Methode.  Hier eine AJAX-Response: </li></ul><ul><li>...
Job Scheduling <ul><li>Grails macht die periodische Ausführung von Jobs noch einfacher: </li></ul><ul><li>class  MyJob { <...
Unit & Functional Testing <ul><li>Sowohl  Unit- als auch Functional-Testing werden unterstützt </li></ul><ul><li>Functiona...
Grails Roadmap
Die Sandbox <ul><li>Neue Controllers </li></ul><ul><li>Page Flows (WebFlow) </li></ul><ul><li>Constraints für DB-Schema-Er...
Roadmap <ul><li>0.3 </li></ul><ul><ul><li>Spring 2 </li></ul></ul><ul><ul><li>Web Services Service Classes </li></ul></ul>...
Roadmap <ul><li>0.5 </li></ul><ul><ul><li>XML-RPC for Service Classes </li></ul></ul><ul><ul><li>Generation des Domain Mod...
Weitere Infos, Tipps
Weitere Infos... <ul><li>Herunterladen, Installieren, die erste App erzeugen mit dem QuickStart Guide: http://www.grails.o...
Weitere Infos... <ul><li>Den User Guide lesen und ausprobieren: http://www.grails.org/User+Guide </li></ul><ul><li>Die Gra...
“SEE” the Light <ul><li>Derzeit gibt es 2 Screencasts über Grails: </li></ul><ul><ul><li>Scaffolding </li></ul></ul><ul><u...
Grails Podcast <ul><li>Grails Podcast </li></ul><ul><li>~ wöchentlich </li></ul><ul><li>Grails News </li></ul><ul><li>Grai...
Lesestoff <ul><li>Erscheint in Kürze! </li></ul><ul><li>Von Graeme Rocher,  Grails Project Lead </li></ul><ul><li>ISBN: 1-...
Machen Sie mit! <ul><li>Veröffentlichen Sie z.B. einen Tag! grails.org/Contribute+a+Tag </li></ul><ul><li>Bloggen Sie über...
Groovy & Grails Shop <ul><li>Kaufen Sie endlich einen richtigen “GString”! </li></ul><ul><li>http://tinyurl.com/y3zmos </l...
GRAILS <ul><ul><li>RAPID WEB APP DEVELOPMENT MADE EASY </li></ul></ul><ul><ul><li>Vielen Dank! Fragen? </li></ul></ul><ul>...
Upcoming SlideShare
Loading in …5
×

Grails 0.3-SNAPSHOT Presentation WJAX 2006

6,782 views

Published on

Presentation at WJAX 2006 in German. Audio will follow soon and can be downloaded from grails.org/Tutorials

Published in: Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
6,782
On SlideShare
0
From Embeds
0
Number of Embeds
58
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Grails 0.3-SNAPSHOT Presentation WJAX 2006

  1. 1. GRAILS <ul><ul><li>RAPID WEB APPLICATION DEVELOPMENT MADE EASY </li></ul></ul>
  2. 2. about: Sven Haiges <ul><li>Actionality Deutschland GmbH </li></ul><ul><li>Java EE / ME Entwickler </li></ul><ul><li>Diplom-Informatiker (FH), MBA </li></ul><ul><li>Meine „Framework-Evolution“: Struts, JSF, Spring MVC, GRAILS </li></ul><ul><li>Seit August 2006: Grails Podcast, Grails Screencasts </li></ul>
  3. 3. Ziele <ul><li>Was steckt hinter Grails, wie erzeuge ich meine erste App? </li></ul><ul><li>Welche Technologien verbergen sich hinter Grails? </li></ul><ul><li>Welche Features sind in Grails enthalten? </li></ul><ul><li>Infos zu weiteren Ressourcen </li></ul>
  4. 4. Agenda Basics Grails Foundations MVC Features Roadmap Weitere Infos, Tipps
  5. 5. Grails Basics
  6. 6. Grails MVC <ul><li>Grails ist ein MVC Web Framework </li></ul><ul><ul><li>Inspiriert von Ruby on Rails </li></ul></ul><ul><ul><li>Benutzt die mächtige Groovy Scriptsprache </li></ul></ul><ul><ul><li>„ Convention Over Configuration” </li></ul></ul><ul><ul><li>„ Don't Repeat Yourself“ (DRY) </li></ul></ul>
  7. 7. Grails History & Team <ul><li>Entstand aus E-Mail Diskussion: Guillaume LaForge, Steven Devijver and Graeme Rocher (aktueller Project Lead) </li></ul><ul><li>0.1 am 29. März, 2006 </li></ul><ul><li>Aktuelles Team: Graeme Rocher, Marc Palmer, Dierk Koenig, Steven Devijer, Jason Rudolph, Sven Haiges... SIE! </li></ul>
  8. 8. Grails im Einsatz... <ul><li>Standalone </li></ul><ul><ul><li>Kein XML, keine aufwändige Konfiguration </li></ul></ul><ul><ul><li>0..100 in no time! </li></ul></ul><ul><li>Integration mit bestehenden Applikationen </li></ul><ul><ul><li>Die Flexibilität von Grails bleibt weitestgehend erhalten, dennoch kann man z.B. das OR-Mapping beliebig konfigurieren </li></ul></ul><ul><ul><li>Etwas Integration zu Beginn </li></ul></ul>
  9. 9. Die Basis von Grails <ul><li>Java EE </li></ul><ul><li>Groovy: perfekte Integration mit der Java Plattform, Groovy kompiliert zu bytecode :-) </li></ul><ul><li>Spring: IoC, Spring MVC, WebFlow, ... </li></ul><ul><li>Hibernate: DER Persistence Layer schlechthin </li></ul><ul><li>SiteMesh: flexibles Layout-Framework </li></ul><ul><li>Quartz: Job Scheduling </li></ul><ul><li>... </li></ul>
  10. 10. Installation <ul><li>Keine separate Groovy-Installation benötigt, Groovy ist im Download enthalten </li></ul><ul><li>grails.org/Installation </li></ul><ul><li>Herunterladen, extrahieren, GRAILS_HOME setzen,Grails command line tool zum Path hinzufügen... fertig. </li></ul><ul><li>„ grails“ zum Test aufrufen </li></ul>
  11. 11. Ihre erste Grails-Applikation <ul><li>„ grails create-app“ </li></ul><ul><li>„ cd appName” </li></ul><ul><li>„ grails run-app“ </li></ul><ul><li>„ grails create-domain-class“, edit class </li></ul><ul><li>„ grails generate-all“ </li></ul><ul><li>„ grails run-app“ </li></ul>
  12. 12. Grails Foundations
  13. 13. Spring <ul><li>Eine Grails Web Application wird durch Spring “zusammengehalten”, im Normalfall ist keine Anpassung dieser Konfiguration notwendig </li></ul><ul><li>Eigene Spring Beans können dennoch einfach deklariert werden. Eigene Beans können sehr einfach in Grails Artefakte wie Controller, Services oder Jobs “injected” werden </li></ul><ul><li>Eine Grails App ist eine „normale“ Spring MVC-Applikation. Spring Webflow kommt... </li></ul>
  14. 14. Hibernate <ul><li>Hibernate ist der de facto Standard für O/R Mapping </li></ul><ul><li>Grails erzeugt das DB-Schema basierend auf den Domain-Klassen automatisch und legt das Schema in der DB-An / führt Update aus </li></ul><ul><ul><li>1:n & m:n seit Grails 0.3 </li></ul></ul><ul><li>Oftmals ist das DB-Schema bereits vorhanden: Grails erlaubt eigene Hibernate Mappings </li></ul>
  15. 15. SiteMesh <ul><li>SiteMesh ist ein mächtiges Layout Framework und ist in Grails integriert </li></ul><ul><li>grails-app/views/layout/main.gsp definiert das Standard-Layout </li></ul><ul><li>Dieses Meta-Element im HTML Header verknüpft eine GSP-Seite mit dem “main” Layout: < meta name = &quot;layout&quot; content = &quot;main&quot; /> </li></ul>
  16. 16. Grails Philosophie <ul><li>Wiederverwendung bestehender Lösungen </li></ul><ul><li>Kein “Reinventing the Wheel” </li></ul><ul><li>“Coding by Convention” </li></ul><ul><ul><li>Ohne jegliche Flexibilität zu verlieren </li></ul></ul><ul><li>Domain-Centric, nicht DB-Centric </li></ul><ul><li>DRY </li></ul>
  17. 17. Grails MVC
  18. 18. Model <ul><li>Oben: eine Domain-Class </li></ul><ul><ul><li>.groovy-Dateiim grails-app/domain Verzeichnis </li></ul></ul><ul><ul><li>Persistent </li></ul></ul><ul><ul><li>id, version, equals, hashCode, toString wird von Grails generiert. Diese Methoden können natürlich bei Bedarf überschrieben werden. </li></ul></ul><ul><li>class Book { </li></ul><ul><li>String title </li></ul><ul><li>} </li></ul>
  19. 19. Model <ul><li>Normalerweise werden Domain-Classes per Grails command line tool erzeugt </li></ul><ul><li>Der Task fragt nach dem Namen der Klasse und erzeugt diese im domain-Verzeichnis </li></ul><ul><li>Klasse kann ebenso selbst erstellt werden... </li></ul><ul><li>> grails create-domain-class </li></ul>
  20. 20. Model <ul><li>1:1 mapping mit Author </li></ul><ul><li>Der “Eigentümer” für cascading update/save wird so festgelegt: </li></ul><ul><li>class Book { </li></ul><ul><li>Author author </li></ul><ul><li>String title </li></ul><ul><li>} </li></ul><ul><li>class Book { </li></ul><ul><ul><li>def belongsTo = Author </li></ul></ul><ul><li>Author author </li></ul><ul><li>String title </li></ul><ul><li>} </li></ul>
  21. 21. Model <ul><li>1:n mapping: Author hat viele Books </li></ul><ul><li>Property “books” automatisch erzeugt </li></ul><ul><li>Ebenso die “addXXX”-Methode </li></ul><ul><li>class Author { </li></ul><ul><ul><li>def hasMany = [ books : Book ] </li></ul></ul><ul><li>String name </li></ul><ul><li>} </li></ul><ul><li>author.addBook(new Book(title:'Grails')) </li></ul><ul><li>author.save() </li></ul>
  22. 22. Model <ul><li>m:n ebenso... </li></ul><ul><li>“belongsTo” definiert Eigentümer </li></ul><ul><li>class Book { </li></ul><ul><li>def belongsTo = Author </li></ul><ul><li>def hasMany = [authors:Author] </li></ul><ul><li>} </li></ul><ul><li>class Author { </li></ul><ul><li>def hasMany = [books:Book] </li></ul><ul><li>} </li></ul>
  23. 23. Model <ul><li>Constraints werden per Closure definiert </li></ul><ul><li>Auswirkungen auf die erzeugten Views </li></ul><ul><li>class User { </li></ul><ul><li>String login </li></ul><ul><li>String password </li></ul><ul><li>String email </li></ul><ul><li>Date age </li></ul><ul><li>static constraints = { </li></ul><ul><li>login(length:5..15,blank:false,unique:true) </li></ul><ul><li>password(length:5..15,blank:false) </li></ul><ul><li>email(email:true,blank:false) </li></ul><ul><li>age(min:new Date().minus(14),nullable:false) </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  24. 24. Model <ul><li>Dynamic Finder Methods </li></ul><ul><li>def results = Book.findByTitle(&quot;The Stand&quot;) </li></ul><ul><li>results = Book.findByTitleLike(&quot;Harry Pot%&quot;) </li></ul><ul><li>results = Book.findByReleaseDateBetween( firstDate, secondDate ) </li></ul><ul><li>results = Book.findByReleaseDateGreaterThan( someDate ) </li></ul><ul><li>Ebenso möglich: Query by Example (QBE) Hibernate Criteria Builder, oder direkte HQL-Abfragen! </li></ul>
  25. 25. Model <ul><li>Datenbank-Konfiguration im grails-app/conf Verzeichnis </li></ul><ul><ul><li>DevelopmentDataSource.groovy </li></ul></ul><ul><ul><li>ProductionDataSource.groovy </li></ul></ul><ul><ul><li>TestDataSource.groovy </li></ul></ul><ul><li>“grails run-app” benutzt standardmäßig die “dev” DataSource </li></ul>
  26. 26. Model <ul><li>“grails war” erzeugt das Deployment WAR-File mit der production datasource </li></ul><ul><li>class DevelopmentDataSource { </li></ul><ul><li>boolean pooling = true </li></ul><ul><li>// one of 'create', 'create-drop','update' </li></ul><ul><li>//String dbCreate = &quot;create-drop&quot; </li></ul><ul><li>String url = &quot;jdbc:postgresql://localhost:5432/act_dev&quot; </li></ul><ul><li>String driverClassName = &quot;org.postgresql.Driver&quot; </li></ul><ul><li>String username = &quot;dev&quot; </li></ul><ul><li>String password = &quot;devpw&quot; </li></ul><ul><li>def logSql = true //enable logging of SQL generated by Hibernate </li></ul><ul><li>} </li></ul>
  27. 27. Model <ul><li>*BootStrap-Files werden zum Start ausgeführt; idealer Ort für die Erzeugung von Test-Daten </li></ul><ul><li>class CompanyBootStrap { </li></ul><ul><li>def init = { servletContext -> </li></ul><ul><li>//Delete all data in the tables that we work on </li></ul><ul><li>Company.executeUpdate( &quot;delete Company&quot; ) </li></ul><ul><li>//now create the test data </li></ul><ul><li>Company c1 = new Company(name: 'bmw' ) </li></ul><ul><li>c1.addUser( new User(name: 'herbert' , admin: true , ...)) </li></ul><ul><li>.save() </li></ul><ul><li>} </li></ul><ul><li>... </li></ul>
  28. 28. View <ul><li>Groovy Server Pages(GSP) oder JavaServer Pages (JSP) </li></ul><ul><li>TagLibs für GSP & JSP, GSP ist groovier... </li></ul><ul><li>Alle Views sind im grails-app/views Verzeichnis </li></ul><ul><li>Die CRUD-Views können einfach generiert werden: “grails generate-views” </li></ul>
  29. 29. View <ul><li>Beispiel: GSP, benutzt das “main” Layout </li></ul><ul><li>< html > </li></ul><ul><li>< head > </li></ul><ul><li>< meta name = &quot;layout&quot; content = &quot;main&quot; /> </li></ul><ul><li>< title > BlogEntry List </ title > </li></ul><ul><li></ head > </li></ul><ul><li>< body > </li></ul><ul><li>< div class = &quot;nav&quot; > </li></ul><ul><li>< span class = &quot;menuButton&quot; > < g:link controller = &quot;authentication&quot; action = &quot;viewControllers&quot; > Home </ g:link ></ span > </li></ul><ul><li>< span class = &quot;menuButton&quot; >< g:link action = &quot;create&quot; > New BlogEntry </ g:link ></ span > </li></ul><ul><li></ div > </li></ul><ul><li>< div class = &quot;body&quot; > </li></ul><ul><ul><li>... </li></ul></ul><ul><li></ div > </li></ul><ul><ul><li>... </li></ul></ul>
  30. 30. View <ul><li>Dynamic Tag Libraries </li></ul><ul><li>Tags machen endlich wieder Spaß! </li></ul><ul><li>“grails create-taglib” erzeugt ein *TagLib.groovy File in grails-app/taglib </li></ul><ul><li>Wie mit GSP/Controller updates: kein Server-Restart! </li></ul>
  31. 31. View <ul><li>TagLib Beispiel (“simple” tag) </li></ul><ul><li>class MyTagLib { </li></ul><ul><ul><li>includeJs = { attrs -> </li></ul></ul><ul><li>out << &quot;<script src='scripts/ ${attrs['script']} .js' />&quot; </li></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul><ul><li>OutputStream ist automatich über “out” erreichbar </li></ul><ul><li>Alle Tag-Attribute in der “attrs”-Map </li></ul>
  32. 32. View <ul><li>Logische und iterative Tags genauso easy </li></ul><ul><li>Tags können sogar als “Methoden” aus GSP-Seiten aufgerufen werden: </li></ul><ul><li><g:hasErrors bean=&quot;${book}&quot; field=&quot;title&quot;> </li></ul><ul><li><span class='label error'>There were errors on the book title</span> </li></ul><ul><li></g:hasErrors> </li></ul><ul><li>Oder als Methode: </li></ul><ul><li><span id=&quot;title&quot; class=&quot;label ${hasErrors(bean:book,field:'title','errors')}&quot;>Title</span> </li></ul>
  33. 33. View <ul><li>Einfaches Erzeugen von Markup aus Tags heraus: </li></ul><ul><li>def dialog = { attrs, body -> </li></ul><ul><li>mkp { </li></ul><ul><li>div('class':'dialog') { </li></ul><ul><li>body() </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>Beispiel: Groovy MarkupBuilder </li></ul>
  34. 34. Controller <ul><li>Alle Controller werden vom Grails dispatcher servlet gemapped </li></ul><ul><li>Neuer Controller per: “grails create-controller” </li></ul><ul><li>Oder: Generierung auf Basis einer Bestehenden Domain-Klasse: “grails generate-controller” </li></ul>
  35. 35. Controller <ul><li>Standard-Mapping (Konvention) http://.../appName/controller/action/id </li></ul><ul><li>Best. properties automatisch </li></ul><ul><ul><li>flash – Map speichert Nachrichten für nächsten Request </li></ul></ul><ul><ul><li>log - eine Log4J Logger-Instanz </li></ul></ul><ul><ul><li>params – Map mit allen Parametern </li></ul></ul><ul><ul><li>request/response/servletContext etc. </li></ul></ul>
  36. 36. Controller <ul><li>Generierter Controller: </li></ul><ul><li>class AdvertisementController { </li></ul><ul><li>def index = { redirect(action:list,params:params) } </li></ul><ul><li>def list = { </li></ul><ul><li>[ advertisementList: Advertisement.list( params ) ] </li></ul><ul><li>} </li></ul><ul><li>def show = { </li></ul><ul><li>[ advertisement : Advertisement.get( params.id ) ] </li></ul><ul><li>} </li></ul><ul><li>... </li></ul>
  37. 37. Controller <ul><li>Es geht auch dynamisch: </li></ul><ul><li>class BookController { </li></ul><ul><li>def scaffold = Book </li></ul><ul><li>} </li></ul><ul><li>list/show/edit/delete/create/save/ update “dynamisch” verfügbar </li></ul><ul><li>Überschreiben einzelner Actions möglich! </li></ul><ul><li>“grails generate-all” erzeugt alle Views Controller-Actions für eine Domain Class </li></ul>
  38. 38. Controller <ul><li>Grails Services können die Business Logik kapseln </li></ul><ul><li>Services können sehr einfach in Controller-Klassen aufgerufen werden </li></ul><ul><li>“grails create-service” erzeugt einen neuen Service in grails-app/services </li></ul>
  39. 39. Controller <ul><li>Beispiel-Service </li></ul><ul><li>class CountryService { </li></ul><ul><li>def String sayHello(String name) { </li></ul><ul><li>return &quot;hello ${name}&quot; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>Aufruf aus einem Controller: </li></ul><ul><li>class GreetingController { </li></ul><ul><li>CountryService countryService </li></ul><ul><li>def helloAction = { </li></ul><ul><li>render(countryService.sayHello(params.name)) </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  40. 40. Scaffolding... <ul><li>Benutzen Sie es, um schnell eine voll benutzbare Web-Applikation zu haben und um etwas demonstrieren zu können. </li></ul><ul><li>Auf dem Weg zum Endprodukt werden Sie sicherlich zahlreiche Änderungen vornehmen müssen. </li></ul><ul><li>Benutzen Sie Scaffolding, um schnell zu Lernen! Passen Sie dann alles gemäß Ihren Anforderungen an. </li></ul>
  41. 41. Grails Features
  42. 42. Auto Reloading <ul><li>Im Development-Modus, synchronisiert Grails die aktuelle Applikation mit dem (Jetty-)Server </li></ul><ul><li>Controller, GSPs, Tag Libraries, Domain-Klassen, Services, etc. </li></ul><ul><li>Dadurch möglich: iterative und inkrementelle Entwicklung </li></ul><ul><li>“agile” </li></ul>
  43. 43. Spring Integration <ul><li>Zusätzliche Spring-Konfiguration kann im /spring-Verzeichnis abgelegt werden </li></ul><ul><li>Automatische DI ist auch für diese Beans verfügbar </li></ul><ul><li>Bestehende (Java-) Funktionalität (per Spring) sehr einfach integrierbar </li></ul>
  44. 44. Hibernate Integration <ul><li>Eigene Hibernate Mappings (HBM Files) für die Domain-Klassen </li></ul><ul><li>Die Arbeit mit “legacy database schemas” wird dadurch sehr einfach und effizient </li></ul><ul><li>Trotzdem können Sie dynamische Finder-Methoden (GORM) verwenden! </li></ul>
  45. 45. Eclipse “Integration” <ul><li>Automatisch wird eine Eclipse Projekt-Datei erzeugt - einfach zu importieren: File > Import > Existing Project </li></ul><ul><li>Achtung: bie Snapshots müssen ein paar Pfade/Dateinamen aktualisiert werden... </li></ul><ul><li>Installieren Sie auf jeden Fall das Groovy Plugin: groovy.codehaus.org/Eclipse+Plugin </li></ul>
  46. 46. AJAX <ul><li>Grails unterstützt AJAX mit unterschiedlichen AJAX toolkits, momentan Prototype, Dojo und Yahoo </li></ul><ul><li>Spezielle AJAX Tags können für asynchrone Aufrufe und Form-Submissions benutzt werden: </li></ul><ul><li><div id=&quot;message&quot;></div> </li></ul><ul><li><g:remoteLink action=&quot;delete&quot; id=&quot;1&quot; update=&quot;message&quot;>Delete Book</g:remoteLink> </li></ul>
  47. 47. AJAX <ul><li>Serverseitig unterstützt Grails AJAX durch die render()-Methode. Hier eine AJAX-Response: </li></ul><ul><li>def time = { </li></ul><ul><li>render (contentType:'text/xml') { </li></ul><ul><li>time(new Date()) </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>Render() unterstützt MarkupBuilder für XML, HTML, JSON und OpenRico </li></ul>
  48. 48. Job Scheduling <ul><li>Grails macht die periodische Ausführung von Jobs noch einfacher: </li></ul><ul><li>class MyJob { </li></ul><ul><ul><li>def cronExpression = &quot;0,15,30,45 * * * * ?&quot; //every 15 seconds </li></ul></ul><ul><ul><li>def execute(){ </li></ul></ul><ul><ul><ul><li>println &quot;Running job!&quot; </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul>
  49. 49. Unit & Functional Testing <ul><li>Sowohl Unit- als auch Functional-Testing werden unterstützt </li></ul><ul><li>Functional Testing: Canoo Webtest </li></ul><ul><ul><li>“grails test-app” startet alle Unit-Tests </li></ul></ul><ul><ul><li>“grails run-webtest” für alle WebTests </li></ul></ul><ul><li>Funktionale Tests werden einfach per scaffolding erzeugt: </li></ul><ul><ul><li>“grails generate-webtest” </li></ul></ul>
  50. 50. Grails Roadmap
  51. 51. Die Sandbox <ul><li>Neue Controllers </li></ul><ul><li>Page Flows (WebFlow) </li></ul><ul><li>Constraints für DB-Schema-Erzeugung </li></ul><ul><li>Laszlo on Grails </li></ul><ul><li>Mail / Messaging Integration </li></ul><ul><li>Test DataSets </li></ul><ul><li>Plugin-System </li></ul>
  52. 52. Roadmap <ul><li>0.3 </li></ul><ul><ul><li>Spring 2 </li></ul></ul><ul><ul><li>Web Services Service Classes </li></ul></ul><ul><ul><li>M:N Mapping for GORM </li></ul></ul><ul><li>0.4 </li></ul><ul><ul><li>DWR Support für Service Classes </li></ul></ul><ul><ul><li>Pluggable Persistence Layer </li></ul></ul>
  53. 53. Roadmap <ul><li>0.5 </li></ul><ul><ul><li>XML-RPC for Service Classes </li></ul></ul><ul><ul><li>Generation des Domain Model vom DB Schema </li></ul></ul><ul><li>0.6 </li></ul><ul><ul><li>Scaffolding für User Authentication Code </li></ul></ul><ul><ul><li>Grails ist immer noch klein und fein: Sie entscheiden, was wichtig wird: http://jira.codehaus.org/browse/GRAILS </li></ul></ul>
  54. 54. Weitere Infos, Tipps
  55. 55. Weitere Infos... <ul><li>Herunterladen, Installieren, die erste App erzeugen mit dem QuickStart Guide: http://www.grails.org/Quick+Start </li></ul><ul><li>Tutorials lesen: http://www.grails.org/Tutorials </li></ul>
  56. 56. Weitere Infos... <ul><li>Den User Guide lesen und ausprobieren: http://www.grails.org/User+Guide </li></ul><ul><li>Die Grails Mailing List lesen: http://www.grails.org/Mailing+lists </li></ul><ul><li>Achtung: Grails ist open source... </li></ul><ul><ul><li>Je mehr Sie selbst dazu beitragen, desto schneller lernen Sie Grails kennen </li></ul></ul>
  57. 57. “SEE” the Light <ul><li>Derzeit gibt es 2 Screencasts über Grails: </li></ul><ul><ul><li>Scaffolding </li></ul></ul><ul><ul><li>Directory Structure </li></ul></ul><ul><ul><li>http://www.grails.org/Grails+Screencasts </li></ul></ul>
  58. 58. Grails Podcast <ul><li>Grails Podcast </li></ul><ul><li>~ wöchentlich </li></ul><ul><li>Grails News </li></ul><ul><li>Grails Features </li></ul><ul><li>Interviews </li></ul><ul><li>Agile Development </li></ul><ul><ul><li>http://hansamann.podspot.de/rss </li></ul></ul>
  59. 59. Lesestoff <ul><li>Erscheint in Kürze! </li></ul><ul><li>Von Graeme Rocher, Grails Project Lead </li></ul><ul><li>ISBN: 1-59059-758-3 </li></ul>
  60. 60. Machen Sie mit! <ul><li>Veröffentlichen Sie z.B. einen Tag! grails.org/Contribute+a+Tag </li></ul><ul><li>Bloggen Sie über Grails! </li></ul><ul><li>Beantworten Sie Fragen in der Grails User List </li></ul><ul><li>und... </li></ul>
  61. 61. Groovy & Grails Shop <ul><li>Kaufen Sie endlich einen richtigen “GString”! </li></ul><ul><li>http://tinyurl.com/y3zmos </li></ul>Neu!
  62. 62. GRAILS <ul><ul><li>RAPID WEB APP DEVELOPMENT MADE EASY </li></ul></ul><ul><ul><li>Vielen Dank! Fragen? </li></ul></ul><ul><ul><li>www.grails.org www.svenhaiges.de </li></ul></ul><ul><ul><li>skype: hansamann </li></ul></ul>

×