Grails
Java produtivo e divertido




            1                @lucastex
Lucas Teixeira

   lucastex.com.br
     lucastex.com
       @lucastex




          2          @lucastex
gr8forums.org




      3         @lucastex
github.com/lucastex


         gsolr

     grails-stella

   grails-correios-br

   grails-featurable

  grails-file-uploader

     grails-tinyurl


          4              @lucastex
- Groovy

- Grails

- Comunidade

- Demo




               5   @lucastex
Groovy



  6      @lucastex
O que te motiva?



       7           @lucastex
Pensar a maior
parte do tempo


      8          @lucastex
9   @lucastex
Pensar



  10     @lucastex
import java.util.List;
import java.util.ArrayList;                                Seletor.java
class Seletor {

	   private List selecionaMenoresQue(List palavras, int tamanho) {
	   	    List resultado = new ArrayList();
	   	    for (int i = 0; i < palavras.size(); i++) {
	   	    	    String pal = (String) palavras.get(i);
	   	    	    if (pal.length() <= tamanho) {
	   	    	    	    resultado.add(pal);
	   	    	    }
	   	    }
	   	    return resultado;
	   }
	
	   public static void main(String[] args) {
	   	    List linguagens = new ArrayList();
	   	    linguagens.add("Java");
	   	    linguagens.add("Scala");
	   	    linguagens.add("Groovy");
	   	    linguagens.add("Ruby");
	   	
	   	    Seletor seletor = new Seletor();
	   	    List selecionadas = seletor.selecionaMenoresQue(linguagens, 5);
	   	    System.out.println("Total "+selecionadas.size())
	   	
	   	    for (int i = 0; i < selecionadas.size(); i++) {
	   	    	    String sel = (String) selecionadas.get(i);
	   	    	    System.out.println(sel);
	   	    }
	   }

                                        11                                 @lucastex
import java.util.List;
import java.util.ArrayList;

class Seletor {

	   private List selecionaMenoresQue(List palavras, int tamanho) {
	   	    List resultado = new ArrayList();
	   	    for (int i = 0; i < palavras.size(); i++) {
	   	    	    String pal = (String) palavras.get(i);
	   	    	    if (pal.length() <= tamanho) {
	   	    	    	    resultado.add(pal);
	   	    	    }
	   	    }
	   	    return resultado;
	   }
	
	   public static void main(String[] args) {
	   	    List linguagens = new ArrayList();
	   	    linguagens.add("Java");
	   	    linguagens.add("Scala");
	   	    linguagens.add("Groovy");
	   	    linguagens.add("Ruby");
	   	
	   	    Seletor seletor = new Seletor();
	   	    List selecionadas = seletor.selecionaMenoresQue(linguagens, 5);
	   	    System.out.println("Total "+selecionadas.size())
	   	
	   	    for (int i = 0; i < selecionadas.size(); i++) {
	   	    	    String sel = (String) selecionadas.get(i);
	   	    	    System.out.println(sel);
	   	    }
	   }

                                        12                                 @lucastex
regra dos 80 - 20



        13          @lucastex
import java.util.List;
import java.util.ArrayList;

class Seletor {

	   private List selecionaMenoresQue(List palavras, int tamanho) {
	   	    List resultado = new ArrayList();
	   	    for (int i = 0; i < palavras.size(); i++) {
	   	    	    String pal = (String) palavras.get(i);
	   	    	    if (pal.length() <= tamanho) {
	   	    	    	    resultado.add(pal);
	   	    	    }
	   	    }
	   	    return resultado;
	   }
	
	   public static void main(String[] args) {
	   	    List linguagens = new ArrayList();
	   	    linguagens.add("Java");
	   	    linguagens.add("Scala");
	   	    linguagens.add("Groovy");
	   	    linguagens.add("Ruby");
	   	
	   	    Seletor seletor = new Seletor();
	   	    List selecionadas = seletor.selecionaMenoresQue(linguagens, 5);
	   	    System.out.println("Total "+selecionadas.size())
	   	
	   	    for (int i = 0; i < selecionadas.size(); i++) {
	   	    	    String sel = (String) selecionadas.get(i);
	   	    	    System.out.println(sel);
	   	    }
	   }

                                        14                                 @lucastex
class Seletor {

	   private List selecionaMenoresQue(List palavras, int tamanho) {
	   	    List resultado = new ArrayList()
	   	    palavras.each { String pal ->
	   	    	    if (pal.length() <= tamanho) {
	   	    	    	    resultado.add(pal)
	   	    	    }
	   	    }
	   	    return resultado
	   }
	
	   public static void main(String[] args) {
	   	    List linguagens = new ArrayList()
	   	    linguagens.add("Java")
	   	    linguagens.add("Scala")
	   	    linguagens.add("Groovy")
	   	    linguagens.add("Ruby")
	   	
	   	    Seletor seletor = new Seletor()
	   	    List selecionadas = seletor.selecionaMenoresQue(linguagens, 5)
	   	    System.out.println("Total "+selecionadas.size())
	   	
	   	    selecionadas.each { String sel ->
	   	    	    System.out.println(sel)
	   	    }
	   }
}



                                        15                                @lucastex
class Seletor {

	   private List selecionaMenoresQue(List palavras, int tamanho) {
	   	    List resultado = new ArrayList()
	   	    palavras.each { String pal ->
	   	    	    if (pal.length() <= tamanho) {
	   	    	    	    resultado.add(pal)
	   	    	    }
	   	    }
	   	    return resultado
	   }
	
	   public static void main(String[] args) {
	   	    List linguagens = new ArrayList()
	   	    linguagens.add("Java")
	   	    linguagens.add("Scala")
	   	    linguagens.add("Groovy")
	   	    linguagens.add("Ruby")
	   	
	   	    Seletor seletor = new Seletor()
	   	    List selecionadas = seletor.selecionaMenoresQue(linguagens, 5)
	   	    System.out.println("Total "+selecionadas.size())
	   	
	   	    selecionadas.each { String sel ->
	   	    	    System.out.println(sel)
	   	    }
	   }
}



                                        16                                @lucastex
def selecionaMenoresQue(palavras, tamanho) {
	    def resultado = new ArrayList()
	    palavras.each { pal ->
	    	    if (pal.size() <= tamanho) {
	    	    	    resultado.add(pal)
	    	    }
	    }
	    return resultado
}

def linguagens = new ArrayList()
linguagens.add("Java")
linguagens.add("Scala")
linguagens.add("Groovy")
linguagens.add("Ruby")
	
def selecionadas = selecionaMenoresQue(linguagens, 5)
System.out.println("Total "+selecionadas.size())
selecionadas.each { sel ->
	    System.out.println(sel)
}




                                         17             @lucastex
def selecionaMenoresQue(palavras, tamanho) {
	    def resultado = new ArrayList()
	    palavras.each { pal ->
	    	    if (pal.size() <= tamanho) {
	    	    	    resultado.add(pal)
	    	    }
	    }
	    return resultado
}

def linguagens = new ArrayList()
linguagens.add("Java")
linguagens.add("Scala")
linguagens.add("Groovy")
linguagens.add("Ruby")
	
def selecionadas = selecionaMenoresQue(linguagens, 5)
System.out.println("Total "+selecionadas.size())
selecionadas.each { sel ->
	    System.out.println(sel)
}




                                         18             @lucastex
def selecionaMenoresQue(palavras, tamanho) {
	    def resultado = []
	    palavras.each { pal ->
	    	    if (pal.size() <= tamanho) {
	    	    	    resultado.add(pal)
	    	    }
	    }
	    resultado
}

def linguagens = ["Java","Scala","Groovy","Ruby"]
def selecionadas = selecionaMenoresQue(linguagens, 5)
println("Total ${selecionadas.size()}")
selecionadas.each { sel ->
	    println(sel)
}




                                         19             @lucastex
def selecionaMenoresQue(palavras, tamanho) {
	    def resultado = []
	    palavras.each { pal ->
	    	    if (pal.size() <= tamanho) {
	    	    	    resultado.add(pal)
	    	    }
	    }
	    resultado
}

def linguagens = ["Java","Scala","Groovy","Ruby"]
def selecionadas = selecionaMenoresQue(linguagens, 5)
println("Total ${selecionadas.size()}")
selecionadas.each { sel ->
	    println(sel)
}




                                         20             @lucastex
def selecionaMenoresQue(palavras, tamanho) {
	    palavras.findAll { it.size() <= tamanho }
}

def linguagens = ["Java","Scala","Groovy","Ruby"]
def selecionadas = selecionaMenoresQue(linguagens, 5)
println "Total ${selecionadas.size()}"
selecionadas.each { sel ->
	    println sel
}




                                         21             @lucastex
def selecionaMenoresQue(palavras, tamanho) {
	    palavras.findAll { it.size() <= tamanho }
}

def linguagens = ["Java","Scala","Groovy","Ruby"]
def selecionadas = selecionaMenoresQue(linguagens, 5)
println "Total ${selecionadas.size()}"
selecionadas.each { sel ->
	    println sel
}




                                         22             @lucastex
def linguagens = ["Java","Scala","Groovy","Ruby"]
def selecionadas = linguagens.findAll { it.size() <= 5 }
println "Total ${selecionadas.size()}"
selecionadas.each { sel ->
	    println sel
}




                                         23                @lucastex
Seletor.groovy




def linguagens = ["Java","Scala","Groovy","Ruby"]
def selecionadas = linguagens.findAll { it.size() <= 5 }
println "Total ${selecionadas.size()}"
selecionadas.each { sel ->
	    println sel
}




                                         24                                 @lucastex
Seletor.groovy




def linguagens = ["Java","Scala","Groovy","Ruby"]
def selecionadas = linguagens.findAll { it.size() <= 5 }
println "Total ${selecionadas.size()}"
selecionadas.each { sel ->
	    println sel
}




                                         25                                 @lucastex
import java.util.List;
import java.util.ArrayList;                                Seletor.java
class Seletor {

	   private List selecionaMenoresQue(List palavras, int tamanho) {
	   	    List resultado = new ArrayList();
	   	    for (int i = 0; i < palavras.size(); i++) {
	   	    	    String pal = (String) palavras.get(i);
	   	    	    if (pal.length() <= tamanho) {
	   	    	    	    resultado.add(pal);
	   	    	    }
	   	    }
	   	    return resultado;
	   }
	
	   public static void main(String[] args) {
	   	    List linguagens = new ArrayList();
	   	    linguagens.add("Java");
	   	    linguagens.add("Scala");
	   	    linguagens.add("Groovy");
	   	    linguagens.add("Ruby");
	   	
	   	    Seletor seletor = new Seletor();
	   	    List selecionadas = seletor.selecionaMenoresQue(linguagens, 5);
	   	    System.out.println("Total "+selecionadas.size())
	   	
	   	    for (int i = 0; i < selecionadas.size(); i++) {
	   	    	    String sel = (String) selecionadas.get(i);
	   	    	    System.out.println(sel);
	   	    }
	   }

                                        26                                 @lucastex
Groovy é Java!



      27         @lucastex
import java.util.List;
import java.util.ArrayList;                                Seletor.java
class Seletor {

	   private List selecionaMenoresQue(List palavras, int tamanho) {
	   	    List resultado = new ArrayList();
	   	    for (int i = 0; i < palavras.size(); i++) {
	   	    	    String pal = (String) palavras.get(i);
	   	    	    if (pal.length() <= tamanho) {
	   	    	    	    resultado.add(pal);
	   	    	    }
	   	    }
	   	    return resultado;
	   }
	
	   public static void main(String[] args) {
	   	    List linguagens = new ArrayList();
	   	    linguagens.add("Java");
	   	    linguagens.add("Scala");
	   	    linguagens.add("Groovy");
	   	    linguagens.add("Ruby");
	   	
	   	    Seletor seletor = new Seletor();
	   	    List selecionadas = seletor.selecionaMenoresQue(linguagens, 5);
	   	    System.out.println("Total "+selecionadas.size())
	   	
	   	    for (int i = 0; i < selecionadas.size(); i++) {
	   	    	    String sel = (String) selecionadas.get(i);
	   	    	    System.out.println(sel);
	   	    }
	   }

                                        28                                 @lucastex
import java.util.List;
import java.util.ArrayList;                                Seletor.groovy
class Seletor {

	   private List selecionaMenoresQue(List palavras, int tamanho) {
	   	    List resultado = new ArrayList();
	   	    for (int i = 0; i < palavras.size(); i++) {
	   	    	    String pal = (String) palavras.get(i);
	   	    	    if (pal.length() <= tamanho) {
	   	    	    	    resultado.add(pal);
	   	    	    }
	   	    }
	   	    return resultado;
	   }
	
	   public static void main(String[] args) {
	   	    List linguagens = new ArrayList();
	   	    linguagens.add("Java");
	   	    linguagens.add("Scala");
	   	    linguagens.add("Groovy");
	   	    linguagens.add("Ruby");
	   	
	   	    Seletor seletor = new Seletor();
	   	    List selecionadas = seletor.selecionaMenoresQue(linguagens, 5);
	   	    System.out.println("Total "+selecionadas.size())
	   	
	   	    for (int i = 0; i < selecionadas.size(); i++) {
	   	    	    String sel = (String) selecionadas.get(i);
	   	    	    System.out.println(sel);
	   	    }
	   }

                                        29                                  @lucastex
Groovy é melhor
   que Java!


       30         @lucastex
import java.util.List;
import java.util.ArrayList;                                Seletor.java
class Seletor {

	   private List selecionaMenoresQue(List palavras, int tamanho) {
	   	    List resultado = new ArrayList();
	   	    for (int i = 0; i < palavras.size(); i++) {
	   	    	    String pal = (String) palavras.get(i);
	   	    	    if (pal.length() <= tamanho) {
	   	    	    	    resultado.add(pal);
	   	    	    }
	   	    }
	   	    return resultado;
	   }
	
	   public static void main(String[] args) {
	   	    List linguagens = new ArrayList();
	   	    linguagens.add("Java");
	   	    linguagens.add("Scala");
	   	    linguagens.add("Groovy");
	   	    linguagens.add("Ruby");
	   	
	   	    Seletor seletor = new Seletor();
	   	    List selecionadas = seletor.selecionaMenoresQue(linguagens, 5);
	   	    System.out.println("Total "+selecionadas.size())
	   	
	   	    for (int i = 0; i < selecionadas.size(); i++) {
	   	    	    String sel = (String) selecionadas.get(i);
	   	    	    System.out.println(sel);
	   	    }
	   }

                                        31                                 @lucastex
Seletor.groovy




def linguagens = ["Java","Scala","Groovy","Ruby"]
def selecionadas = linguagens.findAll { it.size() <= 5 }
println "Total ${selecionadas.size()}"
selecionadas.each { sel ->
	    println sel
}




                                         32                                 @lucastex
“When you program in groovy, in
many ways you're writing a special
          kind of java”


                        (Dierk König)




                33                      @lucastex
Grails



  34     @lucastex
cenário comum



      35        @lucastex
- Spring




           36   @lucastex
- Spring

- Hibernate




              37   @lucastex
- Spring

- Hibernate

- JSF




              38   @lucastex
- Spring

- Hibernate

- JSF

- DWR




              39   @lucastex
- Spring

- Hibernate

- JSF

- DWR

- Velocity



              40   @lucastex
- Spring

- Hibernate

- JSF

- DWR

- Velocity

- Tuckey

              41   @lucastex
42   @lucastex
Que você é incompetente
Que você é mentiroso
Que colocar todos os frameworks juntos toma tempo e pode gerar problemas



                                 43                                        @lucastex
- Desenvolvimento rápido

   - Full stack

   - Fácil bootstrap

   - Convenções - CoC

   - Scaffolding

   - Plugins

                   44      @lucastex
- Desenvolvimento rápido

   - Full stack

   - Fácil bootstrap

   - Convenções - CoC

   - Scaffolding

   - Plugins

                   45      @lucastex
Full Stack
- mapeamento or - gorm

- log
- url rewrites

- view e decoration
- controladores

- controle transacional
- configuração por ambiente
                  46          @lucastex
Mapeamento OR - gorm




         47            @lucastex
Mapeamento OR - gorm




Pessoa.findAllByNomeLikeAndIdadeGreaterThan(“%lucas%”, 25)




                            48                               @lucastex
Mapeamento OR - gorm




Pessoa.findAllByNomeLikeAndIdadeGreaterThan(“%lucas%”, 25)

                     Pessoa.get(1234)




                            49                               @lucastex
Mapeamento OR - gorm



Pessoa.findAllByNomeLikeAndIdadeGreaterThan(“%lucas%”, 25)

                     Pessoa.get(1234)

                     Date dateCreated
                     Date lastUpdated




                            50                               @lucastex
Mapeamento OR - gorm


     Pessoa.findAllByNomeLikeAndIdadeGreaterThan(“%lucas%”, 25)

                              Pessoa.get(1234)

                              Date dateCreated
                              Date lastUpdated

Pessoa.findXXX(xxx, [max:10, offset:10, sort: “nome”, order: “asc”, cache: true])




                                       51                                  @lucastex
Mapeamento OR - gorm


     Pessoa.findAllByNomeLikeAndIdadeGreaterThan(“%lucas%”, 25)

                              Pessoa.get(1234)

                              Date dateCreated
                              Date lastUpdated

Pessoa.findXXX(xxx, [max:10, offset:10, sort: “nome”, order: “asc”, cache: true])

          Pessoa.findAll(“from Pessoa p where p.idade = 25”)




                                       52                                  @lucastex
Mapeamento OR - gorm

     Pessoa.findAllByNomeLikeAndIdadeGreaterThan(“%lucas%”, 25)

                              Pessoa.get(1234)

                              Date dateCreated
                              Date lastUpdated

Pessoa.findXXX(xxx, [max:10, offset:10, sort: “nome”, order: “asc”, cache: true])

          Pessoa.findAll(“from Pessoa p where p.idade = 25”)

                             def onLoad() { ... }
                          def beforeInsert() { ... }
                          def beforeUpdate() { ... }
                          def beforeDelete() { ... }


                                       53                                  @lucastex
- Desenvolvimento rápido

   - Full stack

   - Fácil bootstrap

   - Convenções - CoC

   - Scaffolding

   - Plugins

                   54      @lucastex
Fácil bootstrap


‣ grails create-app umesp

‣ grails run-app




                   55       @lucastex
56   @lucastex
gerenciamento de dependências

       banco de dados

     mapeamento de urls

        controladores

      dominios (tabelas)

bundles de internacionalização

     servicos reutilizáveis

            taglibs

       classes utilitarias

        telas e páginas

      jars de bibliotecas

   scripts de automatização

  outros fontes dependentes

             testes

    pasta de arquivos web

                                 @lucastex
- Desenvolvimento rápido

   - Full stack

   - Fácil bootstrap

   - Convenções - CoC

   - Scaffolding

   - Plugins

                   58      @lucastex
CoC - Classes de domínio


    class Pessoa   {
          String   nome
          String   telefone
          String   email
          String   cpf

         static constraints = {
               nome(nullable:false)
               telefone(nullable:true, maxSize: 8)
               email(email:true)
               cpf(cpf:true)
         }
    }




                              59                     @lucastex
CoC - Classes de domínio
    class Pessoa   {
          String   nome
          String   telefone
          String   email
          String   cpf

         static constraints = {
               nome(nullable:false)
               telefone(nullable:true, maxSize: 8)
               email(email:true)
               cpf(cpf:true)
         }

         static mapping = {
               table ‘TBL_PESS’
               nome column:‘STR_NM’
               telefone column: ‘STR_TLFN’
               email column: ‘STR_ML’
               CPF column: ‘STR_CPF’
         }
    }




                              60                     @lucastex
CoC - Controllers
 class PessoaController {

     def criar = {

         def pessoa = new Pessoa(params)
         pessoa.save()
     }

 }




                             61            @lucastex
CoC - Controllers
 class PessoaController {

     def criar = {

         def pessoa = new Pessoa(params)
         pessoa.save()
     }

 }

                            http://localhost:8080/app/pessoa/criar




                             62                                 @lucastex
CoC - Controllers
   class PessoaController {

        def criar = {

            def pessoa = new Pessoa(params)
            pessoa.save()
        }

   }

                               http://localhost:8080/app/pessoa/criar




grails-app/
     views/
          pessoa/
               criar.gsp


                                63                                 @lucastex
- Desenvolvimento rápido

   - Full stack

   - Fácil bootstrap

   - Convenções - CoC

   - Scaffolding

   - Plugins

                   64      @lucastex
Scaffolding

- Prototipação das Domain Classes
- Estático / Dinâmico (templates)

- Integridade relacional e dos tipos
- Validação



                 65                    @lucastex
Scaffolding




     66       @lucastex
Scaffolding




     67       @lucastex
Scaffolding




     68       @lucastex
Scaffolding estático




‣ grails generate-all Pessoa




                 69            @lucastex
Scaffolding estático




‣ grails generate-all Pessoa




                 70            @lucastex
Scaffolding dinâmico


  class PessoaController {

      def scaffold = true

  }




               71            @lucastex
Validação




    72      @lucastex
- Desenvolvimento rápido

   - Full stack

   - Fácil bootstrap

   - Convenções - CoC

   - Scaffolding

   - Plugins

                   73      @lucastex
Plugins

- fácil extensão
- modularização de aplicações

- adição de métodos / comportamento
- gerenciamento automático



                   74                 @lucastex
Plugins
- 500+ plugins atualmente

- segurança

- manipulação de imagens

- cms / blog

- quartz (agendamento)

- ui

- lucene
                   75       @lucastex
Plugins
- mail

- gwt

- feed / rss

- geração de diagramas de classe

- gráficos

- jquery

- auditoria
                   76              @lucastex
Plugins
- performance

- behaviour

   - taggable

   - featurable

   - rateable

   - attachmentable

   - commentable
                   77   @lucastex
segredo?



   78      @lucastex
Rock solid foundations




- Spring




           79            @lucastex
Rock solid foundations



- Spring

- Hibernate




              80         @lucastex
Rock solid foundations



- Spring

- Hibernate
- Sitemesh




              81         @lucastex
Rock solid foundations


- Spring
- Hibernate

- Sitemesh
- Log4J



              82         @lucastex
Rock solid foundations

- Spring

- Hibernate
- Sitemesh

- Log4J
- Plugins


              83         @lucastex
Rock solid foundations

- Spring

- Hibernate
- Sitemesh

- Log4J
- Plugins

- JAVA / JVM

               84        @lucastex
Comunidade



    85       @lucastex
Fontes de informação
-   grails.org

-   gr8forums.org (en)

-   grailsbrasil.com (pt)

-   springsource.com

-   groovy.codehaus.org

-   twitter (#groovy e #grails)

-   Listas de e-mail

     -   groovy-user

     -   grails-user

                            86    @lucastex
GroovyMag.com




      87        @lucastex
brasilitfree



 brasilit10


     88        @lucastex
Dúvidas?



   89      @lucastex
Demo!



  90    @lucastex
Grails
Java produtivo e divertido




      Lucas Teixeira
        lucastex.com.br
          lucastex.com
            @lucastex




                             @lucastex

Grails: Java produtivo e divertido

  • 1.
    Grails Java produtivo edivertido 1 @lucastex
  • 2.
    Lucas Teixeira lucastex.com.br lucastex.com @lucastex 2 @lucastex
  • 3.
    gr8forums.org 3 @lucastex
  • 4.
    github.com/lucastex gsolr grails-stella grails-correios-br grails-featurable grails-file-uploader grails-tinyurl 4 @lucastex
  • 5.
    - Groovy - Grails -Comunidade - Demo 5 @lucastex
  • 6.
    Groovy 6 @lucastex
  • 7.
    O que temotiva? 7 @lucastex
  • 8.
    Pensar a maior partedo tempo 8 @lucastex
  • 9.
    9 @lucastex
  • 10.
    Pensar 10 @lucastex
  • 11.
    import java.util.List; import java.util.ArrayList; Seletor.java class Seletor { private List selecionaMenoresQue(List palavras, int tamanho) { List resultado = new ArrayList(); for (int i = 0; i < palavras.size(); i++) { String pal = (String) palavras.get(i); if (pal.length() <= tamanho) { resultado.add(pal); } } return resultado; } public static void main(String[] args) { List linguagens = new ArrayList(); linguagens.add("Java"); linguagens.add("Scala"); linguagens.add("Groovy"); linguagens.add("Ruby"); Seletor seletor = new Seletor(); List selecionadas = seletor.selecionaMenoresQue(linguagens, 5); System.out.println("Total "+selecionadas.size()) for (int i = 0; i < selecionadas.size(); i++) { String sel = (String) selecionadas.get(i); System.out.println(sel); } } 11 @lucastex
  • 12.
    import java.util.List; import java.util.ArrayList; classSeletor { private List selecionaMenoresQue(List palavras, int tamanho) { List resultado = new ArrayList(); for (int i = 0; i < palavras.size(); i++) { String pal = (String) palavras.get(i); if (pal.length() <= tamanho) { resultado.add(pal); } } return resultado; } public static void main(String[] args) { List linguagens = new ArrayList(); linguagens.add("Java"); linguagens.add("Scala"); linguagens.add("Groovy"); linguagens.add("Ruby"); Seletor seletor = new Seletor(); List selecionadas = seletor.selecionaMenoresQue(linguagens, 5); System.out.println("Total "+selecionadas.size()) for (int i = 0; i < selecionadas.size(); i++) { String sel = (String) selecionadas.get(i); System.out.println(sel); } } 12 @lucastex
  • 13.
    regra dos 80- 20 13 @lucastex
  • 14.
    import java.util.List; import java.util.ArrayList; classSeletor { private List selecionaMenoresQue(List palavras, int tamanho) { List resultado = new ArrayList(); for (int i = 0; i < palavras.size(); i++) { String pal = (String) palavras.get(i); if (pal.length() <= tamanho) { resultado.add(pal); } } return resultado; } public static void main(String[] args) { List linguagens = new ArrayList(); linguagens.add("Java"); linguagens.add("Scala"); linguagens.add("Groovy"); linguagens.add("Ruby"); Seletor seletor = new Seletor(); List selecionadas = seletor.selecionaMenoresQue(linguagens, 5); System.out.println("Total "+selecionadas.size()) for (int i = 0; i < selecionadas.size(); i++) { String sel = (String) selecionadas.get(i); System.out.println(sel); } } 14 @lucastex
  • 15.
    class Seletor { private List selecionaMenoresQue(List palavras, int tamanho) { List resultado = new ArrayList() palavras.each { String pal -> if (pal.length() <= tamanho) { resultado.add(pal) } } return resultado } public static void main(String[] args) { List linguagens = new ArrayList() linguagens.add("Java") linguagens.add("Scala") linguagens.add("Groovy") linguagens.add("Ruby") Seletor seletor = new Seletor() List selecionadas = seletor.selecionaMenoresQue(linguagens, 5) System.out.println("Total "+selecionadas.size()) selecionadas.each { String sel -> System.out.println(sel) } } } 15 @lucastex
  • 16.
    class Seletor { private List selecionaMenoresQue(List palavras, int tamanho) { List resultado = new ArrayList() palavras.each { String pal -> if (pal.length() <= tamanho) { resultado.add(pal) } } return resultado } public static void main(String[] args) { List linguagens = new ArrayList() linguagens.add("Java") linguagens.add("Scala") linguagens.add("Groovy") linguagens.add("Ruby") Seletor seletor = new Seletor() List selecionadas = seletor.selecionaMenoresQue(linguagens, 5) System.out.println("Total "+selecionadas.size()) selecionadas.each { String sel -> System.out.println(sel) } } } 16 @lucastex
  • 17.
    def selecionaMenoresQue(palavras, tamanho){ def resultado = new ArrayList() palavras.each { pal -> if (pal.size() <= tamanho) { resultado.add(pal) } } return resultado } def linguagens = new ArrayList() linguagens.add("Java") linguagens.add("Scala") linguagens.add("Groovy") linguagens.add("Ruby") def selecionadas = selecionaMenoresQue(linguagens, 5) System.out.println("Total "+selecionadas.size()) selecionadas.each { sel -> System.out.println(sel) } 17 @lucastex
  • 18.
    def selecionaMenoresQue(palavras, tamanho){ def resultado = new ArrayList() palavras.each { pal -> if (pal.size() <= tamanho) { resultado.add(pal) } } return resultado } def linguagens = new ArrayList() linguagens.add("Java") linguagens.add("Scala") linguagens.add("Groovy") linguagens.add("Ruby") def selecionadas = selecionaMenoresQue(linguagens, 5) System.out.println("Total "+selecionadas.size()) selecionadas.each { sel -> System.out.println(sel) } 18 @lucastex
  • 19.
    def selecionaMenoresQue(palavras, tamanho){ def resultado = [] palavras.each { pal -> if (pal.size() <= tamanho) { resultado.add(pal) } } resultado } def linguagens = ["Java","Scala","Groovy","Ruby"] def selecionadas = selecionaMenoresQue(linguagens, 5) println("Total ${selecionadas.size()}") selecionadas.each { sel -> println(sel) } 19 @lucastex
  • 20.
    def selecionaMenoresQue(palavras, tamanho){ def resultado = [] palavras.each { pal -> if (pal.size() <= tamanho) { resultado.add(pal) } } resultado } def linguagens = ["Java","Scala","Groovy","Ruby"] def selecionadas = selecionaMenoresQue(linguagens, 5) println("Total ${selecionadas.size()}") selecionadas.each { sel -> println(sel) } 20 @lucastex
  • 21.
    def selecionaMenoresQue(palavras, tamanho){ palavras.findAll { it.size() <= tamanho } } def linguagens = ["Java","Scala","Groovy","Ruby"] def selecionadas = selecionaMenoresQue(linguagens, 5) println "Total ${selecionadas.size()}" selecionadas.each { sel -> println sel } 21 @lucastex
  • 22.
    def selecionaMenoresQue(palavras, tamanho){ palavras.findAll { it.size() <= tamanho } } def linguagens = ["Java","Scala","Groovy","Ruby"] def selecionadas = selecionaMenoresQue(linguagens, 5) println "Total ${selecionadas.size()}" selecionadas.each { sel -> println sel } 22 @lucastex
  • 23.
    def linguagens =["Java","Scala","Groovy","Ruby"] def selecionadas = linguagens.findAll { it.size() <= 5 } println "Total ${selecionadas.size()}" selecionadas.each { sel -> println sel } 23 @lucastex
  • 24.
    Seletor.groovy def linguagens =["Java","Scala","Groovy","Ruby"] def selecionadas = linguagens.findAll { it.size() <= 5 } println "Total ${selecionadas.size()}" selecionadas.each { sel -> println sel } 24 @lucastex
  • 25.
    Seletor.groovy def linguagens =["Java","Scala","Groovy","Ruby"] def selecionadas = linguagens.findAll { it.size() <= 5 } println "Total ${selecionadas.size()}" selecionadas.each { sel -> println sel } 25 @lucastex
  • 26.
    import java.util.List; import java.util.ArrayList; Seletor.java class Seletor { private List selecionaMenoresQue(List palavras, int tamanho) { List resultado = new ArrayList(); for (int i = 0; i < palavras.size(); i++) { String pal = (String) palavras.get(i); if (pal.length() <= tamanho) { resultado.add(pal); } } return resultado; } public static void main(String[] args) { List linguagens = new ArrayList(); linguagens.add("Java"); linguagens.add("Scala"); linguagens.add("Groovy"); linguagens.add("Ruby"); Seletor seletor = new Seletor(); List selecionadas = seletor.selecionaMenoresQue(linguagens, 5); System.out.println("Total "+selecionadas.size()) for (int i = 0; i < selecionadas.size(); i++) { String sel = (String) selecionadas.get(i); System.out.println(sel); } } 26 @lucastex
  • 27.
    Groovy é Java! 27 @lucastex
  • 28.
    import java.util.List; import java.util.ArrayList; Seletor.java class Seletor { private List selecionaMenoresQue(List palavras, int tamanho) { List resultado = new ArrayList(); for (int i = 0; i < palavras.size(); i++) { String pal = (String) palavras.get(i); if (pal.length() <= tamanho) { resultado.add(pal); } } return resultado; } public static void main(String[] args) { List linguagens = new ArrayList(); linguagens.add("Java"); linguagens.add("Scala"); linguagens.add("Groovy"); linguagens.add("Ruby"); Seletor seletor = new Seletor(); List selecionadas = seletor.selecionaMenoresQue(linguagens, 5); System.out.println("Total "+selecionadas.size()) for (int i = 0; i < selecionadas.size(); i++) { String sel = (String) selecionadas.get(i); System.out.println(sel); } } 28 @lucastex
  • 29.
    import java.util.List; import java.util.ArrayList; Seletor.groovy class Seletor { private List selecionaMenoresQue(List palavras, int tamanho) { List resultado = new ArrayList(); for (int i = 0; i < palavras.size(); i++) { String pal = (String) palavras.get(i); if (pal.length() <= tamanho) { resultado.add(pal); } } return resultado; } public static void main(String[] args) { List linguagens = new ArrayList(); linguagens.add("Java"); linguagens.add("Scala"); linguagens.add("Groovy"); linguagens.add("Ruby"); Seletor seletor = new Seletor(); List selecionadas = seletor.selecionaMenoresQue(linguagens, 5); System.out.println("Total "+selecionadas.size()) for (int i = 0; i < selecionadas.size(); i++) { String sel = (String) selecionadas.get(i); System.out.println(sel); } } 29 @lucastex
  • 30.
    Groovy é melhor que Java! 30 @lucastex
  • 31.
    import java.util.List; import java.util.ArrayList; Seletor.java class Seletor { private List selecionaMenoresQue(List palavras, int tamanho) { List resultado = new ArrayList(); for (int i = 0; i < palavras.size(); i++) { String pal = (String) palavras.get(i); if (pal.length() <= tamanho) { resultado.add(pal); } } return resultado; } public static void main(String[] args) { List linguagens = new ArrayList(); linguagens.add("Java"); linguagens.add("Scala"); linguagens.add("Groovy"); linguagens.add("Ruby"); Seletor seletor = new Seletor(); List selecionadas = seletor.selecionaMenoresQue(linguagens, 5); System.out.println("Total "+selecionadas.size()) for (int i = 0; i < selecionadas.size(); i++) { String sel = (String) selecionadas.get(i); System.out.println(sel); } } 31 @lucastex
  • 32.
    Seletor.groovy def linguagens =["Java","Scala","Groovy","Ruby"] def selecionadas = linguagens.findAll { it.size() <= 5 } println "Total ${selecionadas.size()}" selecionadas.each { sel -> println sel } 32 @lucastex
  • 33.
    “When you programin groovy, in many ways you're writing a special kind of java” (Dierk König) 33 @lucastex
  • 34.
    Grails 34 @lucastex
  • 35.
    cenário comum 35 @lucastex
  • 36.
    - Spring 36 @lucastex
  • 37.
  • 38.
    - Spring - Hibernate -JSF 38 @lucastex
  • 39.
    - Spring - Hibernate -JSF - DWR 39 @lucastex
  • 40.
    - Spring - Hibernate -JSF - DWR - Velocity 40 @lucastex
  • 41.
    - Spring - Hibernate -JSF - DWR - Velocity - Tuckey 41 @lucastex
  • 42.
    42 @lucastex
  • 43.
    Que você éincompetente Que você é mentiroso Que colocar todos os frameworks juntos toma tempo e pode gerar problemas 43 @lucastex
  • 44.
    - Desenvolvimento rápido - Full stack - Fácil bootstrap - Convenções - CoC - Scaffolding - Plugins 44 @lucastex
  • 45.
    - Desenvolvimento rápido - Full stack - Fácil bootstrap - Convenções - CoC - Scaffolding - Plugins 45 @lucastex
  • 46.
    Full Stack - mapeamentoor - gorm - log - url rewrites - view e decoration - controladores - controle transacional - configuração por ambiente 46 @lucastex
  • 47.
    Mapeamento OR -gorm 47 @lucastex
  • 48.
    Mapeamento OR -gorm Pessoa.findAllByNomeLikeAndIdadeGreaterThan(“%lucas%”, 25) 48 @lucastex
  • 49.
    Mapeamento OR -gorm Pessoa.findAllByNomeLikeAndIdadeGreaterThan(“%lucas%”, 25) Pessoa.get(1234) 49 @lucastex
  • 50.
    Mapeamento OR -gorm Pessoa.findAllByNomeLikeAndIdadeGreaterThan(“%lucas%”, 25) Pessoa.get(1234) Date dateCreated Date lastUpdated 50 @lucastex
  • 51.
    Mapeamento OR -gorm Pessoa.findAllByNomeLikeAndIdadeGreaterThan(“%lucas%”, 25) Pessoa.get(1234) Date dateCreated Date lastUpdated Pessoa.findXXX(xxx, [max:10, offset:10, sort: “nome”, order: “asc”, cache: true]) 51 @lucastex
  • 52.
    Mapeamento OR -gorm Pessoa.findAllByNomeLikeAndIdadeGreaterThan(“%lucas%”, 25) Pessoa.get(1234) Date dateCreated Date lastUpdated Pessoa.findXXX(xxx, [max:10, offset:10, sort: “nome”, order: “asc”, cache: true]) Pessoa.findAll(“from Pessoa p where p.idade = 25”) 52 @lucastex
  • 53.
    Mapeamento OR -gorm Pessoa.findAllByNomeLikeAndIdadeGreaterThan(“%lucas%”, 25) Pessoa.get(1234) Date dateCreated Date lastUpdated Pessoa.findXXX(xxx, [max:10, offset:10, sort: “nome”, order: “asc”, cache: true]) Pessoa.findAll(“from Pessoa p where p.idade = 25”) def onLoad() { ... } def beforeInsert() { ... } def beforeUpdate() { ... } def beforeDelete() { ... } 53 @lucastex
  • 54.
    - Desenvolvimento rápido - Full stack - Fácil bootstrap - Convenções - CoC - Scaffolding - Plugins 54 @lucastex
  • 55.
    Fácil bootstrap ‣ grailscreate-app umesp ‣ grails run-app 55 @lucastex
  • 56.
    56 @lucastex
  • 57.
    gerenciamento de dependências banco de dados mapeamento de urls controladores dominios (tabelas) bundles de internacionalização servicos reutilizáveis taglibs classes utilitarias telas e páginas jars de bibliotecas scripts de automatização outros fontes dependentes testes pasta de arquivos web @lucastex
  • 58.
    - Desenvolvimento rápido - Full stack - Fácil bootstrap - Convenções - CoC - Scaffolding - Plugins 58 @lucastex
  • 59.
    CoC - Classesde domínio class Pessoa { String nome String telefone String email String cpf static constraints = { nome(nullable:false) telefone(nullable:true, maxSize: 8) email(email:true) cpf(cpf:true) } } 59 @lucastex
  • 60.
    CoC - Classesde domínio class Pessoa { String nome String telefone String email String cpf static constraints = { nome(nullable:false) telefone(nullable:true, maxSize: 8) email(email:true) cpf(cpf:true) } static mapping = { table ‘TBL_PESS’ nome column:‘STR_NM’ telefone column: ‘STR_TLFN’ email column: ‘STR_ML’ CPF column: ‘STR_CPF’ } } 60 @lucastex
  • 61.
    CoC - Controllers class PessoaController { def criar = { def pessoa = new Pessoa(params) pessoa.save() } } 61 @lucastex
  • 62.
    CoC - Controllers class PessoaController { def criar = { def pessoa = new Pessoa(params) pessoa.save() } } http://localhost:8080/app/pessoa/criar 62 @lucastex
  • 63.
    CoC - Controllers class PessoaController { def criar = { def pessoa = new Pessoa(params) pessoa.save() } } http://localhost:8080/app/pessoa/criar grails-app/ views/ pessoa/ criar.gsp 63 @lucastex
  • 64.
    - Desenvolvimento rápido - Full stack - Fácil bootstrap - Convenções - CoC - Scaffolding - Plugins 64 @lucastex
  • 65.
    Scaffolding - Prototipação dasDomain Classes - Estático / Dinâmico (templates) - Integridade relacional e dos tipos - Validação 65 @lucastex
  • 66.
    Scaffolding 66 @lucastex
  • 67.
    Scaffolding 67 @lucastex
  • 68.
    Scaffolding 68 @lucastex
  • 69.
    Scaffolding estático ‣ grailsgenerate-all Pessoa 69 @lucastex
  • 70.
    Scaffolding estático ‣ grailsgenerate-all Pessoa 70 @lucastex
  • 71.
    Scaffolding dinâmico class PessoaController { def scaffold = true } 71 @lucastex
  • 72.
    Validação 72 @lucastex
  • 73.
    - Desenvolvimento rápido - Full stack - Fácil bootstrap - Convenções - CoC - Scaffolding - Plugins 73 @lucastex
  • 74.
    Plugins - fácil extensão -modularização de aplicações - adição de métodos / comportamento - gerenciamento automático 74 @lucastex
  • 75.
    Plugins - 500+ pluginsatualmente - segurança - manipulação de imagens - cms / blog - quartz (agendamento) - ui - lucene 75 @lucastex
  • 76.
    Plugins - mail - gwt -feed / rss - geração de diagramas de classe - gráficos - jquery - auditoria 76 @lucastex
  • 77.
    Plugins - performance - behaviour - taggable - featurable - rateable - attachmentable - commentable 77 @lucastex
  • 78.
    segredo? 78 @lucastex
  • 79.
    Rock solid foundations -Spring 79 @lucastex
  • 80.
    Rock solid foundations -Spring - Hibernate 80 @lucastex
  • 81.
    Rock solid foundations -Spring - Hibernate - Sitemesh 81 @lucastex
  • 82.
    Rock solid foundations -Spring - Hibernate - Sitemesh - Log4J 82 @lucastex
  • 83.
    Rock solid foundations -Spring - Hibernate - Sitemesh - Log4J - Plugins 83 @lucastex
  • 84.
    Rock solid foundations -Spring - Hibernate - Sitemesh - Log4J - Plugins - JAVA / JVM 84 @lucastex
  • 85.
    Comunidade 85 @lucastex
  • 86.
    Fontes de informação - grails.org - gr8forums.org (en) - grailsbrasil.com (pt) - springsource.com - groovy.codehaus.org - twitter (#groovy e #grails) - Listas de e-mail - groovy-user - grails-user 86 @lucastex
  • 87.
    GroovyMag.com 87 @lucastex
  • 88.
  • 89.
    Dúvidas? 89 @lucastex
  • 90.
    Demo! 90 @lucastex
  • 91.
    Grails Java produtivo edivertido Lucas Teixeira lucastex.com.br lucastex.com @lucastex @lucastex

Notas do Editor

  • #3 - Apresenta&amp;#xE7;&amp;#xE3;o pessoal - Apresenta&amp;#xE7;&amp;#xE3;o profissional - desde fim 07, grails 0.3 - hoje grails 1.3.1
  • #4 - groovy, grails, gaelyk, gradle, gant, gmaven
  • #6 agenda da palestra
  • #7 primeiro ponto, linguagem de script em cima da JVM. LINGUAGEM DE PROGRAMACAO, ou seja -&gt; perguntar quantos programadores tem, e para eles perguntar proximo slide
  • #8 O que te deixa motivado a programar? O que te incentiva a programar? O que te d&amp;#xE1; vontade de programar mais, quando voc&amp;#xEA; acaba de programar? Exemplos de Servlet -&gt; Struts1 e Struts1 -&gt; Webwork.
  • #9 pensar no problema que voc&amp;#xEA; tem que resolver e n&amp;#xE3;o em como usar uma ferramenta para resolver o problema. PROGRAMAR = PENSAR + CODIFICAR. se voce nao pensa, o que voc&amp;#xEA; &amp;#xE9;?
  • #10 MACACO DE CODIGO! Falar do &amp;#x201C;Teorema do macaco infinito&amp;#x201D;
  • #11 &amp;#xE9; isso que eu quero, pensar. e &amp;#xE9; isso que groovy nos deixa fazer, codificar menos pra poder pensar mais Exemplo disso:
  • #12 SCRIPT -&gt; deixar claro, SCRIPT, executar in line proposito do programa: um metodo que filtra palavras menores (ou igual) a X letras explicar por cima o c&amp;#xF3;digo, e mostrar que &amp;#xE9; uma classe java
  • #13 destaque = valor do c&amp;#xF3;digo, l&amp;#xF3;gica (o que tivemos que pensar) branco = linguagem, estrutura, &amp;#x2018;perda de tempo&amp;#x2019;
  • #14 groovy vem tentar balancear esta equa&amp;#xE7;&amp;#xE3;o, tirando o m&amp;#xE1;ximo destes 80. vou agora mostrar as facilidades e os &amp;#x201C;atalhos&amp;#x201D; que groovy traz pra que a gente consiga balancear a equaceao
  • #15 Marrom - Classes frequentemente utilizadas, importar por default. (quantas classes no seu projeto importam java.util.*) Verde - Itera&amp;#xE7;&amp;#xE3;o de listas, no java 5 j&amp;#xE1; tem foreach, mas acredite, d&amp;#xE1; pra fazer melhor. Vermelho - Ponto e v&amp;#xED;rgula - &amp;#x201C;PRA QU&amp;#xCA;?&amp;#x201D;
  • #16 resultado
  • #17 Rosa - Consist&amp;#xEA;ncia. M&amp;#xE9;todo que faz a &amp;#x2018;mesma&amp;#x2019; coisa, com nome diferente. Vermelho - Eu quero um script. Por que definir classe? Pra que explicitar o c&amp;#xF3;digo a ser executado? Amarelho - Territ&amp;#xF3;rio &amp;#x2018;controverso&amp;#x2019;, tipagem din&amp;#xE2;mica
  • #18 resultado
  • #19 VERDE - return? PRA QUE? eu devolvo o que eu tenho na m&amp;#xE3;o. se meu ultimo statement me deu um list, vai o list, se o ultimo statement me devolve um int, vai o int? Por que? Por que se eu terminei de executar o metodo, eu tenho o que eu quero. Se eu nao tenho, ainda falta alguma coisa, n&amp;#xE9;? AMARELO - Lista? Nada mais simples? VERMELHO - Concatena&amp;#xE7;&amp;#xE3;o de strings? O que &amp;#xE9; pior, usar o + ou o .concat? AZUL - Imprimir, &amp;#xE9; isso que eu quero, s&amp;#xF3; isso, IMPRIMIR (println &amp;#xE9; um m&amp;#xE9;todo da classe PrintStream, que &amp;#xE9; o out, uma referencia statica dentro da classe System), t&amp;#xE1;, e ai?
  • #20 resultado
  • #21 VERDE - Parenteses. eu nao falo &amp;#x201C;INICIO&amp;#x201D; &amp;#x201C;OI TUDO BEM?&amp;#x201D; &amp;#x201C;FIM&amp;#x201D; quando converso. AZUL - Facilidade pra trabalhar com listas. Afinal, quase sempre que voc&amp;#xEA; itera uma lista, &amp;#xE9; pra fazer alguma coisa com seu conte&amp;#xFA;do. Filtrar, calcular, etc.
  • #22 resultado
  • #23 AMARELO - M&amp;#xE9;todo pra que? Se eu tenho uma instru&amp;#xE7;&amp;#xE3;o apenas para executar?
  • #24 resultado
  • #25 Este &amp;#xE9; o nosso Seletor.groovy. Quanto de c&amp;#xF3;digo tem aqui? Quanto de linguagem tem?
  • #26 &amp;#x201C;esse eh o seletor.groovy&amp;#x201D; Amarelo = quanto precisei pensar. branco, quanto precisei escrever pro programa entender o meu objetivo Compara&amp;#xE7;&amp;#xE3;o com prox slide a quantidade de instrucoes do programa
  • #27 esse eh o seletor.java. falar que groovy &amp;#xE9; legal, mas como adotar? que infra estrutura a gente precisa pra usar groovy? servidor? outra JVM? o que? groovy &amp;#xE9; apenas um jar dentro da JVM....
  • #28 porque groovy &amp;#xE9; java.
  • #29 comparar os 2, dizer que um &amp;#xE9; outro, e por isso que groovy &amp;#xE9; java perguntar... &amp;#x201C;groovy &amp;#xE9; java?&amp;#x201D;
  • #30 perguntar... &amp;#x201C;groovy &amp;#xE9; java?&amp;#x201D; e dizer... &amp;#x201C;n&amp;#xE3;o!!&amp;#x201D; passar o slide
  • #31 &amp;#xE9; melhor. porque me deixa pensar no que resolver. e o que eu tinha que resolver no programa? quanto dele &amp;#xE9; a resolu&amp;#xE7;&amp;#xE3;o do meu problema, e quanto dele &amp;#xE9; linguagem de programa&amp;#xE7;&amp;#xE3;o?
  • #32 falar que groovy &amp;#xE9; legal, mas como adotar? que infra estrutura a gente precisa pra usar groovy?
  • #35 trazendo a faciidade do groovy para o ambiente web exemplo de criando aplicacao &amp;#x2018;standard&amp;#x2019; em java....
  • #36 cenario comum nas empresas para a cria&amp;#xE7;&amp;#xE3;o de uma aplica&amp;#xE7;&amp;#xE3;o
  • #43 Bem vindo ao inferno configuracao da aplica&amp;#xE7;&amp;#xE3;o como um todo, pra poder come&amp;#xE7;ar a colocar l&amp;#xF3;gica... quanto tempo? (2 dias?) o que acontece quando voce fala que vai demorar 2 dias? o que o seu chefe pensa? no cronograma nao tinha o tempo pra isso, certo?
  • #44 esse &amp;#xE9; um dos problemas que grails resolve, traz o desenvolvimento &amp;#x201C;r&amp;#xE1;pido&amp;#x201D;. n&amp;#xE3;o &amp;#xE9; &amp;#x2018;agil&amp;#x2019;, &amp;#xE9; &amp;#x2018;r&amp;#xE1;pido&amp;#x2019;
  • #45 e &amp;#xE9; isso que o grails nos traz.
  • #47 full stack, &amp;#xE9; a estrutura completa para o desenvolvimento nao da pra falar de tudo, apenas de mapeamento or (GORM)
  • #56 mostrar no proximo slide o resultado
  • #58 nesse slide j&amp;#xE1; iniciar falando de CoC
  • #60 reflete em tabela pessoa com colunas e constraints 2 tipos de constraints - que mexe em schema e que soh via hibernate validator ressaltar Conv. OVER Conf. e n&amp;#xE3;o Conv. INSTEAD of Conf.
  • #61 d&amp;#xE1; poder sem tirar a liberdade de configurar do melhor jeito
  • #69 alem disso, tem o controller com os metodos gerados
  • #72 falar dos templates
  • #75 falar que &amp;#xE9; uma app a parte que faz merge com a sua qq tipo de resource... classe, tela, service, javascript, conf do web.xml gerenciamento automatico = baixar sozinho
  • #79 qual &amp;#xE9; o segredo? na minha opiniao
  • #80 nao s&amp;#xF3; framework, mas a empresa
  • #85 em &amp;#x201C;java/jvm&amp;#x201D; falar da integracao com tudo que j&amp;#xE1; existe, qq jar no lib e ponto
  • #88 michael apoia muito a divulgacao do groovy e grails por isso que deu os coupons
  • #89 brasilitfree - uma edicao de gra&amp;#xE7;a - qualquer edi&amp;#xE7;&amp;#xE3;o brasilit10 - 10% em qq compra, seja de uma edicao, varias ou assinatura