GRAILS
Bruno Gama Catão
Pai em tempo integral
Professor da Facisa
  Sistemas de Informação
  Jogos Digitais
Coordenador do LTI
Tento levar alguns projetos open source:
  github.com/brunogamacatao
grails.org
O que é ?

• Tecnologia para construção RÁPIDA e
  FÁCIL de aplicações para a Internet
  (web)
GRAILS = GROOVY + RAILS
GROOVY ?
  Groovy




   Java
Código Java
public class AloMundo {
	 private String nome;
	
	 public String getNome() {
	 	 return nome;
	 }
	
	 public void setNome(String nome) {
	 	 this.nome = nome;
	 }
	
	 public String saudacao() {
	 	 return "Oi " + nome;
	 }
	
	 public static void main(String[] args) {
	 	 AloMundo alo = new AloMundo();
	 	 alo.setNome("Fulano");
	 	 System.out.println(alo.saudacao());
	 }
}
Código Groovy
public class AloMundo {
	 private String nome;
	
	 public String getNome() {
	 	 return nome;
	 }
	
	 public void setNome(String nome) {
	 	 this.nome = nome;
	 }
	
	 public String saudacao() {
	 	 return "Oi " + nome;
	 }
	
	 public static void main(String[] args) {
	 	 AloMundo alo = new AloMundo();
	 	 alo.setNome("Fulano");
	 	 System.out.println(alo.saudacao());
	 }
}
É a mesma coisa ?!
 ... então, qual a
vantagem disso ?
Código Groovy
                 class AloMundo {
                 	 private String nome
                                                 Pra quê ;
                 	
                 	 String getNome() {
                                                           ?
                 	 	 return nome
                 	 }
                 	
                 	 void setNome(String nome) {
                 	 	 this.nome = nome

 To das as       	 }
                 	
 classes e       	 String saudacao() {
            o
mé todos sã      	 	 return "Oi " + nome
             é   	 }
pú blicos at     	

 que  prove o    	 static void main(String[] args) {

      trário !
                 	 	 AloMundo alo = new AloMundo()
  con            	 	 alo.setNome("Fulano")
                 	 	 System.out.println(alo.saudacao())
                 	 }
                 }
Código Groovy

                      class AloMundo {
                      	 String nome
                      	
                      	 String saudacao() {
                      	 	 return "Oi " + nome
                      	 }
                      	
                      	 static void main(String[] args) {
                      	 	 AloMundo alo = new AloMundo()
                      	 	 alo.setNome("Fulano")

Atribut os já tem     	 	 System.out.println(alo.saudacao())

     et e set
                      	 }
    g                 }
   au tomático
                  )
 (prop  riedades
Código Groovy
                                                     Ao invés
                                                System.o        de
                     class AloMundo {                    ut.println
                     	 def nome                   apenas p           use
                     	                                      rintln ;)
                     	 def saudacao() {
                     	 	 return "Oi " + nome
                     	 }
                     	
                     	 static main(args) {
                     	 	 def alo = new AloMundo()
                     	 	 alo.setNome("Fulano")

 Lin  guagens        	 	 println(alo.saudacao())

      r temente
                     	 }
   fo                }

 tipad    as estão
fora de     moda !
Código Groovy
                                              Versão fi
                     class AloMundo {
                                                      nal !
                     	 def nome
                     	
         e forma
Olha qu
                     	 def saudacao() {

         construir
                     	 	 return "Oi ${nome}"
legal de             	 }

     Strings !       	
                     	 static main(args) {
                     	 	 def alo = new AloMundo()
                     	 	 alo.nome = "Fulano"
                     	 	 println alo.saudacao()      Não precisa
                     	 }
                     }                              chamar get/set
• Resultado:

 • 21 linhas Java contra 13 linhas Groovy

 • Limpamos o lixo do código !
Java - Lendo um Arquivo
import   java.io.BufferedReader;
import   java.io.FileNotFoundException;
import   java.io.FileReader;
import   java.io.IOException;



public class LeArquivo {
	 public static void main(String[] args) {
	 	 try {
	 	 	 BufferedReader arquivo = new BufferedReader(new FileReader("/etc/passwd"));
	 	 	 String line = null;
	 	 	 while ((line = arquivo.readLine()) != null) {
	 	 	 	 System.out.println(line);
	 	 	 }
	 	 	 arquivo.close();
	 	 } catch (FileNotFoundException ex) {
	 	 	 ex.printStackTrace();
	 	 } catch (IOException ex) {
	 	 	 ex.printStackTrace();
	 	 }
	 }
}
Groovy - Lendo um Arquivo
                                                    Tá quase
                                                             bom ...

             class LeArquivo {
             	 static main(args) {
             	 	 new File("/etc/passwd").eachLine({line ->
             	 	 	 println(line)
             	 	 })
             	 }
             }



           p assar um
  Podemos        closure,
         código,
bloco de             !
            râmetro
    como pa
Groovy - Lendo um Arquivo
                        e la só tem            Versão fi
               asse, se
Pra quê uma cl                                         nal !
                  o main ?
       u m métod



new File("/etc/passwd").eachLine {line -> println line}


                                      Pense bem ... ne
                                                        m todos os
                                      parêntesis são n
                                                       ecessários !
Entendendo Melhor Groovy
Variáveis

def nomeDaVariavel = valorDaVariavel


Ex:
def idade = 28
def nome = “Bruno”
Strings 1/2

def nome = 'José da Silva'
def cidade = "Campina Grande"
def texto = '''Oi,
como vai você ?
Tudo bem ?'''
def expr = /Contra-barras são bem vindas !/
Strings 2/2
     • GStrings (Groovy Strings) podem ser
       construídos de duas formas:
       • Concatenação: +
       • Expressões: ${expressão}

def primeiroNome = 'José'
def ultimoNome   = 'Silva'
def nomeCompleto = primeiroNome + ' ' + ultimoNome

//Expressões devem vir em Strings com aspas duplas !
def nomeCompleto = "${primeiroNome} ${ultimoNome}"
Listas
def listaVazia = []
def frutas = ['Banana', 'Maçã']
frutas << 'Abacate'


print listaVazia.size() // 0
print frutas[2] // Maçã


//O trecho abaixo dá no mesmo ...
def nomes = new ArrayList()
nomes.add('Bruno')
//Porém não é muito Groovy
Maps

def mapaVazio = [:]
def preco = [cocaCola: 2.00, coxinha: 2.50]


print preco[pipoca] // 0.50


preco[guarana: 1.50]
Métodos
def saudacao(nome) {
    print "Oi ${nome}, como vai você ?"
}


def soma(a, b) {
    a + b // Não precisa do return
}
Closures 1/3

• É um novo tipo de dado;
• Representa um trecho de código;
• Pode ser passado como argumento em
  métodos e armazenado em variáveis.
Closures 2/3
def saudacao = {print "Oi, como vai?"}
saudacao() // "Oi como vai?"


// Parâmetro implícito: it
def saudacao2 = {
    print "Oi ${it} como vai?"
}
saudacao("Bruno") // "Oi Bruno como vai?"


def soma = { a, b ->
    a + b // Lembrem-se, não precisa do return
}
soma(2, 3) // 5
Closures 3/3
def executaOperacao(a, b, operacao) {
    operacao(a, b)
}


def multiplicacao = {a, b -> a * b}
def subtracao = {a, b => a - b}


executaOperacao(5, 2, multiplicacao) // 10
executaOperacao(5, 2, subtracao) // 3
Novos Operadores
• Spread: *.
• Elvis: ?:
• Safe navigation: ?.
• Contém: in
• Conversão: as
• Identidade: is
E o Grails ?
TODO o Código de uma Aplicação
            Web
                                               gera as
       Contato.groovy            Est e código
                                               anco de
       class Contato {           tab elas do b
                                               sultas, e
       	 String nome              da  dos, con
                                      página s em 13
       	 String telefone
                                         idiomas !
       }

      ContatoController.groovy

       class ContatoController {
           def scaffold = Contato
       }
Isso é bom ?
Vantagens

• Mais fácil de manter
• Mais fácil de testar
• Resultados rápidos
• Aumenta a diversão
E a infra-estrutura ?
Tudo é Java
• Você só está digitando menos !
• Tudo vai para um arquivo WAR
• Base sólida:
 • JPA (Hibernate)
 • Spring
 • Sitemesh ...
ALGUNS CONCEITOS
• Convenção ao invés de codificação

• Scaffolding (andaime)

• Templates

• Boas ferramentas
MÃO NA MASSA !!!

Introdução ao Framework Grails

  • 1.
  • 2.
    Bruno Gama Catão Paiem tempo integral Professor da Facisa Sistemas de Informação Jogos Digitais Coordenador do LTI Tento levar alguns projetos open source: github.com/brunogamacatao
  • 3.
  • 4.
    O que é? • Tecnologia para construção RÁPIDA e FÁCIL de aplicações para a Internet (web)
  • 5.
  • 6.
    GROOVY ? Groovy Java
  • 7.
    Código Java public classAloMundo { private String nome; public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String saudacao() { return "Oi " + nome; } public static void main(String[] args) { AloMundo alo = new AloMundo(); alo.setNome("Fulano"); System.out.println(alo.saudacao()); } }
  • 8.
    Código Groovy public classAloMundo { private String nome; public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String saudacao() { return "Oi " + nome; } public static void main(String[] args) { AloMundo alo = new AloMundo(); alo.setNome("Fulano"); System.out.println(alo.saudacao()); } }
  • 9.
    É a mesmacoisa ?! ... então, qual a vantagem disso ?
  • 10.
    Código Groovy class AloMundo { private String nome Pra quê ; String getNome() { ? return nome } void setNome(String nome) { this.nome = nome To das as } classes e String saudacao() { o mé todos sã return "Oi " + nome é } pú blicos at que prove o static void main(String[] args) { trário ! AloMundo alo = new AloMundo() con alo.setNome("Fulano") System.out.println(alo.saudacao()) } }
  • 11.
    Código Groovy class AloMundo { String nome String saudacao() { return "Oi " + nome } static void main(String[] args) { AloMundo alo = new AloMundo() alo.setNome("Fulano") Atribut os já tem System.out.println(alo.saudacao()) et e set } g } au tomático ) (prop riedades
  • 12.
    Código Groovy Ao invés System.o de class AloMundo { ut.println def nome apenas p use rintln ;) def saudacao() { return "Oi " + nome } static main(args) { def alo = new AloMundo() alo.setNome("Fulano") Lin guagens println(alo.saudacao()) r temente } fo } tipad as estão fora de moda !
  • 13.
    Código Groovy Versão fi class AloMundo { nal ! def nome e forma Olha qu def saudacao() { construir return "Oi ${nome}" legal de } Strings ! static main(args) { def alo = new AloMundo() alo.nome = "Fulano" println alo.saudacao() Não precisa } } chamar get/set
  • 14.
    • Resultado: •21 linhas Java contra 13 linhas Groovy • Limpamos o lixo do código !
  • 15.
    Java - Lendoum Arquivo import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class LeArquivo { public static void main(String[] args) { try { BufferedReader arquivo = new BufferedReader(new FileReader("/etc/passwd")); String line = null; while ((line = arquivo.readLine()) != null) { System.out.println(line); } arquivo.close(); } catch (FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } } }
  • 16.
    Groovy - Lendoum Arquivo Tá quase bom ... class LeArquivo { static main(args) { new File("/etc/passwd").eachLine({line -> println(line) }) } } p assar um Podemos closure, código, bloco de ! râmetro como pa
  • 17.
    Groovy - Lendoum Arquivo e la só tem Versão fi asse, se Pra quê uma cl nal ! o main ? u m métod new File("/etc/passwd").eachLine {line -> println line} Pense bem ... ne m todos os parêntesis são n ecessários !
  • 18.
  • 19.
    Variáveis def nomeDaVariavel =valorDaVariavel Ex: def idade = 28 def nome = “Bruno”
  • 20.
    Strings 1/2 def nome= 'José da Silva' def cidade = "Campina Grande" def texto = '''Oi, como vai você ? Tudo bem ?''' def expr = /Contra-barras são bem vindas !/
  • 21.
    Strings 2/2 • GStrings (Groovy Strings) podem ser construídos de duas formas: • Concatenação: + • Expressões: ${expressão} def primeiroNome = 'José' def ultimoNome = 'Silva' def nomeCompleto = primeiroNome + ' ' + ultimoNome //Expressões devem vir em Strings com aspas duplas ! def nomeCompleto = "${primeiroNome} ${ultimoNome}"
  • 22.
    Listas def listaVazia =[] def frutas = ['Banana', 'Maçã'] frutas << 'Abacate' print listaVazia.size() // 0 print frutas[2] // Maçã //O trecho abaixo dá no mesmo ... def nomes = new ArrayList() nomes.add('Bruno') //Porém não é muito Groovy
  • 23.
    Maps def mapaVazio =[:] def preco = [cocaCola: 2.00, coxinha: 2.50] print preco[pipoca] // 0.50 preco[guarana: 1.50]
  • 24.
    Métodos def saudacao(nome) { print "Oi ${nome}, como vai você ?" } def soma(a, b) { a + b // Não precisa do return }
  • 25.
    Closures 1/3 • Éum novo tipo de dado; • Representa um trecho de código; • Pode ser passado como argumento em métodos e armazenado em variáveis.
  • 26.
    Closures 2/3 def saudacao= {print "Oi, como vai?"} saudacao() // "Oi como vai?" // Parâmetro implícito: it def saudacao2 = { print "Oi ${it} como vai?" } saudacao("Bruno") // "Oi Bruno como vai?" def soma = { a, b -> a + b // Lembrem-se, não precisa do return } soma(2, 3) // 5
  • 27.
    Closures 3/3 def executaOperacao(a,b, operacao) { operacao(a, b) } def multiplicacao = {a, b -> a * b} def subtracao = {a, b => a - b} executaOperacao(5, 2, multiplicacao) // 10 executaOperacao(5, 2, subtracao) // 3
  • 28.
    Novos Operadores • Spread:*. • Elvis: ?: • Safe navigation: ?. • Contém: in • Conversão: as • Identidade: is
  • 29.
  • 30.
    TODO o Códigode uma Aplicação Web gera as Contato.groovy Est e código anco de class Contato { tab elas do b sultas, e String nome da dos, con página s em 13 String telefone idiomas ! } ContatoController.groovy class ContatoController { def scaffold = Contato }
  • 31.
  • 32.
    Vantagens • Mais fácilde manter • Mais fácil de testar • Resultados rápidos • Aumenta a diversão
  • 33.
  • 34.
    Tudo é Java •Você só está digitando menos ! • Tudo vai para um arquivo WAR • Base sólida: • JPA (Hibernate) • Spring • Sitemesh ...
  • 35.
  • 36.
    • Convenção aoinvés de codificação • Scaffolding (andaime) • Templates • Boas ferramentas
  • 37.