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-uploa...
- 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 {

	   privat...
import java.util.List;
import java.util.ArrayList;

class Seletor {

	   private List selecionaMenoresQue(List palavras, i...
regra dos 80 - 20



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

class Seletor {

	   private List selecionaMenoresQue(List palavras, i...
class Seletor {

	   private List selecionaMenoresQue(List palavras, int tamanho) {
	   	    List resultado = new ArrayLis...
class Seletor {

	   private List selecionaMenoresQue(List palavras, int tamanho) {
	   	    List resultado = new ArrayLis...
def selecionaMenoresQue(palavras, tamanho) {
	    def resultado = new ArrayList()
	    palavras.each { pal ->
	    	    if...
def selecionaMenoresQue(palavras, tamanho) {
	    def resultado = new ArrayList()
	    palavras.each { pal ->
	    	    if...
def selecionaMenoresQue(palavras, tamanho) {
	    def resultado = []
	    palavras.each { pal ->
	    	    if (pal.size() ...
def selecionaMenoresQue(palavras, tamanho) {
	    def resultado = []
	    palavras.each { pal ->
	    	    if (pal.size() ...
def selecionaMenoresQue(palavras, tamanho) {
	    palavras.findAll { it.size() <= tamanho }
}

def linguagens = ["Java","S...
def selecionaMenoresQue(palavras, tamanho) {
	    palavras.findAll { it.size() <= tamanho }
}

def linguagens = ["Java","S...
def linguagens = ["Java","Scala","Groovy","Ruby"]
def selecionadas = linguagens.findAll { it.size() <= 5 }
println "Total ...
Seletor.groovy




def linguagens = ["Java","Scala","Groovy","Ruby"]
def selecionadas = linguagens.findAll { it.size() <= ...
Seletor.groovy




def linguagens = ["Java","Scala","Groovy","Ruby"]
def selecionadas = linguagens.findAll { it.size() <= ...
import java.util.List;
import java.util.ArrayList;                                Seletor.java
class Seletor {

	   privat...
Groovy é Java!



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

	   privat...
import java.util.List;
import java.util.ArrayList;                                Seletor.groovy
class Seletor {

	   priv...
Groovy é melhor
   que Java!


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

	   privat...
Seletor.groovy




def linguagens = ["Java","Scala","Groovy","Ruby"]
def selecionadas = linguagens.findAll { it.size() <= ...
“When you program in groovy, in
many ways you're writing a special
          kind of java”


                        (Dier...
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



 ...
- Desenvolvimento rápido

   - Full stack

   - Fácil bootstrap

   - Convenções - CoC

   - Scaffolding

   - Plugins

  ...
- Desenvolvimento rápido

   - Full stack

   - Fácil bootstrap

   - Convenções - CoC

   - Scaffolding

   - Plugins

  ...
Full Stack
- mapeamento or - gorm

- log
- url rewrites

- view e decoration
- controladores

- controle transacional
- co...
Mapeamento OR - gorm




         47            @lucastex
Mapeamento OR - gorm




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




                            48    ...
Mapeamento OR - gorm




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

                     Pessoa.get(1234)...
Mapeamento OR - gorm



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

                     Pessoa.get(1234)
...
Mapeamento OR - gorm


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

                              Pess...
Mapeamento OR - gorm


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

                              Pess...
Mapeamento OR - gorm

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

                              Pesso...
- Desenvolvimento rápido

   - Full stack

   - Fácil bootstrap

   - Convenções - CoC

   - Scaffolding

   - Plugins

  ...
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 (tabe...
- Desenvolvimento rápido

   - Full stack

   - Fácil bootstrap

   - Convenções - CoC

   - Scaffolding

   - Plugins

  ...
CoC - Classes de domínio


    class Pessoa   {
          String   nome
          String   telefone
          String   ema...
CoC - Classes de domínio
    class Pessoa   {
          String   nome
          String   telefone
          String   email...
CoC - Controllers
 class PessoaController {

     def criar = {

         def pessoa = new Pessoa(params)
         pessoa....
CoC - Controllers
 class PessoaController {

     def criar = {

         def pessoa = new Pessoa(params)
         pessoa....
CoC - Controllers
   class PessoaController {

        def criar = {

            def pessoa = new Pessoa(params)
        ...
- Desenvolvimento rápido

   - Full stack

   - Fácil bootstrap

   - Convenções - CoC

   - Scaffolding

   - Plugins

  ...
Scaffolding

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

- Integridade relacional e dos tipos
- V...
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            @lucast...
Validação




    72      @lucastex
- Desenvolvimento rápido

   - Full stack

   - Fácil bootstrap

   - Convenções - CoC

   - Scaffolding

   - Plugins

  ...
Plugins

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

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


...
Plugins
- 500+ plugins atualmente

- segurança

- manipulação de imagens

- cms / blog

- quartz (agendamento)

- ui

- lu...
Plugins
- mail

- gwt

- feed / rss

- geração de diagramas de classe

- gráficos

- jquery

- auditoria
                 ...
Plugins
- performance

- behaviour

   - taggable

   - featurable

   - rateable

   - attachmentable

   - commentable
 ...
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        @lucas...
Comunidade



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

-   gr8forums.org (en)

-   grailsbrasil.com (pt)

-   springsource.com

-   groovy.c...
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
            @luc...
Upcoming SlideShare
Loading in …5
×

Grails: Java produtivo e divertido

7,463 views

Published on

Palestra apresentada sobre Groovy e Grails no SESTINFO, da Universidade Metodista do Estado de São Paulo.

Published in: Technology
0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,463
On SlideShare
0
From Embeds
0
Number of Embeds
3,899
Actions
Shares
0
Downloads
4
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

  • - 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

  • - groovy, grails, gaelyk, gradle, gant, gmaven

  • agenda da palestra
  • 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
  • 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.
  • 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;?
  • MACACO DE CODIGO! Falar do &amp;#x201C;Teorema do macaco infinito&amp;#x201D;
  • &amp;#xE9; isso que eu quero, pensar.
    e &amp;#xE9; isso que groovy nos deixa fazer, codificar menos pra poder pensar mais
    Exemplo disso:
  • 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
  • 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;
  • 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
  • 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;
  • resultado
  • 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
  • resultado
  • 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?
  • resultado
  • 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.
  • resultado
  • AMARELO - M&amp;#xE9;todo pra que? Se eu tenho uma instru&amp;#xE7;&amp;#xE3;o apenas para executar?
  • resultado
  • Este &amp;#xE9; o nosso Seletor.groovy. Quanto de c&amp;#xF3;digo tem aqui? Quanto de linguagem tem?
  • &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
  • 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....
  • porque groovy &amp;#xE9; java.

  • 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;
  • perguntar... &amp;#x201C;groovy &amp;#xE9; java?&amp;#x201D; e dizer... &amp;#x201C;n&amp;#xE3;o!!&amp;#x201D;
    passar o slide
  • &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?
  • falar que groovy &amp;#xE9; legal, mas como adotar?
    que infra estrutura a gente precisa pra usar groovy?


  • trazendo a faciidade do groovy para o ambiente web
    exemplo de criando aplicacao &amp;#x2018;standard&amp;#x2019; em java....
  • cenario comum nas empresas para a cria&amp;#xE7;&amp;#xE3;o de uma aplica&amp;#xE7;&amp;#xE3;o






  • 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?
  • 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;
  • e &amp;#xE9; isso que o grails nos traz.

  • full stack, &amp;#xE9; a estrutura completa para o desenvolvimento
    nao da pra falar de tudo, apenas de mapeamento or (GORM)








  • mostrar no proximo slide o resultado

  • nesse slide j&amp;#xE1; iniciar falando de CoC

  • 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.
  • d&amp;#xE1; poder sem tirar a liberdade de configurar do melhor jeito







  • alem disso, tem o controller com os metodos gerados


  • falar dos templates


  • 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



  • qual &amp;#xE9; o segredo? na minha opiniao
  • nao s&amp;#xF3; framework, mas a empresa




  • em &amp;#x201C;java/jvm&amp;#x201D; falar da integracao com tudo que j&amp;#xE1; existe, qq jar no lib e ponto


  • michael apoia muito a divulgacao do groovy e grails por isso que deu os coupons
  • 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



  • Grails: Java produtivo e divertido

    1. 1. Grails Java produtivo e divertido 1 @lucastex
    2. 2. Lucas Teixeira lucastex.com.br lucastex.com @lucastex 2 @lucastex
    3. 3. gr8forums.org 3 @lucastex
    4. 4. github.com/lucastex gsolr grails-stella grails-correios-br grails-featurable grails-file-uploader grails-tinyurl 4 @lucastex
    5. 5. - Groovy - Grails - Comunidade - Demo 5 @lucastex
    6. 6. Groovy 6 @lucastex
    7. 7. O que te motiva? 7 @lucastex
    8. 8. Pensar a maior parte do tempo 8 @lucastex
    9. 9. 9 @lucastex
    10. 10. Pensar 10 @lucastex
    11. 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. 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. 13. regra dos 80 - 20 13 @lucastex
    14. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 27. Groovy é Java! 27 @lucastex
    28. 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. 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. 30. Groovy é melhor que Java! 30 @lucastex
    31. 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. 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. 33. “When you program in groovy, in many ways you're writing a special kind of java” (Dierk König) 33 @lucastex
    34. 34. Grails 34 @lucastex
    35. 35. cenário comum 35 @lucastex
    36. 36. - Spring 36 @lucastex
    37. 37. - Spring - Hibernate 37 @lucastex
    38. 38. - Spring - Hibernate - JSF 38 @lucastex
    39. 39. - Spring - Hibernate - JSF - DWR 39 @lucastex
    40. 40. - Spring - Hibernate - JSF - DWR - Velocity 40 @lucastex
    41. 41. - Spring - Hibernate - JSF - DWR - Velocity - Tuckey 41 @lucastex
    42. 42. 42 @lucastex
    43. 43. Que você é incompetente Que você é mentiroso Que colocar todos os frameworks juntos toma tempo e pode gerar problemas 43 @lucastex
    44. 44. - Desenvolvimento rápido - Full stack - Fácil bootstrap - Convenções - CoC - Scaffolding - Plugins 44 @lucastex
    45. 45. - Desenvolvimento rápido - Full stack - Fácil bootstrap - Convenções - CoC - Scaffolding - Plugins 45 @lucastex
    46. 46. Full Stack - mapeamento or - gorm - log - url rewrites - view e decoration - controladores - controle transacional - configuração por ambiente 46 @lucastex
    47. 47. Mapeamento OR - gorm 47 @lucastex
    48. 48. Mapeamento OR - gorm Pessoa.findAllByNomeLikeAndIdadeGreaterThan(“%lucas%”, 25) 48 @lucastex
    49. 49. Mapeamento OR - gorm Pessoa.findAllByNomeLikeAndIdadeGreaterThan(“%lucas%”, 25) Pessoa.get(1234) 49 @lucastex
    50. 50. Mapeamento OR - gorm Pessoa.findAllByNomeLikeAndIdadeGreaterThan(“%lucas%”, 25) Pessoa.get(1234) Date dateCreated Date lastUpdated 50 @lucastex
    51. 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. 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. 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. 54. - Desenvolvimento rápido - Full stack - Fácil bootstrap - Convenções - CoC - Scaffolding - Plugins 54 @lucastex
    55. 55. Fácil bootstrap ‣ grails create-app umesp ‣ grails run-app 55 @lucastex
    56. 56. 56 @lucastex
    57. 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. 58. - Desenvolvimento rápido - Full stack - Fácil bootstrap - Convenções - CoC - Scaffolding - Plugins 58 @lucastex
    59. 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. 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. 61. CoC - Controllers class PessoaController { def criar = { def pessoa = new Pessoa(params) pessoa.save() } } 61 @lucastex
    62. 62. CoC - Controllers class PessoaController { def criar = { def pessoa = new Pessoa(params) pessoa.save() } } http://localhost:8080/app/pessoa/criar 62 @lucastex
    63. 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. 64. - Desenvolvimento rápido - Full stack - Fácil bootstrap - Convenções - CoC - Scaffolding - Plugins 64 @lucastex
    65. 65. Scaffolding - Prototipação das Domain Classes - Estático / Dinâmico (templates) - Integridade relacional e dos tipos - Validação 65 @lucastex
    66. 66. Scaffolding 66 @lucastex
    67. 67. Scaffolding 67 @lucastex
    68. 68. Scaffolding 68 @lucastex
    69. 69. Scaffolding estático ‣ grails generate-all Pessoa 69 @lucastex
    70. 70. Scaffolding estático ‣ grails generate-all Pessoa 70 @lucastex
    71. 71. Scaffolding dinâmico class PessoaController { def scaffold = true } 71 @lucastex
    72. 72. Validação 72 @lucastex
    73. 73. - Desenvolvimento rápido - Full stack - Fácil bootstrap - Convenções - CoC - Scaffolding - Plugins 73 @lucastex
    74. 74. Plugins - fácil extensão - modularização de aplicações - adição de métodos / comportamento - gerenciamento automático 74 @lucastex
    75. 75. Plugins - 500+ plugins atualmente - segurança - manipulação de imagens - cms / blog - quartz (agendamento) - ui - lucene 75 @lucastex
    76. 76. Plugins - mail - gwt - feed / rss - geração de diagramas de classe - gráficos - jquery - auditoria 76 @lucastex
    77. 77. Plugins - performance - behaviour - taggable - featurable - rateable - attachmentable - commentable 77 @lucastex
    78. 78. segredo? 78 @lucastex
    79. 79. Rock solid foundations - Spring 79 @lucastex
    80. 80. Rock solid foundations - Spring - Hibernate 80 @lucastex
    81. 81. Rock solid foundations - Spring - Hibernate - Sitemesh 81 @lucastex
    82. 82. Rock solid foundations - Spring - Hibernate - Sitemesh - Log4J 82 @lucastex
    83. 83. Rock solid foundations - Spring - Hibernate - Sitemesh - Log4J - Plugins 83 @lucastex
    84. 84. Rock solid foundations - Spring - Hibernate - Sitemesh - Log4J - Plugins - JAVA / JVM 84 @lucastex
    85. 85. Comunidade 85 @lucastex
    86. 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. 87. GroovyMag.com 87 @lucastex
    88. 88. brasilitfree brasilit10 88 @lucastex
    89. 89. Dúvidas? 89 @lucastex
    90. 90. Demo! 90 @lucastex
    91. 91. Grails Java produtivo e divertido Lucas Teixeira lucastex.com.br lucastex.com @lucastex @lucastex

    ×