SlideShare une entreprise Scribd logo
1  sur  91
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

Contenu connexe

Tendances

Persistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomPersistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomNelson Glauber Leal
 
Exercicios Vetores (Arrays) - Estruturas de dados e algoritmos com Java
Exercicios Vetores (Arrays) - Estruturas de dados e algoritmos com JavaExercicios Vetores (Arrays) - Estruturas de dados e algoritmos com Java
Exercicios Vetores (Arrays) - Estruturas de dados e algoritmos com JavaLoiane Groner
 
Threads 07: Sincronizadores
Threads 07: SincronizadoresThreads 07: Sincronizadores
Threads 07: SincronizadoresHelder da Rocha
 
(A12) LabMM3 - JavaScript - Arrays
(A12) LabMM3 - JavaScript - Arrays(A12) LabMM3 - JavaScript - Arrays
(A12) LabMM3 - JavaScript - ArraysCarlos Santos
 
Threads 06: Coleções concorrentes
Threads 06: Coleções concorrentesThreads 06: Coleções concorrentes
Threads 06: Coleções concorrentesHelder da Rocha
 
Threads 04 Variáveis atômicas
Threads 04 Variáveis atômicasThreads 04 Variáveis atômicas
Threads 04 Variáveis atômicasHelder da Rocha
 

Tendances (9)

Persistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomPersistência de Dados no SQLite com Room
Persistência de Dados no SQLite com Room
 
Exercicios Vetores (Arrays) - Estruturas de dados e algoritmos com Java
Exercicios Vetores (Arrays) - Estruturas de dados e algoritmos com JavaExercicios Vetores (Arrays) - Estruturas de dados e algoritmos com Java
Exercicios Vetores (Arrays) - Estruturas de dados e algoritmos com Java
 
Threads 07: Sincronizadores
Threads 07: SincronizadoresThreads 07: Sincronizadores
Threads 07: Sincronizadores
 
POO - 23 - Coleções da API do Java
POO -  23 - Coleções da API do Java POO -  23 - Coleções da API do Java
POO - 23 - Coleções da API do Java
 
(A12) LabMM3 - JavaScript - Arrays
(A12) LabMM3 - JavaScript - Arrays(A12) LabMM3 - JavaScript - Arrays
(A12) LabMM3 - JavaScript - Arrays
 
Palestra2009
Palestra2009Palestra2009
Palestra2009
 
Threads 06: Coleções concorrentes
Threads 06: Coleções concorrentesThreads 06: Coleções concorrentes
Threads 06: Coleções concorrentes
 
Palestra cbq
Palestra cbqPalestra cbq
Palestra cbq
 
Threads 04 Variáveis atômicas
Threads 04 Variáveis atômicasThreads 04 Variáveis atômicas
Threads 04 Variáveis atômicas
 

Similaire à Grails: Java produtivo e divertido

Curso java 08 - mais sobre coleções
Curso java   08 - mais sobre coleçõesCurso java   08 - mais sobre coleções
Curso java 08 - mais sobre coleçõesMaurício Linhares
 
Groovy na plataforma Java
Groovy na plataforma JavaGroovy na plataforma Java
Groovy na plataforma JavaJoão Lourenço
 
Indo além na jvm com grails - UFOP
Indo além na jvm com grails - UFOPIndo além na jvm com grails - UFOP
Indo além na jvm com grails - UFOPFelipe Zampa
 
Ruby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanosRuby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanosGregorio Kusowski
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
 
O que é que o Java não tem?
O que é que o Java não tem?O que é que o Java não tem?
O que é que o Java não tem?Denis Costa
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com javaMaurício Linhares
 
55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil55 New Things in Java 7 - Brazil
55 New Things in Java 7 - BrazilStephen Chin
 
Leonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional InterfacesLeonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional InterfacesDevCamp Campinas
 
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!Frederico Maia Arantes
 
ANTLR-ANother Tool for Language Recognition
ANTLR-ANother Tool for Language RecognitionANTLR-ANother Tool for Language Recognition
ANTLR-ANother Tool for Language Recognitionelliando dias
 
Template method pattern
Template method patternTemplate method pattern
Template method patternEriko Morais
 
Por que dizemos que Scala é uma linguagem funcional?
Por que dizemos que Scala é uma linguagem funcional?Por que dizemos que Scala é uma linguagem funcional?
Por que dizemos que Scala é uma linguagem funcional?pmatiello
 

Similaire à Grails: Java produtivo e divertido (20)

Grupo2
Grupo2Grupo2
Grupo2
 
Curso java 08 - mais sobre coleções
Curso java   08 - mais sobre coleçõesCurso java   08 - mais sobre coleções
Curso java 08 - mais sobre coleções
 
Groovy na plataforma Java
Groovy na plataforma JavaGroovy na plataforma Java
Groovy na plataforma Java
 
Indo além na jvm com grails - UFOP
Indo além na jvm com grails - UFOPIndo além na jvm com grails - UFOP
Indo além na jvm com grails - UFOP
 
Ruby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanosRuby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanos
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
Java para iniciantes
Java para iniciantesJava para iniciantes
Java para iniciantes
 
O que é que o Java não tem?
O que é que o Java não tem?O que é que o Java não tem?
O que é que o Java não tem?
 
Migrando pra Scala
Migrando pra ScalaMigrando pra Scala
Migrando pra Scala
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com java
 
55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil
 
Java 9, 10 e ... 11
Java 9, 10 e ... 11Java 9, 10 e ... 11
Java 9, 10 e ... 11
 
Lambda Expressions
Lambda ExpressionsLambda Expressions
Lambda Expressions
 
Leonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional InterfacesLeonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional Interfaces
 
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
 
Java8
Java8Java8
Java8
 
Ruby (1)
Ruby (1)Ruby (1)
Ruby (1)
 
ANTLR-ANother Tool for Language Recognition
ANTLR-ANother Tool for Language RecognitionANTLR-ANother Tool for Language Recognition
ANTLR-ANother Tool for Language Recognition
 
Template method pattern
Template method patternTemplate method pattern
Template method pattern
 
Por que dizemos que Scala é uma linguagem funcional?
Por que dizemos que Scala é uma linguagem funcional?Por que dizemos que Scala é uma linguagem funcional?
Por que dizemos que Scala é uma linguagem funcional?
 

Grails: Java produtivo e divertido

  • 1. Grails Java produtivo e divertido 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 te motiva? 7 @lucastex
  • 8. Pensar a maior parte do 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; 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
  • 13. regra dos 80 - 20 13 @lucastex
  • 14. 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
  • 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 program in 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. - Spring - Hibernate 37 @lucastex
  • 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 - mapeamento or - 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 ‣ grails create-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 - 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
  • 60. 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
  • 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 das Domain 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 ‣ grails generate-all Pessoa 69 @lucastex
  • 70. Scaffolding estático ‣ grails generate-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+ plugins atualmente - 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. brasilitfree brasilit10 88 @lucastex
  • 89. Dúvidas? 89 @lucastex
  • 90. Demo! 90 @lucastex
  • 91. Grails Java produtivo e divertido Lucas Teixeira lucastex.com.br lucastex.com @lucastex @lucastex

Notes de l'éditeur

  1. - 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
  2. - groovy, grails, gaelyk, gradle, gant, gmaven
  3. agenda da palestra
  4. 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
  5. 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.
  6. 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;?
  7. MACACO DE CODIGO! Falar do &amp;#x201C;Teorema do macaco infinito&amp;#x201D;
  8. &amp;#xE9; isso que eu quero, pensar. e &amp;#xE9; isso que groovy nos deixa fazer, codificar menos pra poder pensar mais Exemplo disso:
  9. 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
  10. 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;
  11. 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
  12. 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;
  13. resultado
  14. 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
  15. resultado
  16. 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?
  17. resultado
  18. 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.
  19. resultado
  20. AMARELO - M&amp;#xE9;todo pra que? Se eu tenho uma instru&amp;#xE7;&amp;#xE3;o apenas para executar?
  21. resultado
  22. Este &amp;#xE9; o nosso Seletor.groovy. Quanto de c&amp;#xF3;digo tem aqui? Quanto de linguagem tem?
  23. &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
  24. 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....
  25. porque groovy &amp;#xE9; java.
  26. 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;
  27. perguntar... &amp;#x201C;groovy &amp;#xE9; java?&amp;#x201D; e dizer... &amp;#x201C;n&amp;#xE3;o!!&amp;#x201D; passar o slide
  28. &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?
  29. falar que groovy &amp;#xE9; legal, mas como adotar? que infra estrutura a gente precisa pra usar groovy?
  30. trazendo a faciidade do groovy para o ambiente web exemplo de criando aplicacao &amp;#x2018;standard&amp;#x2019; em java....
  31. cenario comum nas empresas para a cria&amp;#xE7;&amp;#xE3;o de uma aplica&amp;#xE7;&amp;#xE3;o
  32. 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?
  33. 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;
  34. e &amp;#xE9; isso que o grails nos traz.
  35. full stack, &amp;#xE9; a estrutura completa para o desenvolvimento nao da pra falar de tudo, apenas de mapeamento or (GORM)
  36. mostrar no proximo slide o resultado
  37. nesse slide j&amp;#xE1; iniciar falando de CoC
  38. 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.
  39. d&amp;#xE1; poder sem tirar a liberdade de configurar do melhor jeito
  40. alem disso, tem o controller com os metodos gerados
  41. falar dos templates
  42. 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
  43. qual &amp;#xE9; o segredo? na minha opiniao
  44. nao s&amp;#xF3; framework, mas a empresa
  45. em &amp;#x201C;java/jvm&amp;#x201D; falar da integracao com tudo que j&amp;#xE1; existe, qq jar no lib e ponto
  46. michael apoia muito a divulgacao do groovy e grails por isso que deu os coupons
  47. 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