Your SlideShare is downloading. ×
Grails: Java produtivo e divertido
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Grails: Java produtivo e divertido

7,102
views

Published on

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

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,102
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
4
Comments
0
Likes
8
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

  • - Apresentação pessoal
    - Apresentaçã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 -> 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á vontade de programar mais, quando você acaba de programar?
    Exemplos de Servlet -> Struts1 e Struts1 -> Webwork.
  • pensar no problema que você tem que resolver e não em como usar uma ferramenta para resolver o problema. PROGRAMAR = PENSAR + CODIFICAR.
    se voce nao pensa, o que você é?
  • MACACO DE CODIGO! Falar do “Teorema do macaco infinito”
  • é isso que eu quero, pensar.
    e é isso que groovy nos deixa fazer, codificar menos pra poder pensar mais
    Exemplo disso:
  • SCRIPT -> 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ódigo, e mostrar que é uma classe java
  • destaque = valor do código, lógica (o que tivemos que pensar)
    branco = linguagem, estrutura, ‘perda de tempo’
  • groovy vem tentar balancear esta equação, tirando o máximo destes 80.
    vou agora mostrar as facilidades e os “atalhos” 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ção de listas, no java 5 já tem foreach, mas acredite, dá pra fazer melhor.
    Vermelho - Ponto e vírgula - “PRA QUÊ?”
  • resultado
  • Rosa - Consistência. Método que faz a ‘mesma’ coisa, com nome diferente.
    Vermelho - Eu quero um script. Por que definir classe? Pra que explicitar o código a ser executado?
    Amarelho - Território ‘controverso’, tipagem dinâmica
  • resultado
  • VERDE - return? PRA QUE? eu devolvo o que eu tenho na mã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é?
    AMARELO - Lista? Nada mais simples?
    VERMELHO - Concatenação de strings? O que é pior, usar o + ou o .concat?
    AZUL - Imprimir, é isso que eu quero, só isso, IMPRIMIR (println é um método da classe PrintStream, que é o out, uma referencia statica dentro da classe System), tá, e ai?
  • resultado
  • VERDE - Parenteses. eu nao falo “INICIO” “OI TUDO BEM?” “FIM” quando converso.
    AZUL - Facilidade pra trabalhar com listas. Afinal, quase sempre que você itera uma lista, é pra fazer alguma coisa com seu conteúdo. Filtrar, calcular, etc.
  • resultado
  • AMARELO - Método pra que? Se eu tenho uma instrução apenas para executar?
  • resultado
  • Este é o nosso Seletor.groovy. Quanto de código tem aqui? Quanto de linguagem tem?
  • “esse eh o seletor.groovy”
    Amarelo = quanto precisei pensar.
    branco, quanto precisei escrever pro programa entender o meu objetivo
    Comparação com prox slide a quantidade de instrucoes do programa
  • esse eh o seletor.java. falar que groovy é legal, mas como adotar?
    que infra estrutura a gente precisa pra usar groovy? servidor? outra JVM? o que?
    groovy é apenas um jar dentro da JVM....
  • porque groovy é java.

  • comparar os 2, dizer que um é outro, e por isso que groovy é java
    perguntar... “groovy é java?”
  • perguntar... “groovy é java?” e dizer... “não!!”
    passar o slide
  • é melhor. porque me deixa pensar no que resolver.
    e o que eu tinha que resolver no programa? quanto dele é a resolução do meu problema, e quanto dele é linguagem de programação?
  • falar que groovy é 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 ‘standard’ em java....
  • cenario comum nas empresas para a criação de uma aplicação






  • Bem vindo ao inferno
    configuracao da aplicação como um todo, pra poder começar a colocar ló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 é um dos problemas que grails resolve,
    traz o desenvolvimento “rápido”. não é ‘agil’, é ‘rápido’
  • e é isso que o grails nos traz.

  • full stack, é 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á 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ão Conv. INSTEAD of Conf.
  • dá poder sem tirar a liberdade de configurar do melhor jeito







  • alem disso, tem o controller com os metodos gerados


  • falar dos templates


  • falar que é 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 é o segredo? na minha opiniao
  • nao só framework, mas a empresa




  • em “java/jvm” falar da integracao com tudo que já 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ça - qualquer edição
    brasilit10 - 10% em qq compra, seja de uma edicao, varias ou assinatura



  • Transcript

    • 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