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

Grails from scratch to prod - MixIT 2011

  • 1.
    Grails, from scratchto 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)
  • 3.
  • 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 applicationweb 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 overconfiguration !  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 !  GuillaumeLaforge (@glaforge) !  Leader Groovy chez SpringSource !  Graeme Rocher (@graemerocher) !  Leader Grails chez SpringSource
  • 9.
  • 10.
  • 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 !  IntellijIDEA !  Eclipse STS !  Netbeans
  • 14.
  • 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 deCRUD à 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
  • 18.
  • 19.
    Scaffolding !  grails generate-allorg.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 classBook { 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 classBook { static namedQueries = { withPotterInTitle { like 'title', '%Potter%' } } } Book.withPotterInTitle.list()
  • 24.
    Vues !  Groovy ServerPages !  HTML + Taglib groovy !  Assemblage par Sitemesh !  Commandé par tags GSP !  Taglib Grails (Prototype pour le JS) !  Formulaires, AJAX
  • 25.
    Vues : exemples <g:formRemotename="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:eachvar="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-controllerorg.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 classAuthorController { 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 deplugins 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
  • 35.
  • 36.
  • 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 courbed'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-elleactive ? !  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 dusupport ?
  • 41.
    Dans quels casutiliser 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é "
  • 42.
  • 43.
  • 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/
  • 45.
  • 46.
    Merci à tous et bon appétit