SlideShare ist ein Scribd-Unternehmen logo
1 von 46
Downloaden Sie, um offline zu lesen
Grails, from scratch to prod

… plus vite !



!"#$%&"'()*+,-&            12+3,().)2(%0+&-+#/(%01)
!"#$%&'(#')*+,-()          4+-5,67-).)678.99504&-#:+;-#4<"/9-#9(%0+&-+#/(%01)
./0+*).)(/(%0123+,-(450)   8*9:&.)678.99,&"=43+,-(450)
Qu'est-ce que Grails ?
Qu'est-ce que Grails ?
!  Framework d'application web complet
   !  MVC, basé sur le langage Groovy


!  Inspiré de RoR, Django, TurboGears
    !  Adapté à la culture Java


!  Bâti sur le roc
   !  Stack éprouvée : Spring, Hibernate, Tomcat
Buts
!  Pile application web Java standard
   !  Fournir un niveau d'abstraction en plus


!  Réduire la complexité
   !  En outillant l'existant


!  Augmenter la productivité
   !  En scriptant les tâches répétitives
Approche
!  Convention over configuration
   !  Principe de "défaut raisonnable"


!  Don't repeat yourself
   !  Structure imposée pour réduire les duplications


!  Plateforme complète
   !  Méthodologie et approche fournies
Histoire
!  Janvier 2007
    !  Sortie de Groovy 1.0


!  Février 2008
   !  Sortie de Grails 1.0


!  Novembre 2008
   !  SpringSource rachète G2One
Rock Stars
!  Guillaume Laforge (@glaforge)
   !  Leader Groovy chez SpringSource




!  Graeme Rocher (@graemerocher)
   !  Leader Grails chez SpringSource
Comment ça marche ?
Plateforme complète
Simplifié par Groovy
!  Syntaxe allégée
   !  Accessible à tous les développeurs Java


!  Closures, Collections, Gpars, …
   !  L'essayer c'est l'adopter


!  Scripts de génération de code
   !  Facilement extensible
Développement rapide
                         ?+$')




                  @-3)           !";+)




 <0+('+)   0%#)                          >(0)
Support IDE
!  Intellij IDEA



!  Eclipse STS



!  Netbeans
$ grails create-app bookstore
Structure d'un projet
bookstore!
|_grails-app!
| !|_conf       !   !=> BootStraping, Datasources, UrlMappings!
| !|_controllers!
| !|_domain!
| !|_i18n       !   !=> messages.properties internationalisés!
| !|_services!
| !|_taglib!
| !|_utils!
| !|_views      !   !=> Groovy Server Pages!
|_lib   !       !   !=> Dépendances Java!
|_scripts!
|_src!
| !|_groovy!
| !|_java!
|_test!
|_web-app       !   !=> Ressources statiques: images, JS, CSS, etc!
Scaffolding
!  Génération de CRUD à partir des entités
   !  Economie de temps


!  Popularisé par Ruby on Rails
   !  Orienté schéma base de données


!  Adopté par Grails
   !  Orienté domaine
Scaffolding
!  grails create-domain-class


!  grails create-controller


!  grails create-service


!  grails generate-all
Scaffolding
Scaffolding
!  grails generate-all org.bookstore.Book
    !  BookController
    !  BookControllerTest
    !  grails-app/views/book/list.gsp
    !  grails-app/views/book/show.gsp
    !  grails-app/views/book/edit.gsp
    !  grails-app/views/book/create.gsp
Scaffolding dynamique
class BookController {   class BookController {
 def index = {…}          def scaffold = true
 def list = {…}          }
 def create = {…}
 def save = {…}
 def show = {…}
 def edit = {…}
 def update = {…}
 def delete = {…}
}
GORM : Mapping
class Book {
  String title
  static belongsTo = [author: Author]
  static hasMany = [chapters: Chapters]
  static constraints = {
      title nullable:false
  }
}
GORM : Requêtage
Book.list(sort: 'title', order: 'asc')
Book.getAll(37, 41, 43)
Book.findByTitleLike("Harry P%")
Book.withCriteria {
  eq('title', 'Harry Potter')
  author {
     like('Rowli%')
  }
}
GORM : Requêtage
class Book {
  static namedQueries = {
     withPotterInTitle {
           like 'title', '%Potter%'
     }
  }
}
Book.withPotterInTitle.list()
Vues
!  Groovy Server Pages
   !  HTML + Taglib groovy


!  Assemblage par Sitemesh
   !  Commandé par tags GSP


!  Taglib Grails (Prototype pour le JS)
    !  Formulaires, AJAX
Vues : exemples
<g:formRemote name="myForm"
       on404="alert('not found!')"
       update="updateMe"           // onSuccess="jsFunc"
       url="[action:'show']">
Login: <input name="login" type="text"></input>
</g:formRemote>

<div id="updateMe">this div is updated by the form</div>

!  fieldRemote, remoteFunction
Vues : exemples
<g:each var="book" in="${books}">

  <p>Title: ${book.title}</p>
  <p>Author: ${book.author}</p>

</g:each>

!  if, else, formatDate, sortableColumn, datePicker,
  …
Contrôleurs
!  grails create-controller org.bookstore.Book
    !  Génère un contrôlleur coquille


!  Injection de dépendance
    !  def leNomDeMonService en attribut de classe


!  Helpers
   !  render as JSON, render as XML
Contrôleurs : exemple
class AuthorController {
  def springSecurityService

    def list = {
       [ authorInstanceList: Author.list(),
         authorInstanceTotal: Author.count() ]
    }
}
Configuration : dépendances
grails.project.dependency.resolution = {
  repositories {
    grailsPlugins()
    grailsHome()
    grailsCentral()
    mavenLocal()
    mavenCentral()
    mavenRepo "http://snapshots.repository.codehaus.org"
  }
  dependencies {
    runtime 'mysql:mysql-connector-java:5.1.13'
  }
}
Configuration : environnements
environments {
   development {
     dataSource {
         dbCreate = "create-drop"
         url = "jdbc:hsqldb:mem:devDB" } }
  test { dataSource { … } }
  production { dataSource { … } }
}
Environnements
!  grails run-app     => dev

!  grails test run-app => test


!  grails test-app    => test

!  grails war         => production
Extensible
!  Dépôt de plugins centralisé
!  grails install-plugin …
    !  spring-security-core
    !  spring-security-ui
    !  quartz
    !  codenarc
    !  mongodb
    !  spock
    !  …
Très extensible
  !  app-engine    (GORM en mode JPA)

  !  groovy-plus-plus
  !  jquery
  !  searchable
  !  gwt
  !  feeds
  !  birt-report
  !  …
!  ou : grails create-plugin monPlugin
Extensible
!  Plugin Grails == Application Grails
Questions fréquemment posées
Intégration continue ?
Est-ce performant ?
!  Overhead Groovy : x5-7
   !  Utilisez Groovy++ (x3-5)


!  Productivité contre vitesse d'exécution
   !  Pas de compile check ? Pas grave.


!  Optimisations Java
   !  "src/java" ou librairies
Et la courbe d'apprentissage ?
!  Groovy s'apprend vite
   !  Bases ~ 2 jours, Courant ~ 1 mois


!  Pièges, GORM Gotchas
   !  Dans l'ensemble, rien ne bloque longtemps


!  Au delà de la carrosserie
   !  Sur le Tao de Grails, la stack tu maîtriseras
La communauté est-elle active ?
!  7 versions mineures en 1 an


!  ~ 60 Users Group sur la planète


!  ~ 800 repository GitHub autour de Grails


!  ~ 2500 mails par mois sur les ML
Y a-t-il du support ?
Dans quels cas utiliser Grails ?
!  Minimum Viable Product rapide
  !  Du prototype au produit en douceur



!  Reprise d'une application existante
  !  IHM Web rapide, intégration existant en librairie



!  Tout nouveau projet d'appli web
  !  En toute simplicité "
Success stories
Bibliothèque
Linkothèque
!  Groovy home
   !  http://groovy.codehaus.org/
!  Grails home
   !  http://www.grails.org
!  Grails plugins
   !  http://www.grails.org/plugins/
!  An army of solipsists (this week in Grails)
   !  http://burtbeckwith.com/blog/
Questions ?
Merci à tous
       et bon appétit

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (19)

Apprenez le jQuery
Apprenez le jQueryApprenez le jQuery
Apprenez le jQuery
 
Paris RailsCamp 2009
Paris RailsCamp 2009Paris RailsCamp 2009
Paris RailsCamp 2009
 
Jquery - introduction au langage
Jquery - introduction au langageJquery - introduction au langage
Jquery - introduction au langage
 
Tout ce que le getting started mongodb ne vous dira pas
Tout ce que le getting started mongodb ne vous dira pasTout ce que le getting started mongodb ne vous dira pas
Tout ce que le getting started mongodb ne vous dira pas
 
jQuery
jQueryjQuery
jQuery
 
Introduction a jQuery
Introduction a jQueryIntroduction a jQuery
Introduction a jQuery
 
MUG Nantes - MongoDB et son connecteur pour hadoop
MUG Nantes - MongoDB et son connecteur pour hadoopMUG Nantes - MongoDB et son connecteur pour hadoop
MUG Nantes - MongoDB et son connecteur pour hadoop
 
Conférence #nwx2014 - Thibaud Juin - Varnish, accélérateur web
Conférence #nwx2014 - Thibaud Juin - Varnish, accélérateur webConférence #nwx2014 - Thibaud Juin - Varnish, accélérateur web
Conférence #nwx2014 - Thibaud Juin - Varnish, accélérateur web
 
Dynamic Languages
Dynamic LanguagesDynamic Languages
Dynamic Languages
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab Elasticsearch
 
Cascalog présenté par Bertrand Dechoux
Cascalog présenté par Bertrand DechouxCascalog présenté par Bertrand Dechoux
Cascalog présenté par Bertrand Dechoux
 
Migrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshop
Migrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshopMigrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshop
Migrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshop
 
Elasticsearch - OSDC France 2012
Elasticsearch - OSDC France 2012Elasticsearch - OSDC France 2012
Elasticsearch - OSDC France 2012
 
Lyon JUG - Elasticsearch
Lyon JUG - ElasticsearchLyon JUG - Elasticsearch
Lyon JUG - Elasticsearch
 
MongoDB et Elasticsearch, meilleurs ennemis ?
MongoDB et Elasticsearch, meilleurs ennemis ?MongoDB et Elasticsearch, meilleurs ennemis ?
MongoDB et Elasticsearch, meilleurs ennemis ?
 
Jquery
JqueryJquery
Jquery
 
JQuery
JQueryJQuery
JQuery
 
Elasticsearch - Montpellier JUG
Elasticsearch - Montpellier JUGElasticsearch - Montpellier JUG
Elasticsearch - Montpellier JUG
 
Paris data geek - Elasticsearch
Paris data geek - ElasticsearchParis data geek - Elasticsearch
Paris data geek - Elasticsearch
 

Ähnlich wie Grails from scratch to prod - MixIT 2011

Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
guest6e3bed
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
JS Bournival
 
Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008
Guillaume Laforge
 
Enib cours c.a.i. web - séance #1 - html5 css3-js - 2
Enib   cours c.a.i. web - séance #1 - html5 css3-js - 2Enib   cours c.a.i. web - séance #1 - html5 css3-js - 2
Enib cours c.a.i. web - séance #1 - html5 css3-js - 2
Horacio Gonzalez
 
Présentation Gradle au LyonJUG par Grégory Boissinot - Zenika
Présentation Gradle au LyonJUG par Grégory Boissinot - ZenikaPrésentation Gradle au LyonJUG par Grégory Boissinot - Zenika
Présentation Gradle au LyonJUG par Grégory Boissinot - Zenika
Zenika
 
Cours yeoman backbone box2d
Cours yeoman backbone box2dCours yeoman backbone box2d
Cours yeoman backbone box2d
hugomallet
 

Ähnlich wie Grails from scratch to prod - MixIT 2011 (20)

Grails from scratch to prod - MixIT 2010
Grails from scratch to prod - MixIT 2010Grails from scratch to prod - MixIT 2010
Grails from scratch to prod - MixIT 2010
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
 
Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008
 
La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans Drupal
 
Codedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
Codedarmor 2012 - 06/03 - HTML5, CSS3 et JavascriptCodedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
Codedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
 
AngularJS et autres techno frontend
AngularJS et autres techno frontendAngularJS et autres techno frontend
AngularJS et autres techno frontend
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJS
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
Séminaire Ruby on Rails (novembre 2010)
Séminaire Ruby on Rails (novembre 2010)Séminaire Ruby on Rails (novembre 2010)
Séminaire Ruby on Rails (novembre 2010)
 
Performance et optimisation de PrestaShop
Performance et optimisation de PrestaShopPerformance et optimisation de PrestaShop
Performance et optimisation de PrestaShop
 
Gradle_LyonJUG
Gradle_LyonJUGGradle_LyonJUG
Gradle_LyonJUG
 
Développer sereinement avec Node.js
Développer sereinement avec Node.jsDévelopper sereinement avec Node.js
Développer sereinement avec Node.js
 
Enib cours c.a.i. web - séance #1 - html5 css3-js - 2
Enib   cours c.a.i. web - séance #1 - html5 css3-js - 2Enib   cours c.a.i. web - séance #1 - html5 css3-js - 2
Enib cours c.a.i. web - séance #1 - html5 css3-js - 2
 
SSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQLSSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQL
 
Présentation Gradle au LyonJUG par Grégory Boissinot - Zenika
Présentation Gradle au LyonJUG par Grégory Boissinot - ZenikaPrésentation Gradle au LyonJUG par Grégory Boissinot - Zenika
Présentation Gradle au LyonJUG par Grégory Boissinot - Zenika
 
L'Open Web en tant que pierre angulaire du développement multi-objets
L'Open Web en tant que pierre angulaire du développement multi-objetsL'Open Web en tant que pierre angulaire du développement multi-objets
L'Open Web en tant que pierre angulaire du développement multi-objets
 
Introduction au langage Go
Introduction au langage GoIntroduction au langage Go
Introduction au langage Go
 
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014Démo Gatling au Performance User Group de Casablanca - 25 sept 2014
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014
 
Cours yeoman backbone box2d
Cours yeoman backbone box2dCours yeoman backbone box2d
Cours yeoman backbone box2d
 

Grails from scratch to prod - MixIT 2011

  • 1. Grails, from scratch to prod … plus vite ! !"#$%&"'()*+,-& 12+3,().)2(%0+&-+#/(%01) !"#$%&'(#')*+,-() 4+-5,67-).)678.99504&-#:+;-#4<"/9-#9(%0+&-+#/(%01) ./0+*).)(/(%0123+,-(450) 8*9:&.)678.99,&"=43+,-(450)
  • 2.
  • 4. Qu'est-ce que Grails ? !  Framework d'application web complet !  MVC, basé sur le langage Groovy !  Inspiré de RoR, Django, TurboGears !  Adapté à la culture Java !  Bâti sur le roc !  Stack éprouvée : Spring, Hibernate, Tomcat
  • 5. Buts !  Pile application web Java standard !  Fournir un niveau d'abstraction en plus !  Réduire la complexité !  En outillant l'existant !  Augmenter la productivité !  En scriptant les tâches répétitives
  • 6. Approche !  Convention over configuration !  Principe de "défaut raisonnable" !  Don't repeat yourself !  Structure imposée pour réduire les duplications !  Plateforme complète !  Méthodologie et approche fournies
  • 7. Histoire !  Janvier 2007 !  Sortie de Groovy 1.0 !  Février 2008 !  Sortie de Grails 1.0 !  Novembre 2008 !  SpringSource rachète G2One
  • 8. Rock Stars !  Guillaume Laforge (@glaforge) !  Leader Groovy chez SpringSource !  Graeme Rocher (@graemerocher) !  Leader Grails chez SpringSource
  • 11. Simplifié par Groovy !  Syntaxe allégée !  Accessible à tous les développeurs Java !  Closures, Collections, Gpars, … !  L'essayer c'est l'adopter !  Scripts de génération de code !  Facilement extensible
  • 12. Développement rapide ?+$') @-3) !";+) <0+('+) 0%#) >(0)
  • 13. Support IDE !  Intellij IDEA !  Eclipse STS !  Netbeans
  • 14. $ grails create-app bookstore
  • 15. Structure d'un projet bookstore! |_grails-app! | !|_conf ! !=> BootStraping, Datasources, UrlMappings! | !|_controllers! | !|_domain! | !|_i18n ! !=> messages.properties internationalisés! | !|_services! | !|_taglib! | !|_utils! | !|_views ! !=> Groovy Server Pages! |_lib ! ! !=> Dépendances Java! |_scripts! |_src! | !|_groovy! | !|_java! |_test! |_web-app ! !=> Ressources statiques: images, JS, CSS, etc!
  • 16. Scaffolding !  Génération de CRUD à partir des entités !  Economie de temps !  Popularisé par Ruby on Rails !  Orienté schéma base de données !  Adopté par Grails !  Orienté domaine
  • 17. Scaffolding !  grails create-domain-class !  grails create-controller !  grails create-service !  grails generate-all
  • 19. Scaffolding !  grails generate-all org.bookstore.Book !  BookController !  BookControllerTest !  grails-app/views/book/list.gsp !  grails-app/views/book/show.gsp !  grails-app/views/book/edit.gsp !  grails-app/views/book/create.gsp
  • 20. Scaffolding dynamique class BookController { class BookController { def index = {…} def scaffold = true def list = {…} } def create = {…} def save = {…} def show = {…} def edit = {…} def update = {…} def delete = {…} }
  • 21. GORM : Mapping class Book { String title static belongsTo = [author: Author] static hasMany = [chapters: Chapters] static constraints = { title nullable:false } }
  • 22. GORM : Requêtage Book.list(sort: 'title', order: 'asc') Book.getAll(37, 41, 43) Book.findByTitleLike("Harry P%") Book.withCriteria { eq('title', 'Harry Potter') author { like('Rowli%') } }
  • 23. GORM : Requêtage class Book { static namedQueries = { withPotterInTitle { like 'title', '%Potter%' } } } Book.withPotterInTitle.list()
  • 24. Vues !  Groovy Server Pages !  HTML + Taglib groovy !  Assemblage par Sitemesh !  Commandé par tags GSP !  Taglib Grails (Prototype pour le JS) !  Formulaires, AJAX
  • 25. Vues : exemples <g:formRemote name="myForm" on404="alert('not found!')" update="updateMe" // onSuccess="jsFunc" url="[action:'show']"> Login: <input name="login" type="text"></input> </g:formRemote> <div id="updateMe">this div is updated by the form</div> !  fieldRemote, remoteFunction
  • 26. Vues : exemples <g:each var="book" in="${books}"> <p>Title: ${book.title}</p> <p>Author: ${book.author}</p> </g:each> !  if, else, formatDate, sortableColumn, datePicker, …
  • 27. Contrôleurs !  grails create-controller org.bookstore.Book !  Génère un contrôlleur coquille !  Injection de dépendance !  def leNomDeMonService en attribut de classe !  Helpers !  render as JSON, render as XML
  • 28. Contrôleurs : exemple class AuthorController { def springSecurityService def list = { [ authorInstanceList: Author.list(), authorInstanceTotal: Author.count() ] } }
  • 29. Configuration : dépendances grails.project.dependency.resolution = { repositories { grailsPlugins() grailsHome() grailsCentral() mavenLocal() mavenCentral() mavenRepo "http://snapshots.repository.codehaus.org" } dependencies { runtime 'mysql:mysql-connector-java:5.1.13' } }
  • 30. Configuration : environnements environments { development { dataSource { dbCreate = "create-drop" url = "jdbc:hsqldb:mem:devDB" } } test { dataSource { … } } production { dataSource { … } } }
  • 31. Environnements !  grails run-app => dev !  grails test run-app => test !  grails test-app => test !  grails war => production
  • 32. Extensible !  Dépôt de plugins centralisé !  grails install-plugin … !  spring-security-core !  spring-security-ui !  quartz !  codenarc !  mongodb !  spock !  …
  • 33. Très extensible !  app-engine (GORM en mode JPA) !  groovy-plus-plus !  jquery !  searchable !  gwt !  feeds !  birt-report !  … !  ou : grails create-plugin monPlugin
  • 34. Extensible !  Plugin Grails == Application Grails
  • 37. Est-ce performant ? !  Overhead Groovy : x5-7 !  Utilisez Groovy++ (x3-5) !  Productivité contre vitesse d'exécution !  Pas de compile check ? Pas grave. !  Optimisations Java !  "src/java" ou librairies
  • 38. Et la courbe d'apprentissage ? !  Groovy s'apprend vite !  Bases ~ 2 jours, Courant ~ 1 mois !  Pièges, GORM Gotchas !  Dans l'ensemble, rien ne bloque longtemps !  Au delà de la carrosserie !  Sur le Tao de Grails, la stack tu maîtriseras
  • 39. La communauté est-elle active ? !  7 versions mineures en 1 an !  ~ 60 Users Group sur la planète !  ~ 800 repository GitHub autour de Grails !  ~ 2500 mails par mois sur les ML
  • 40. Y a-t-il du support ?
  • 41. Dans quels cas utiliser Grails ? !  Minimum Viable Product rapide !  Du prototype au produit en douceur !  Reprise d'une application existante !  IHM Web rapide, intégration existant en librairie !  Tout nouveau projet d'appli web !  En toute simplicité "
  • 44. Linkothèque !  Groovy home !  http://groovy.codehaus.org/ !  Grails home !  http://www.grails.org !  Grails plugins !  http://www.grails.org/plugins/ !  An army of solipsists (this week in Grails) !  http://burtbeckwith.com/blog/
  • 46. Merci à tous et bon appétit