SlideShare uma empresa Scribd logo
1 de 50
Baixar para ler offline
Grails from scratch




       Gustavo Pinto
     gustavopinto.org
 twitter.com/gustavopinto
Agenda
Introdução
  Modelos ágeis
Groovy
  Hands on
Grails
  Da instalação à aplicação
Dicas
Introdução
    Modelos ágeis
      Processos,  técnicas, ferramentas, whatever
 
    O que é ser ágil?
 
    Porque precisamos ser ágeis? 
 
    Duas coisas que influenciam na agilidade
      A atitude dos membros da equipe
      As ferramentas
Introdução
Necessidades básicas
  D.R.Y principle
  convention-over-configuration
  Lightweight
Introdução
    D.R.Y principle ?
    convention-over-configuration ?
    lightweight ?
 
    O Que usar?
Introdução
D.R.Y principle ?
convention-over-configuration ?
lightweight ?


             GRAILS
Introdução
D.R.Y principle ?
convention-over-configuration ?
lightweight ?


             GRAILS
Groovy
Linguagem OO baseada no Java
Mas com boas idéias de outras linguagens
   Ruby, Python
Roda na JVM
Tipagem dinâmica
Onde tudo é objeto
Pode ser usada como script 
Sem algumas burocracias do Java 
Sintax Familiar 
Groovy




Radar de tecnologia - ThoughtWorks
Groovy




groovyconsole.appspot.com
Rails
Groovy + Rails = Grails
Instalação
Primeiros comandos
Padrão de projetos
  Domain Classes
  Controllers e Views
Validações
Relacionamentos
Grails ORM (GORM) 
Grails
    Instalação
                            
    Download do arquivo grails.a.b.c.zip
    Descopactar e declarar a variável GRAILS_HOME
 
    Digilte: grails
Grails
    Instalação
                                     
    Download do arquivo grails.a.b.c.zip
    Descopactar e declarar a variável GRAILS_HOME
 
    Digilte: grails
              gustavo@zeus:~$ grails
              Welcome to Grails 1.3.2 - http://grails.org/
              Licensed under Apache Standard License 2.0
              Grails home is set to: /opt/grails-1.3.2

              No script name specified. Use 'grails help' for more
              info or 'grails interactive' to enter interactive mode
Grails
Primeiros comandos

$ grails create-app racetrack

$ cd racetrack
$ grails run-app

$ grails war
$ grails clean
Grails
  Primeiros comandos
$ grails create-app racetrack
Welcome to Grails 1.2 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: /opt/grails
...
Created Grails Application at /web/racetrack
Grails
Primeiros comandos
$ grails [–Dserver.port=9090] run-app
...
Base Directory: /Users/sdavis/web/racetrack
Running script /opt/grails/scripts/RunApp.groovy
Environment set to development
[mkdir] Created dir:
/Users/sdavis/.grails/1.2/projects/racetrack/classes
[groovyc] Compiling 6 source files to
/Users/sdavis/.grails/1.2/projects/racetrack/classes
...
Running Grails application..
Server running. Browse to http://localhost:8080/racetrack
C

    M
                   Grails
V
            Padrão de projetos
C

    M
                   Grails
V
            Padrão de projetos



                         Lembre-se: 
                Convention over Configuration
Grails
Domain Classes
  Definem os elementos da aplicação
     Inscrição para a corrida
     nome, email, pago?
Grails
Domain Classes
   Definem os elementos da aplicação
      Inscrição para a corrida
      nome, email, pago?
 $ grails create-domain-class Inscricao
  
Grails
Domain Classes
   Definem os elementos da aplicação
      Inscrição para a corrida
      nome, email, pago?
 $ grails create-domain-class Inscricao
  
Grails
Domain Classes
     Definem os elementos da aplicação
        Inscrição para a corrida
        nome, email, pago?
 $ grails create-domain-class Inscricao
  
 class Inscricao {
       String nome
       Date dataAniversario     
       String email
       Boolean pago

       ....
 }
Grails
Domain Classes
   Definem os elementos da aplicação
      Inscrição para a corrida
      nome, email, pago?
 $ grails create-domain-class Inscricao
  
 class Inscricao {
       ....
       
       dateCreated
       lastUpdated
       ....
 }
Grails
Domain Classes
   Definem os elementos da aplicação
      Inscrição para a corrida
      nome, email, pago?
 $ grails create-domain-class Inscricao
  
 class Inscricao {
       ....
       
       dateCreated     variáveis especiais
       lastUpdated
       ....
 }
Grails
Domain Classes
   Definem os elementos da aplicação
      Inscrição para a corrida
      nome, email, pago?
                                          class Inscricao {
 $ grails create-domain-class Inscricao       .....
                                              def beforeInsert = {
 class Inscricao {                                // codigo
       ....                                 }
                                              def beforeUpdate = {
       dateCreated                            }
       lastUpdated                            def beforeDelete = {
       ....                                   }
 }                                            def onLoad = {
                                              }
                                          }
Grails
Domain Classes
    Definem os elementos da aplicação
       Inscrição para a corrida
       nome, email, pago?
                                        class Inscricao {
                                            .....
                                            def beforeInsert = {
                                                // codigo
Para saber mais:                          }
http://grails.org/GORM+-+Mapping+DSL.       def beforeUpdate = {
                                            }
                                            def beforeDelete = {
                                            }
                                            def onLoad = {
                                            }
                                        }
Grails
Domain Classes
 $ grails create-domain-class Corrida
  
 class Corrida {
      String nome
      Date dataIncio
      String cidade
      String estado
      BigDecimal distancia
      BigDecimal custo
  
      ....
 }
Grails
Domain Classes
 $ grails create-domain-class Corrida
  
 class Corrida {
      String nome
      Date dataIncio
      String cidade
      String estado
      BigDecimal distancia
      BigDecimal custo
  
      ....
 }
Grails
Controllers e Views
 $ grails create-controller Corrida
 $ grails generate-views
Grails
Controllers e Views
                                      class CorridaController {
 $ grails create-controller Corrida
                                          def scaffold = Corrida
 $ grails generate-views
                                      }
Grails
Controllers e Views

scaffold: gera uma aplicação inteira para uma
determinada classe de domínio, incluindo:
           As views necessárias
           Controle de ações de um CRUD
Grails
Controllers e Views

scaffold: gera uma aplicação inteira para uma
determinada classe de domínio, incluindo:
           As views necessárias
           Controle de ações de um CRUD



scaffold: não é o fim, é apenas o começo
Grails
Grails
     Validações
1.   Apenas inscrições de estados próximos
2.   O custo não pode ser maior que 100
3.   Toda corrida precisa de um nome
4.   Não existe distância negativa
Grails
     Validações
1.   Apenas inscrições de estados próximos
2.   O custo não pode ser maior que 100
3.   Toda corrida precisa de um nome
4.   Não existe distância negativa


            static constraints = {
                   nome(blank:false, maxSize:50)
                   estado(inList:["PA", "AM", "MA", "AC"])
                   cidade()           
                   distancia(min:0.0)
                   custo(min:0.0, max:100.0)
            }
Grails
Validações

   email     crediCard     password
   inList    matches       min, max

   range     minSize,      notEqual
             maxSize, size

   unique    url           validator
Grails
    Validações
        Personalizando Mensagens
 
    no arquivo: i18n/messages.properties
Grails
    Validações
        Personalizando Mensagens
 
    no arquivo: i18n/messages.properties
 
    corrida.nome.blank=Por favor, forneça um nome para corrida
    corrida.nome.maxSize.exceeded=O nome da corrida não pode ser maior
    que {3} letras
Grails
    Validações
        Personalizando Mensagens
 
    no arquivo: i18n/messages.properties
 
    corrida.nome.blank=Por favor, forneça um nome para corrida
    corrida.nome.maxSize.exceeded=O nome da corrida não pode ser maior
    que {3} letras


         classe . objeto . propriedade . [propriedade] = Mensagem
Grails
Relacionamentos
  Uma corrida tem muitas inscrições 
   1 x N

  class Corrida {
    .....
    static hasMany = [inscricao:Inscricao, ....]
  }
Grails
Relacionamentos
   Uma corrida tem muitas inscrições 
    1 x N

 class Corrida {
   .....
   static hasMany = [inscricao:Inscricao, ....]
 }

  
 class Inscricao {
    ....
   static belongsTo = [corrida:Corrida]
 }
Grails
Relacionamentos
   Uma corrida tem muitas inscrições 
    1 x N

 class Corrida {
   .....
   static hasMany = [inscricao:Inscricao, ....]   Força update
 }                                                e delete em
                                                  cascata
  
 class Inscricao {
    ....
   static belongsTo = [corrida:Corrida]
 }
Grails
Grails ORM
Nenhuma necessidade de configuração
DAOS?
Grails
    Grails ORM
    Nenhuma necessidade de configuração
    DAOS?
 
    Dynamic domain class methods
Grails
    Grails ORM
    Nenhuma necessidade de configuração
    DAOS?
 
    Dynamic domain class methods

                 save        findAll
                 delete       find
                  get         list
                 count        etc
Grails
    Grails ORM
    Nenhuma necessidade de configuração
    DAOS?
 
    DBVisualizer: Conectar na base do Grails
Dicas


   grails.org
grailsbrasil.com
Dúvidas
Grails from scratch




       Gustavo Pinto
     gustavopinto.org
 twitter.com/gustavopinto

Mais conteúdo relacionado

Semelhante a Grails from scratch - Build web apps fast with Groovy and Grails

Rafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia
 
Portfólio ADS- sem 4 - atividade em grupo
Portfólio ADS- sem 4 - atividade em grupoPortfólio ADS- sem 4 - atividade em grupo
Portfólio ADS- sem 4 - atividade em grupoAdilson Nascimento
 
Levando Serverless para o Edge - ARC301 - Sao Paulo Summit
Levando Serverless para o Edge -  ARC301 - Sao Paulo SummitLevando Serverless para o Edge -  ARC301 - Sao Paulo Summit
Levando Serverless para o Edge - ARC301 - Sao Paulo SummitAmazon Web Services
 
TDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
TDC2016 Boas Práticas SQL em Banco Relacional para DesenvolvedoresTDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
TDC2016 Boas Práticas SQL em Banco Relacional para DesenvolvedoresFernando Franquini
 
Construindo sua primeira ontologia
Construindo sua primeira ontologiaConstruindo sua primeira ontologia
Construindo sua primeira ontologiaRômulo Jales
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoFreedom DayMS
 
Java+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso TotalJava+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso TotalEduardo Bregaida
 
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...tdc-globalcode
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
GraphQL na Era das APIs
GraphQL na Era das APIsGraphQL na Era das APIs
GraphQL na Era das APIsDaniel Varanda
 
Exercicios professor marcos monteiro (1)
Exercicios professor marcos monteiro (1)Exercicios professor marcos monteiro (1)
Exercicios professor marcos monteiro (1)jose-junior89
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOWesley Lemos
 
Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Douglas Mendes
 
[Curso Java Basico - Orientacao a Objetos] Aula 32: Encapsulamento: métodos g...
[Curso Java Basico - Orientacao a Objetos] Aula 32: Encapsulamento: métodos g...[Curso Java Basico - Orientacao a Objetos] Aula 32: Encapsulamento: métodos g...
[Curso Java Basico - Orientacao a Objetos] Aula 32: Encapsulamento: métodos g...Loiane Groner
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Robustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefesRobustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefesDavid Robert Camargo de Campos
 

Semelhante a Grails from scratch - Build web apps fast with Groovy and Grails (20)

Rafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em ação
 
Portfólio ADS- sem 4 - atividade em grupo
Portfólio ADS- sem 4 - atividade em grupoPortfólio ADS- sem 4 - atividade em grupo
Portfólio ADS- sem 4 - atividade em grupo
 
Levando Serverless para o Edge - ARC301 - Sao Paulo Summit
Levando Serverless para o Edge -  ARC301 - Sao Paulo SummitLevando Serverless para o Edge -  ARC301 - Sao Paulo Summit
Levando Serverless para o Edge - ARC301 - Sao Paulo Summit
 
Cloud search avancado
Cloud search avancadoCloud search avancado
Cloud search avancado
 
TDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
TDC2016 Boas Práticas SQL em Banco Relacional para DesenvolvedoresTDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
TDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
 
Desenvolvimento iOS
Desenvolvimento iOSDesenvolvimento iOS
Desenvolvimento iOS
 
Construindo sua primeira ontologia
Construindo sua primeira ontologiaConstruindo sua primeira ontologia
Construindo sua primeira ontologia
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com Django
 
Java+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso TotalJava+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso Total
 
Minicurso groovy grails
Minicurso groovy grailsMinicurso groovy grails
Minicurso groovy grails
 
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
GraphQL na Era das APIs
GraphQL na Era das APIsGraphQL na Era das APIs
GraphQL na Era das APIs
 
Exercicios professor marcos monteiro (1)
Exercicios professor marcos monteiro (1)Exercicios professor marcos monteiro (1)
Exercicios professor marcos monteiro (1)
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
 
Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)
 
[Curso Java Basico - Orientacao a Objetos] Aula 32: Encapsulamento: métodos g...
[Curso Java Basico - Orientacao a Objetos] Aula 32: Encapsulamento: métodos g...[Curso Java Basico - Orientacao a Objetos] Aula 32: Encapsulamento: métodos g...
[Curso Java Basico - Orientacao a Objetos] Aula 32: Encapsulamento: métodos g...
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Robustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefesRobustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefes
 
PHP FrameWARks - FISL
PHP FrameWARks - FISLPHP FrameWARks - FISL
PHP FrameWARks - FISL
 

Mais de UFPA

Evidence Briefings: Towards a Medium to Transfer Knowledge from Systematic Re...
Evidence Briefings: Towards a Medium to Transfer Knowledge from Systematic Re...Evidence Briefings: Towards a Medium to Transfer Knowledge from Systematic Re...
Evidence Briefings: Towards a Medium to Transfer Knowledge from Systematic Re...UFPA
 
More Common Than You Think: An In-Depth Study of Casual Contributors
More Common Than You Think: An In-Depth Study of Casual ContributorsMore Common Than You Think: An In-Depth Study of Casual Contributors
More Common Than You Think: An In-Depth Study of Casual ContributorsUFPA
 
What Programmers Say About Refactoring Tools? An Empirical Investigation of ...
What Programmers Say About Refactoring Tools? An Empirical Investigation of ...What Programmers Say About Refactoring Tools? An Empirical Investigation of ...
What Programmers Say About Refactoring Tools? An Empirical Investigation of ...UFPA
 
Possibilidades com python
Possibilidades com pythonPossibilidades com python
Possibilidades com pythonUFPA
 
Python simplecv
Python simplecvPython simplecv
Python simplecvUFPA
 
Porque aprender haskell me fez um programador python melhor?
Porque aprender haskell me fez um programador python melhor?Porque aprender haskell me fez um programador python melhor?
Porque aprender haskell me fez um programador python melhor?UFPA
 
Are Java Programmers Transitioning to Multicore?
Are Java Programmers Transitioning to Multicore? Are Java Programmers Transitioning to Multicore?
Are Java Programmers Transitioning to Multicore? UFPA
 
A computacao e_voce_caminhos_para_seguir
A computacao e_voce_caminhos_para_seguirA computacao e_voce_caminhos_para_seguir
A computacao e_voce_caminhos_para_seguirUFPA
 

Mais de UFPA (8)

Evidence Briefings: Towards a Medium to Transfer Knowledge from Systematic Re...
Evidence Briefings: Towards a Medium to Transfer Knowledge from Systematic Re...Evidence Briefings: Towards a Medium to Transfer Knowledge from Systematic Re...
Evidence Briefings: Towards a Medium to Transfer Knowledge from Systematic Re...
 
More Common Than You Think: An In-Depth Study of Casual Contributors
More Common Than You Think: An In-Depth Study of Casual ContributorsMore Common Than You Think: An In-Depth Study of Casual Contributors
More Common Than You Think: An In-Depth Study of Casual Contributors
 
What Programmers Say About Refactoring Tools? An Empirical Investigation of ...
What Programmers Say About Refactoring Tools? An Empirical Investigation of ...What Programmers Say About Refactoring Tools? An Empirical Investigation of ...
What Programmers Say About Refactoring Tools? An Empirical Investigation of ...
 
Possibilidades com python
Possibilidades com pythonPossibilidades com python
Possibilidades com python
 
Python simplecv
Python simplecvPython simplecv
Python simplecv
 
Porque aprender haskell me fez um programador python melhor?
Porque aprender haskell me fez um programador python melhor?Porque aprender haskell me fez um programador python melhor?
Porque aprender haskell me fez um programador python melhor?
 
Are Java Programmers Transitioning to Multicore?
Are Java Programmers Transitioning to Multicore? Are Java Programmers Transitioning to Multicore?
Are Java Programmers Transitioning to Multicore?
 
A computacao e_voce_caminhos_para_seguir
A computacao e_voce_caminhos_para_seguirA computacao e_voce_caminhos_para_seguir
A computacao e_voce_caminhos_para_seguir
 

Grails from scratch - Build web apps fast with Groovy and Grails

  • 1. Grails from scratch Gustavo Pinto gustavopinto.org twitter.com/gustavopinto
  • 2. Agenda Introdução Modelos ágeis Groovy Hands on Grails Da instalação à aplicação Dicas
  • 3. Introdução Modelos ágeis Processos,  técnicas, ferramentas, whatever   O que é ser ágil?   Porque precisamos ser ágeis?    Duas coisas que influenciam na agilidade A atitude dos membros da equipe As ferramentas
  • 4. Introdução Necessidades básicas D.R.Y principle convention-over-configuration Lightweight
  • 5. Introdução D.R.Y principle ? convention-over-configuration ? lightweight ?   O Que usar?
  • 8. Groovy Linguagem OO baseada no Java Mas com boas idéias de outras linguagens Ruby, Python Roda na JVM Tipagem dinâmica Onde tudo é objeto Pode ser usada como script  Sem algumas burocracias do Java  Sintax Familiar 
  • 9. Groovy Radar de tecnologia - ThoughtWorks
  • 11. Rails
  • 12. Groovy + Rails = Grails Instalação Primeiros comandos Padrão de projetos Domain Classes Controllers e Views Validações Relacionamentos Grails ORM (GORM) 
  • 13. Grails Instalação   Download do arquivo grails.a.b.c.zip Descopactar e declarar a variável GRAILS_HOME   Digilte: grails
  • 14. Grails Instalação   Download do arquivo grails.a.b.c.zip Descopactar e declarar a variável GRAILS_HOME   Digilte: grails gustavo@zeus:~$ grails Welcome to Grails 1.3.2 - http://grails.org/ Licensed under Apache Standard License 2.0 Grails home is set to: /opt/grails-1.3.2 No script name specified. Use 'grails help' for more info or 'grails interactive' to enter interactive mode
  • 15. Grails Primeiros comandos $ grails create-app racetrack $ cd racetrack $ grails run-app $ grails war $ grails clean
  • 16. Grails Primeiros comandos $ grails create-app racetrack Welcome to Grails 1.2 - http://grails.org/ Licensed under Apache Standard License 2.0 Grails home is set to: /opt/grails ... Created Grails Application at /web/racetrack
  • 17. Grails Primeiros comandos $ grails [–Dserver.port=9090] run-app ... Base Directory: /Users/sdavis/web/racetrack Running script /opt/grails/scripts/RunApp.groovy Environment set to development [mkdir] Created dir: /Users/sdavis/.grails/1.2/projects/racetrack/classes [groovyc] Compiling 6 source files to /Users/sdavis/.grails/1.2/projects/racetrack/classes ... Running Grails application.. Server running. Browse to http://localhost:8080/racetrack
  • 18. C M            Grails V Padrão de projetos
  • 19. C M            Grails V Padrão de projetos Lembre-se:  Convention over Configuration
  • 20. Grails Domain Classes Definem os elementos da aplicação Inscrição para a corrida nome, email, pago?
  • 21. Grails Domain Classes Definem os elementos da aplicação Inscrição para a corrida nome, email, pago? $ grails create-domain-class Inscricao  
  • 22. Grails Domain Classes Definem os elementos da aplicação Inscrição para a corrida nome, email, pago? $ grails create-domain-class Inscricao  
  • 23. Grails Domain Classes Definem os elementos da aplicação Inscrição para a corrida nome, email, pago? $ grails create-domain-class Inscricao   class Inscricao {       String nome       Date dataAniversario            String email       Boolean pago       .... }
  • 24. Grails Domain Classes Definem os elementos da aplicação Inscrição para a corrida nome, email, pago? $ grails create-domain-class Inscricao   class Inscricao {       ....              dateCreated       lastUpdated       .... }
  • 25. Grails Domain Classes Definem os elementos da aplicação Inscrição para a corrida nome, email, pago? $ grails create-domain-class Inscricao   class Inscricao {       ....              dateCreated variáveis especiais       lastUpdated       .... }
  • 26. Grails Domain Classes Definem os elementos da aplicação Inscrição para a corrida nome, email, pago? class Inscricao { $ grails create-domain-class Inscricao     .....       def beforeInsert = { class Inscricao {         // codigo       ....   }            def beforeUpdate = {       dateCreated     }       lastUpdated     def beforeDelete = {       ....     } }     def onLoad = {     } }
  • 27. Grails Domain Classes Definem os elementos da aplicação Inscrição para a corrida nome, email, pago? class Inscricao {     .....     def beforeInsert = {         // codigo Para saber mais:    } http://grails.org/GORM+-+Mapping+DSL.     def beforeUpdate = {     }     def beforeDelete = {     }     def onLoad = {     } }
  • 28. Grails Domain Classes $ grails create-domain-class Corrida   class Corrida {      String nome      Date dataIncio      String cidade      String estado      BigDecimal distancia      BigDecimal custo        .... }
  • 29. Grails Domain Classes $ grails create-domain-class Corrida   class Corrida {      String nome      Date dataIncio      String cidade      String estado      BigDecimal distancia      BigDecimal custo        .... }
  • 30. Grails Controllers e Views $ grails create-controller Corrida $ grails generate-views
  • 31. Grails Controllers e Views class CorridaController { $ grails create-controller Corrida     def scaffold = Corrida $ grails generate-views }
  • 32. Grails Controllers e Views scaffold: gera uma aplicação inteira para uma determinada classe de domínio, incluindo: As views necessárias Controle de ações de um CRUD
  • 33. Grails Controllers e Views scaffold: gera uma aplicação inteira para uma determinada classe de domínio, incluindo: As views necessárias Controle de ações de um CRUD scaffold: não é o fim, é apenas o começo
  • 35. Grails Validações 1. Apenas inscrições de estados próximos 2. O custo não pode ser maior que 100 3. Toda corrida precisa de um nome 4. Não existe distância negativa
  • 36. Grails Validações 1. Apenas inscrições de estados próximos 2. O custo não pode ser maior que 100 3. Toda corrida precisa de um nome 4. Não existe distância negativa     static constraints = {            nome(blank:false, maxSize:50)            estado(inList:["PA", "AM", "MA", "AC"])            cidade()                       distancia(min:0.0)            custo(min:0.0, max:100.0)     }
  • 37. Grails Validações email crediCard password inList matches min, max range minSize, notEqual maxSize, size unique url validator
  • 38. Grails Validações Personalizando Mensagens   no arquivo: i18n/messages.properties
  • 39. Grails Validações Personalizando Mensagens   no arquivo: i18n/messages.properties   corrida.nome.blank=Por favor, forneça um nome para corrida corrida.nome.maxSize.exceeded=O nome da corrida não pode ser maior que {3} letras
  • 40. Grails Validações Personalizando Mensagens   no arquivo: i18n/messages.properties   corrida.nome.blank=Por favor, forneça um nome para corrida corrida.nome.maxSize.exceeded=O nome da corrida não pode ser maior que {3} letras classe . objeto . propriedade . [propriedade] = Mensagem
  • 41. Grails Relacionamentos Uma corrida tem muitas inscrições   1 x N class Corrida {   .....   static hasMany = [inscricao:Inscricao, ....] }
  • 42. Grails Relacionamentos Uma corrida tem muitas inscrições   1 x N class Corrida {   .....   static hasMany = [inscricao:Inscricao, ....] }   class Inscricao {    ....   static belongsTo = [corrida:Corrida] }
  • 43. Grails Relacionamentos Uma corrida tem muitas inscrições   1 x N class Corrida {   .....   static hasMany = [inscricao:Inscricao, ....] Força update } e delete em cascata   class Inscricao {    ....   static belongsTo = [corrida:Corrida] }
  • 44. Grails Grails ORM Nenhuma necessidade de configuração DAOS?
  • 45. Grails Grails ORM Nenhuma necessidade de configuração DAOS?   Dynamic domain class methods
  • 46. Grails Grails ORM Nenhuma necessidade de configuração DAOS?   Dynamic domain class methods save findAll delete find get list count etc
  • 47. Grails Grails ORM Nenhuma necessidade de configuração DAOS?   DBVisualizer: Conectar na base do Grails
  • 48. Dicas grails.org grailsbrasil.com
  • 50. Grails from scratch Gustavo Pinto gustavopinto.org twitter.com/gustavopinto