O “Santo Graal” do
                                  desenvolvimento Web!




                                              Natã Melo
                                   (nata.venancio.melo@gmail.com)
                                          Créditos: Diego Cavalcanti




quarta-feira, 9 de maio de 2012
quarta-feira, 9 de maio de 2012
Olhando o passado
quarta-feira, 9 de maio de 2012
• Perda de tempo para criar
                                  ambiente de desenvolvimento ...
                             • ... e para configurar uma aplicação



                                  Olhando o passado
quarta-feira, 9 de maio de 2012
• Muitas tarefas repetitivas
                                    executadas manualmente
                                  • Muito tempo para aprender
                                    tecnologias (Spring, Hibernate,
                                    JSF, etc)



                                   Olhando o passado
quarta-feira, 9 de maio de 2012
• Baixa produtividade no
                                   desenvolvimento Web




                                  Olhando o passado
quarta-feira, 9 de maio de 2012
Resultado...




quarta-feira, 9 de maio de 2012
Temos
               solução
              para esses
             problemas?



quarta-feira, 9 de maio de 2012
Ruby on Rails


                                  CoC: Convention over
                                     Configuration



                                   DRY: Don’t Repeat
                                       Yourself



quarta-feira, 9 de maio de 2012
Ruby on Rails


                                  Stack Completo




                                  Expansibilidade




quarta-feira, 9 de maio de 2012
E por que não Ruby on Rails?


                          O investimento feito
                            na equipe e nas
                         ferramentas com Java
                             não deve se
                                perder!




quarta-feira, 9 de maio de 2012
Desenvolvimento Web
                                  <<Rápido e com qualidade>>




quarta-feira, 9 de maio de 2012
Framework baseado em MVC
                       para desenvolvimento web
                         com alta produtividade




quarta-feira, 9 de maio de 2012
Padrão MVC




quarta-feira, 9 de maio de 2012
quarta-feira, 9 de maio de 2012
•Spring
          •Hibernate
          •Groovy
          •Java
          •SiteMesh
          •Jetty
          •Apache Ant

quarta-feira, 9 de maio de 2012
Integração simples com o banco de dados

                        Hibernate transparente para o programador




                                                  +

quarta-feira, 9 de maio de 2012
Arquitetura Grails




quarta-feira, 9 de maio de 2012
Casos de sucesso
                                             Em 2007, eram
                                        7 mil downloads por mês.


                                      Em 2008, passou para
                                            70 mil!

                                        Mantém a média
                                         atualmente!

quarta-feira, 9 de maio de 2012
Casos de sucesso



                                       + 150 milhões de usuários




quarta-feira, 9 de maio de 2012
Casos de sucesso




                                         + 1 bilhão de páginas
                                          acessadas por mês




quarta-feira, 9 de maio de 2012
quarta-feira, 9 de maio de 2012
Comunidade vibrante




                                  • http://grails.markmail.org/
                                  • + de 200.000 mensagens
                                  • Em média 54 mensagens por dia
quarta-feira, 9 de maio de 2012
Pausa para alguns
                                      conceitos


quarta-feira, 9 de maio de 2012
Linguagem dinâmica e ágil para JVM



                                            Java com esteróides

                                    Todo o poder de Java mas com recursos
                                  poderosos emprestados de outras linguagens



                                  Integração com objetos e bibliotecas Java


quarta-feira, 9 de maio de 2012
public class Minicurso {
                    	

                    	

 private String titulo;
                    	

                    	

 public Minicurso (String titulo){
                    	

 	

 this.titulo = titulo;
                    	

 }

                    	

    public String getTitulo() {
                    	

    	

 return titulo;
                    	

    }

                    	

    public void setTitulo(String titulo) {
                    	

    	

 this.titulo = titulo;
                    	

    }
                    	

                    	

    public String getMensagem (){
                    	

    	

 return "Título do Minicurso: " + this.titulo;
                    	

    }
                    }




quarta-feira, 9 de maio de 2012
public class Minicurso {
                  	

                  	

 private String titulo;
                  	

                  	

 public Minicurso (String titulo){
                  	

 	

 this.titulo = titulo;
                  	

 }

                  	

   public String getTitulo() {
                  	

   	

 return titulo;
                  	

   }

                  	

   public void setTitulo(String titulo) {
                  	

   	

 this.titulo = titulo;
                  	

   }
                  	

                  	

   public String getMensagem (){
                  	

   	

 return "Título do Minicurso: " + this.titulo;
                  	

   }

                  }



quarta-feira, 9 de maio de 2012
E os esteróides?




quarta-feira, 9 de maio de 2012
“Groovyficando”
                                     o código
                                      class Minicurso {

                                   	

 def titulo

                                   	

 def getMensagem (){
                                   	

 	

 "Título do Minicurso: ${titulo}"
                                   	

 }
                                   }

                                   miniCurso = new Minicurso (titulo = "Grails")
                                   miniCurso.getMessagem ()




quarta-feira, 9 de maio de 2012
Mais facilidades...
                                    Null Checking
                                          if (obj != null)
                                      	

 	

 ...


                                               if (obj)
                                                    ...




quarta-feira, 9 de maio de 2012
Mais facilidades...
                                    Null Checking

                                        Object obj = new Object ();
                                    String str = "Valor do objeto: " + obj == null ?
                                    "null" : obj.toString();




                                    Object obj = new Object()
                                    String str = "Valor do objeto ${obj?.toString()}"




quarta-feira, 9 de maio de 2012
Mais facilidades...
                                      Mapas
                                         import java.util.HashMap;
                                         import java.util.Map;

                                          Map m = new HashMap();
                                          m.put("br", "Brasil");
                                          m.put("us", "USA");



                                       m = [br:"Brasil", us:"USA"]




quarta-feira, 9 de maio de 2012
Mais facilidades...
                                                Looping
                                              for (int i = 0; i < list.size(); i++) {
                                  	

 	

 	

        Object o = list.get(i);
                                  	

 	

 	

        o.method();
                                  	

 	

     }


                                                              list.each(){
                                  	

 	

 	

                       it.method()
                                  	

 	

                     }




quarta-feira, 9 de maio de 2012
Mais facilidades...
                                       Looping


                                              for (i in 0..<10) {
                                  	

 	

 	

        print i
                                  	

 	

     }




quarta-feira, 9 de maio de 2012
Mais facilidades...
                                        Return


                                         String getEdicao (num){
                                  	

        "Edicao: ${num} "
                                  	

    }




quarta-feira, 9 de maio de 2012
E ainda tem muito mais!



                                   http://groovy.codehaus.org/User+Guide	




quarta-feira, 9 de maio de 2012
http://www.springsource.com/
                                          developer/stso




                                  http://netbeans.org/downloads/
                                             index.html




                                     http://www.eclipse.org/
                                           downloads/
quarta-feira, 9 de maio de 2012
Mãos à obra




quarta-feira, 9 de maio de 2012
Primeiros Passos
                                        Instalação

                                  • Download: http://grails.org/
                                    Download

                                  • Descompactar a pasta
                                  • Configurar variável de
                                    ambiente GRAILS_HOME

                                  • Detalhes: http://grails.org/
                                    Installation+Portuguese




quarta-feira, 9 de maio de 2012
Comandos básicos

                            •     grails create-app
                            •     grails create-domain-class
                            •     grails generate-all
                            •     grails install-plugin
                            •     grails run-app
                            •     grails war

                                               grails help


quarta-feira, 9 de maio de 2012
Estrutura de diretórios e
                                    convenções de nome




quarta-feira, 9 de maio de 2012
Você percebeu?

                      • Nenhum arquivo XML de configuração
                      • Nenhum arquivo de mapeamento
                      • Nenhuma configuração de banco de dados
                      • Nenhuma instalação de servidor de
                              aplicação



                          Tem muita mágica por
                            baixo disso tudo!



quarta-feira, 9 de maio de 2012
Domain Class
                                  <<BD Simplificado>>
                                          Table Album
   class Album {
       String title                         id          title    artist    release_date
       String artist
       Date releaseDate

         static hasMany = [songs: Song]
   }
                                          Table Song


   class Song {                             id          title   duration    album_id
       String title
       Double duration
   }




quarta-feira, 9 de maio de 2012
Vamos criar uma
                                  simples aplicação!

quarta-feira, 9 de maio de 2012
CRUD

                                        Criar
                                      Recuperar
                                  Atualizar (Update)
                                  Remover (Delete)




quarta-feira, 9 de maio de 2012
Constraints
    class Usuario {

          String      username
          String      passwd
          String      nomeCompleto
          String      identidade

          static constraints = {

                 username(size:6..15, matches:"[a-zA-Z0-9]+", unique:true, blank:false, nullable:false)

                 passwd(size:6..100, matches:"[a-zA-Z0-9]+", blank:false, nullable:false, password:true)

                 nomeCompleto(size:1..50, blank:false, nullable:false)

                 identidade(size:1..20, blank:false, nullable:false, matches:"[0-9]+")

          }
    }

                       Ler documentação para ver todas as restrições!
quarta-feira, 9 de maio de 2012
Consultas ao BD
                                                                Table Album
                          class Album {
                               String title                     id     title    artist    release_date
                               String artist
                               Date releaseDate
                               static hasMany = [songs: Song]
                          }
                                                                 Table Song
                                         class Song {           id     title   duration    album_id
                                              String title
                                              Double duration
                                         }




                                                        Métodos default:

                                  •Album.count()
                                  •Album.get(1)
                                  •Song.list()
                                  •song.save()
                                  •song.delete()
                                  •...
quarta-feira, 9 de maio de 2012
Consultas ao BD
                                                                Table Album
                          class Album {
                               String title                     id     title    artist    release_date
                               String artist
                               Date releaseDate
                               static hasMany = [songs: Song]
                          }
                                                                 Table Song
                                    class Song {                id     title   duration    album_id
                                         String title
                                         Double duration
                                    }




                                                Buscas dinâmicas:

                                       •Song.findByTitle ("Parachutes")
                                       •Album.findByArtist ("Jotta A")
                                       •Song.findByDuration(3.24)


quarta-feira, 9 de maio de 2012
“Grails não é somente um
                                                       framework, mas uma
                                                  plataforma” (Graeme Rocher)




                                  Plugins permitem compor aplicações de
                                  forma rápida, sem muita configuração!




quarta-feira, 9 de maio de 2012
Mais de 750 plug-ins
                                                         (Sem contar as APIs de Java)




                      •       Testes: Functional-test, Fitness, Code coverage, etc.

                      •       Interfaces Robustas: Flex, GWT, RichUI, etc.

                      •       Segurança: Spring Security, Apache Shiro, OpenID, etc.

                      •       Integração: JasperReports, JMS, Google App Engine,
                              Facebook,Twitter, etc.



quarta-feira, 9 de maio de 2012
Material de Apoio

                 http://grails.org/doc/2.0.3/
                                          http://grails.org/Tutorials
                 http://grails.org/screencasts




quarta-feira, 9 de maio de 2012
Mundo perfeito!?
quarta-feira, 9 de maio de 2012
O que você precisa lembrar?


   Grails torna o desenvolvimento web simples,
     sem sacrificar a qualidade da aplicação!




quarta-feira, 9 de maio de 2012
Dúvidas ?




quarta-feira, 9 de maio de 2012
O “Santo Graal” do
                                  desenvolvimento Web!




                                              Natã Melo
                                   (nata.venancio.melo@gmail.com)
                                          Créditos: Diego Cavalcanti




quarta-feira, 9 de maio de 2012

Minicurso grails

  • 1.
    O “Santo Graal”do desenvolvimento Web! Natã Melo (nata.venancio.melo@gmail.com) Créditos: Diego Cavalcanti quarta-feira, 9 de maio de 2012
  • 2.
    quarta-feira, 9 demaio de 2012
  • 3.
  • 4.
    • Perda detempo para criar ambiente de desenvolvimento ... • ... e para configurar uma aplicação Olhando o passado quarta-feira, 9 de maio de 2012
  • 5.
    • Muitas tarefasrepetitivas executadas manualmente • Muito tempo para aprender tecnologias (Spring, Hibernate, JSF, etc) Olhando o passado quarta-feira, 9 de maio de 2012
  • 6.
    • Baixa produtividadeno desenvolvimento Web Olhando o passado quarta-feira, 9 de maio de 2012
  • 7.
  • 8.
    Temos solução para esses problemas? quarta-feira, 9 de maio de 2012
  • 9.
    Ruby on Rails CoC: Convention over Configuration DRY: Don’t Repeat Yourself quarta-feira, 9 de maio de 2012
  • 10.
    Ruby on Rails Stack Completo Expansibilidade quarta-feira, 9 de maio de 2012
  • 11.
    E por quenão Ruby on Rails? O investimento feito na equipe e nas ferramentas com Java não deve se perder! quarta-feira, 9 de maio de 2012
  • 12.
    Desenvolvimento Web <<Rápido e com qualidade>> quarta-feira, 9 de maio de 2012
  • 13.
    Framework baseado emMVC para desenvolvimento web com alta produtividade quarta-feira, 9 de maio de 2012
  • 14.
  • 15.
    quarta-feira, 9 demaio de 2012
  • 16.
    •Spring •Hibernate •Groovy •Java •SiteMesh •Jetty •Apache Ant quarta-feira, 9 de maio de 2012
  • 17.
    Integração simples como banco de dados Hibernate transparente para o programador + quarta-feira, 9 de maio de 2012
  • 18.
  • 19.
    Casos de sucesso Em 2007, eram 7 mil downloads por mês. Em 2008, passou para 70 mil! Mantém a média atualmente! quarta-feira, 9 de maio de 2012
  • 20.
    Casos de sucesso + 150 milhões de usuários quarta-feira, 9 de maio de 2012
  • 21.
    Casos de sucesso + 1 bilhão de páginas acessadas por mês quarta-feira, 9 de maio de 2012
  • 22.
    quarta-feira, 9 demaio de 2012
  • 23.
    Comunidade vibrante • http://grails.markmail.org/ • + de 200.000 mensagens • Em média 54 mensagens por dia quarta-feira, 9 de maio de 2012
  • 24.
    Pausa para alguns conceitos quarta-feira, 9 de maio de 2012
  • 25.
    Linguagem dinâmica eágil para JVM Java com esteróides Todo o poder de Java mas com recursos poderosos emprestados de outras linguagens Integração com objetos e bibliotecas Java quarta-feira, 9 de maio de 2012
  • 26.
    public class Minicurso{ private String titulo; public Minicurso (String titulo){ this.titulo = titulo; } public String getTitulo() { return titulo; } public void setTitulo(String titulo) { this.titulo = titulo; } public String getMensagem (){ return "Título do Minicurso: " + this.titulo; } } quarta-feira, 9 de maio de 2012
  • 27.
    public class Minicurso{ private String titulo; public Minicurso (String titulo){ this.titulo = titulo; } public String getTitulo() { return titulo; } public void setTitulo(String titulo) { this.titulo = titulo; } public String getMensagem (){ return "Título do Minicurso: " + this.titulo; } } quarta-feira, 9 de maio de 2012
  • 28.
  • 29.
    “Groovyficando” o código class Minicurso { def titulo def getMensagem (){ "Título do Minicurso: ${titulo}" } } miniCurso = new Minicurso (titulo = "Grails") miniCurso.getMessagem () quarta-feira, 9 de maio de 2012
  • 30.
    Mais facilidades... Null Checking if (obj != null) ... if (obj) ... quarta-feira, 9 de maio de 2012
  • 31.
    Mais facilidades... Null Checking Object obj = new Object (); String str = "Valor do objeto: " + obj == null ? "null" : obj.toString(); Object obj = new Object() String str = "Valor do objeto ${obj?.toString()}" quarta-feira, 9 de maio de 2012
  • 32.
    Mais facilidades... Mapas import java.util.HashMap; import java.util.Map; Map m = new HashMap(); m.put("br", "Brasil"); m.put("us", "USA"); m = [br:"Brasil", us:"USA"] quarta-feira, 9 de maio de 2012
  • 33.
    Mais facilidades... Looping for (int i = 0; i < list.size(); i++) { Object o = list.get(i); o.method(); } list.each(){ it.method() } quarta-feira, 9 de maio de 2012
  • 34.
    Mais facilidades... Looping for (i in 0..<10) { print i } quarta-feira, 9 de maio de 2012
  • 35.
    Mais facilidades... Return String getEdicao (num){ "Edicao: ${num} " } quarta-feira, 9 de maio de 2012
  • 36.
    E ainda temmuito mais! http://groovy.codehaus.org/User+Guide quarta-feira, 9 de maio de 2012
  • 37.
    http://www.springsource.com/ developer/stso http://netbeans.org/downloads/ index.html http://www.eclipse.org/ downloads/ quarta-feira, 9 de maio de 2012
  • 38.
    Mãos à obra quarta-feira,9 de maio de 2012
  • 39.
    Primeiros Passos Instalação • Download: http://grails.org/ Download • Descompactar a pasta • Configurar variável de ambiente GRAILS_HOME • Detalhes: http://grails.org/ Installation+Portuguese quarta-feira, 9 de maio de 2012
  • 40.
    Comandos básicos • grails create-app • grails create-domain-class • grails generate-all • grails install-plugin • grails run-app • grails war grails help quarta-feira, 9 de maio de 2012
  • 41.
    Estrutura de diretóriose convenções de nome quarta-feira, 9 de maio de 2012
  • 42.
    Você percebeu? • Nenhum arquivo XML de configuração • Nenhum arquivo de mapeamento • Nenhuma configuração de banco de dados • Nenhuma instalação de servidor de aplicação Tem muita mágica por baixo disso tudo! quarta-feira, 9 de maio de 2012
  • 43.
    Domain Class <<BD Simplificado>> Table Album class Album { String title id title artist release_date String artist Date releaseDate static hasMany = [songs: Song] } Table Song class Song { id title duration album_id String title Double duration } quarta-feira, 9 de maio de 2012
  • 44.
    Vamos criar uma simples aplicação! quarta-feira, 9 de maio de 2012
  • 45.
    CRUD Criar Recuperar Atualizar (Update) Remover (Delete) quarta-feira, 9 de maio de 2012
  • 46.
    Constraints class Usuario { String username String passwd String nomeCompleto String identidade static constraints = { username(size:6..15, matches:"[a-zA-Z0-9]+", unique:true, blank:false, nullable:false) passwd(size:6..100, matches:"[a-zA-Z0-9]+", blank:false, nullable:false, password:true) nomeCompleto(size:1..50, blank:false, nullable:false) identidade(size:1..20, blank:false, nullable:false, matches:"[0-9]+") } } Ler documentação para ver todas as restrições! quarta-feira, 9 de maio de 2012
  • 47.
    Consultas ao BD Table Album class Album { String title id title artist release_date String artist Date releaseDate static hasMany = [songs: Song] } Table Song class Song { id title duration album_id String title Double duration } Métodos default: •Album.count() •Album.get(1) •Song.list() •song.save() •song.delete() •... quarta-feira, 9 de maio de 2012
  • 48.
    Consultas ao BD Table Album class Album { String title id title artist release_date String artist Date releaseDate static hasMany = [songs: Song] } Table Song class Song { id title duration album_id String title Double duration } Buscas dinâmicas: •Song.findByTitle ("Parachutes") •Album.findByArtist ("Jotta A") •Song.findByDuration(3.24) quarta-feira, 9 de maio de 2012
  • 49.
    “Grails não ésomente um framework, mas uma plataforma” (Graeme Rocher) Plugins permitem compor aplicações de forma rápida, sem muita configuração! quarta-feira, 9 de maio de 2012
  • 50.
    Mais de 750plug-ins (Sem contar as APIs de Java) • Testes: Functional-test, Fitness, Code coverage, etc. • Interfaces Robustas: Flex, GWT, RichUI, etc. • Segurança: Spring Security, Apache Shiro, OpenID, etc. • Integração: JasperReports, JMS, Google App Engine, Facebook,Twitter, etc. quarta-feira, 9 de maio de 2012
  • 51.
    Material de Apoio http://grails.org/doc/2.0.3/ http://grails.org/Tutorials http://grails.org/screencasts quarta-feira, 9 de maio de 2012
  • 52.
  • 53.
    O que vocêprecisa lembrar? Grails torna o desenvolvimento web simples, sem sacrificar a qualidade da aplicação! quarta-feira, 9 de maio de 2012
  • 54.
  • 55.
    O “Santo Graal”do desenvolvimento Web! Natã Melo (nata.venancio.melo@gmail.com) Créditos: Diego Cavalcanti quarta-feira, 9 de maio de 2012