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.