Your SlideShare is downloading. ×
0
Grails  Josino Rodrigues Netojosino.neto@rise.com.br
Um pouco do queveremos!!!!!!Hands On Grails
Agora vou mostraro caminho!!!
Novas Idéias
Antiga tecnologias
Antigas Tecnologias
Arquitetura de plugins
E agora? O que fazer?
Go to Promptgrails create-app PrimeiraAppcd PrimeiraAppgrails create-domain-class Participantegrails create-controller pri...
Estruturas de pastas do         Grails
So, lets go
Altere a classe de domíniopackage primeiraappclass Participante {     String nome     String login     String senha     St...
Altere a classe controllerpackage primeiraappclass ParticipanteController {     static scaffold = true}
Go to Promptgrails cleangrails run-app
Scaffolding    • Gera views    • Gera classes de      Controller    • Tudo automagicamente
Hora depensar nasclasses dedomínio
Mas antes ...
Groovy???Groovy é uma linguagem ágil dinâmicapara a plataforma java com muitasfuncionalidades inspiradas de linguagenscomo...
Mapeando Groovy
Olha a diferença 
Groovy Beans• Métodos públicos por padrão• Métodos de acesso por padrão• Acesso simplificado a atributos de Beans
Groovy Beansclass Car {    String name}def car = new Car()car.setNome(Civic)car.getNome()car.nome
GStringdef nick = Ginadef book = Groovy in Actiondef isEquals = "$nick is $book" == Gina is     Groovy in Action
Tudo é Objeto
Númerosdef x =   1def y =   2println   x + y == 3println   x.plus(y) == 3println   x instanceof Integer
Listasdef nomes = [André, Faria]println nomes[1]nomes[2] = Gomesprintln nomes
Mapasdef http = [ 100:CONTINUE,    200:OK,400:BAD REQUEST]println http[200]println http[300]
Intervalos (Ranges)def x =    1..10println   xprintln   x.size()println   x.fromprintln   x.to
Null também significa falsedef variavel = nullif(variavel){    println Não passa aqui} else {    println Passa aqui}
For infor (index in 1..10){    println index}def list = [0,1,2,3,4,5]for (item in list){    println item}
Eachdef list = [0,1,2,3,4,5]list.each() { item ->    println item}
itnew File(myfile.txt).eachLine{    println it}
Mais informações em:http://groovy.codehaus.org/Portuguese+Home
...Voltando aoassuntoClasses de domínio
Sim, criei uma entidade.       Mas, e os  relacionamentos??
One-to-Onegrails create-app Editoracd Editoragrails create-domain-class Livrograils create-domain-class Autorgrails create...
One-to-Onepackage editoraclass Autor {     String nome     static constraints = { }}package editoraclass Livro {     Strin...
Altere os Controllerspackage editoraclass LivroController {    static scaffold = true}package editoraclass AutorController...
O que acontece com o BD?CREATE TABLE autor(   id bigint NOT NULL,   version bigint NOT NULL,   nome character varying(255)...
One-to-One Bi-direcionalpackage editoraclass Autor {     String nome     Livro livro     static constraints = { }}package ...
One-to-Many
One-to-Manypackage editoraclass Livro {     String nome     Autor autor     static constraints = {}}package editoraclass A...
Many-to-Many
Many-to-Manypackage editoraclass Livro {      String nome      static hasMany = [autores : Autor]      static constraints ...
Many-to-Many• Grails cria uma tabela de junção autor_livros• O Relacionamento será mantido pelo lado  muitos• No caso do e...
Customizando telas       Mas telas geradas para o       many-to-many não são       muito boas.       KD os arquivos de tel...
Nem tudo são flores. Alguma horavocês tinham que programar. 
Então, mãos à massagrails generate-all editora.Autorgrails generate-all editora.Livro Isso recria as classes de controller...
ControllerO controller é gerado com algumas ações:  – Index : redireciona para list  – List: motra uma lista paginada  – S...
View• Dentro de “grails-app/views” são gerados os  arquivos GSP(Groovy Server Pages).• Dentro de uma pasta com o nome da e...
Copie esse código e coloque no                 create.gsp<tr class="prop">         <td valign="top" class="name">         ...
Sim, e as regrasde negócio ????
Constraints•   blank             •   notEqual•   creditCard        •   nullable•   email             •   range•   inList  ...
Exemploslogin(blank:false)Error Code: className.propertyName.blankhomeEmail(email:true)Error Code: className.propertyName....
InternacionalizaçãoVeja o arquivo     grails-app/i18n/message.propertiesMas tem também ...     grails-app/i18n/message_pt_...
Internacionalização               Agora é só               alterar os               arquivos e               pronto!!!!
Services• Classes Service são Plain Old Groovy Object  (POGO) localizadas na pasta grails-  app/services• E com o nome ter...
Servicesclass TaskService {  boolean transactional = true  def serviceMethod() {     …  }}class TekEventController {     d...
E a segurança???Autenticação e controlede acesso
Plugins• O que o Grails não tem nativamente a  solução pra tudo• A idéia é que uma funcionalidade seja  empacotada em módu...
Mãos à obraInstalando plugins spring-security-coregrails install-plugin spring-security-coregrails s2-quickstart editora.a...
Altere o BootStrap.groovyclass BootStrap {      def springSecurityService      def init = {             servletContext -> ...
Altere o BootStrap.groovydef userAdmin = new SecUser(username: admin, enabled: true,password: password).save()def adminRol...
Pronto Controle de acesso        terminado
Agora é só praticar eperguntar!!!
Um modelo bem simples
Go to Promptgrails create-domain-class Lancegrails create-controller primeiraapp.Lancegrails create-domain-class Leilaogra...
Atividade da semana• Trabalho em equipe(5 pessoas)• Criar um sistema em grails com o assunto visto até  aqui• O sistema de...
Mas lembrem-se, não existe bala de prata
BibliografiaBrown, Jeff; Rocher, Graeme (January 15, 2009), The Definitive Guide to Grails (2nded.), Apress, pp. 648, ISBN...
Grails   parte 1 - introdução
Grails   parte 1 - introdução
Upcoming SlideShare
Loading in...5
×

Grails parte 1 - introdução

2,720

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,720
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
98
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Transcript of "Grails parte 1 - introdução"

  1. 1. Grails Josino Rodrigues Netojosino.neto@rise.com.br
  2. 2. Um pouco do queveremos!!!!!!Hands On Grails
  3. 3. Agora vou mostraro caminho!!!
  4. 4. Novas Idéias
  5. 5. Antiga tecnologias
  6. 6. Antigas Tecnologias
  7. 7. Arquitetura de plugins
  8. 8. E agora? O que fazer?
  9. 9. Go to Promptgrails create-app PrimeiraAppcd PrimeiraAppgrails create-domain-class Participantegrails create-controller primeiraapp.Participante
  10. 10. Estruturas de pastas do Grails
  11. 11. So, lets go
  12. 12. Altere a classe de domíniopackage primeiraappclass Participante { String nome String login String senha String email String endereco String telefone static constraints = { }}
  13. 13. Altere a classe controllerpackage primeiraappclass ParticipanteController { static scaffold = true}
  14. 14. Go to Promptgrails cleangrails run-app
  15. 15. Scaffolding • Gera views • Gera classes de Controller • Tudo automagicamente
  16. 16. Hora depensar nasclasses dedomínio
  17. 17. Mas antes ...
  18. 18. Groovy???Groovy é uma linguagem ágil dinâmicapara a plataforma java com muitasfuncionalidades inspiradas de linguagenscomo Python, Ruby e Smalltalk,disponibilizando tais funcionalidadespara os desenvolvedores Java em umasintaxe muito semelhante a Java.
  19. 19. Mapeando Groovy
  20. 20. Olha a diferença 
  21. 21. Groovy Beans• Métodos públicos por padrão• Métodos de acesso por padrão• Acesso simplificado a atributos de Beans
  22. 22. Groovy Beansclass Car { String name}def car = new Car()car.setNome(Civic)car.getNome()car.nome
  23. 23. GStringdef nick = Ginadef book = Groovy in Actiondef isEquals = "$nick is $book" == Gina is Groovy in Action
  24. 24. Tudo é Objeto
  25. 25. Númerosdef x = 1def y = 2println x + y == 3println x.plus(y) == 3println x instanceof Integer
  26. 26. Listasdef nomes = [André, Faria]println nomes[1]nomes[2] = Gomesprintln nomes
  27. 27. Mapasdef http = [ 100:CONTINUE, 200:OK,400:BAD REQUEST]println http[200]println http[300]
  28. 28. Intervalos (Ranges)def x = 1..10println xprintln x.size()println x.fromprintln x.to
  29. 29. Null também significa falsedef variavel = nullif(variavel){ println Não passa aqui} else { println Passa aqui}
  30. 30. For infor (index in 1..10){ println index}def list = [0,1,2,3,4,5]for (item in list){ println item}
  31. 31. Eachdef list = [0,1,2,3,4,5]list.each() { item -> println item}
  32. 32. itnew File(myfile.txt).eachLine{ println it}
  33. 33. Mais informações em:http://groovy.codehaus.org/Portuguese+Home
  34. 34. ...Voltando aoassuntoClasses de domínio
  35. 35. Sim, criei uma entidade. Mas, e os relacionamentos??
  36. 36. One-to-Onegrails create-app Editoracd Editoragrails create-domain-class Livrograils create-domain-class Autorgrails create-controller editora.Livrograils create-controller editora.Autor
  37. 37. One-to-Onepackage editoraclass Autor { String nome static constraints = { }}package editoraclass Livro { String nome Autor autor static constraints = { }}
  38. 38. Altere os Controllerspackage editoraclass LivroController { static scaffold = true}package editoraclass AutorController { static scaffold = true}
  39. 39. O que acontece com o BD?CREATE TABLE autor( id bigint NOT NULL, version bigint NOT NULL, nome character varying(255) NOT NULL, CONSTRAINT autor_pkey PRIMARY KEY (id));CREATE TABLE livro( id bigint NOT NULL, version bigint NOT NULL, autor_id bigint NOT NULL, nome character varying(255) NOT NULL, CONSTRAINT livro_pkey PRIMARY KEY (id), CONSTRAINT fk6236e961d71d4e0 FOREIGN KEY (autor_id) REFERENCES autor (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION);
  40. 40. One-to-One Bi-direcionalpackage editoraclass Autor { String nome Livro livro static constraints = { }}package editoraclass Livro { String nome static belongsTo = [autor: Autor] static constraints = { }}
  41. 41. One-to-Many
  42. 42. One-to-Manypackage editoraclass Livro { String nome Autor autor static constraints = {}}package editoraclass Autor { String nome static hasMany = [livro : Livro] static constraints = {}}
  43. 43. Many-to-Many
  44. 44. Many-to-Manypackage editoraclass Livro { String nome static hasMany = [autores : Autor] static constraints = { }}package editoraclass Autor { String nome static belongsTo = Livro static hasMany = [livros : Livro] static constraints = { }}
  45. 45. Many-to-Many• Grails cria uma tabela de junção autor_livros• O Relacionamento será mantido pelo lado muitos• No caso do exemplo anterior, será mantida através do cadastro de Livros
  46. 46. Customizando telas Mas telas geradas para o many-to-many não são muito boas. KD os arquivos de tela ? Como faço o pra alterar as páginas?
  47. 47. Nem tudo são flores. Alguma horavocês tinham que programar. 
  48. 48. Então, mãos à massagrails generate-all editora.Autorgrails generate-all editora.Livro Isso recria as classes de controller e gera os arquivos da camada de visão
  49. 49. ControllerO controller é gerado com algumas ações: – Index : redireciona para list – List: motra uma lista paginada – Show: mostra todas as propriedades de uma instancia – Delete: apaga um registro – Edit: mostra o formulário de edição e submete para “update” – Update: salva as alterações em um registro – Create: mostra o formulário para cadastrar um registro e redireciona para “save” – Save: salva um objeto no banco
  50. 50. View• Dentro de “grails-app/views” são gerados os arquivos GSP(Groovy Server Pages).• Dentro de uma pasta com o nome da entidade são criados: – create.gsp – edit.gsp – list.gsp – show.gsp
  51. 51. Copie esse código e coloque no create.gsp<tr class="prop"> <td valign="top" class="name"> <label for="autores"> <g:message code="livro.autores.label" default="Autores" /> </label> </td> <td valign="top" class="value ${hasErrors(bean: livroInstance, field: autores, errors)}"> <g:select name="autores" from="${editora.Autor.list()}" multiple="yes" optionKey="id" size="5" value="${livroInstance?.autores*.id}" /> </td></tr>
  52. 52. Sim, e as regrasde negócio ????
  53. 53. Constraints• blank • notEqual• creditCard • nullable• email • range• inList • scale• matches • size• max • unique• maxSize • url• min • validator• minSize • widget
  54. 54. Exemploslogin(blank:false)Error Code: className.propertyName.blankhomeEmail(email:true)Error Code: className.propertyName.email.invalidname(inList:["Joe", "Fred", "Bob"])Error Code: className.propertyName.not.inListlogin(matches:"[a-zA-Z]+")Error Code: className.propertyName.matches.invalidhomePage(url:true)Error Code: className.propertyName.url.invalid
  55. 55. InternacionalizaçãoVeja o arquivo grails-app/i18n/message.propertiesMas tem também ... grails-app/i18n/message_pt_BR .properties grails-app/i18n/message_pt_PT.properties ... grails-app/i18n/message_es.properties
  56. 56. Internacionalização Agora é só alterar os arquivos e pronto!!!!
  57. 57. Services• Classes Service são Plain Old Groovy Object (POGO) localizadas na pasta grails- app/services• E com o nome terminado com Service• São uma forma fácil de extrair código extra de dentro dos Controllers• Para criar um service:grails create-service Task
  58. 58. Servicesclass TaskService { boolean transactional = true def serviceMethod() { … }}class TekEventController { def taskService def index = { taskService.serviceMethod() redirect(action:list,params:params) }}
  59. 59. E a segurança???Autenticação e controlede acesso
  60. 60. Plugins• O que o Grails não tem nativamente a solução pra tudo• A idéia é que uma funcionalidade seja empacotada em módulos que podem ser carregados pelo framework e integrados ao seu sistema• Pesquisa em texto puro, tag clouds, extensões de UI, login e controle de acesso, etc…• Acesse: http://www.grails.org/plugins
  61. 61. Mãos à obraInstalando plugins spring-security-coregrails install-plugin spring-security-coregrails s2-quickstart editora.access SecUser Role Requestmap
  62. 62. Altere o BootStrap.groovyclass BootStrap { def springSecurityService def init = { servletContext -> String password = springSecurityService.encodePassword(123) } def destroy = { }}
  63. 63. Altere o BootStrap.groovydef userAdmin = new SecUser(username: admin, enabled: true,password: password).save()def adminRole = new Role(authority: ROLE_ADMIN).save()SecUserRole.create userAdmin, adminRole, truenew Requestmap(url: /js/**, configAttribute: IS_AUTHENTICATED_ANONYMOUSLY).save()new Requestmap(url: /css/**, configAttribute: IS_AUTHENTICATED_ANONYMOUSLY).save()new Requestmap(url: /images/**, configAttribute: IS_AUTHENTICATED_ANONYMOUSLY).save()new Requestmap(url: /login/**, configAttribute: IS_AUTHENTICATED_ANONYMOUSLY).save()new Requestmap(url: /logout/**, configAttribute: IS_AUTHENTICATED_ANONYMOUSLY).save()new Requestmap(url: /**, configAttribute: ROLE_ADMIN).save()
  64. 64. Pronto Controle de acesso terminado
  65. 65. Agora é só praticar eperguntar!!!
  66. 66. Um modelo bem simples
  67. 67. Go to Promptgrails create-domain-class Lancegrails create-controller primeiraapp.Lancegrails create-domain-class Leilaograils create-controller primeiraapp.Leilaograils create-domain-class ItemLeilaograils create-controller primeiraapp.ItemLeilao
  68. 68. Atividade da semana• Trabalho em equipe(5 pessoas)• Criar um sistema em grails com o assunto visto até aqui• O sistema deve ter no mínimo 20 entidades• Deve possuir controle de acesso• A modelagem vocês decidem• Apresentar na próxima aula os pontos positivos e negativos durante o uso da tecnologia
  69. 69. Mas lembrem-se, não existe bala de prata
  70. 70. BibliografiaBrown, Jeff; Rocher, Graeme (January 15, 2009), The Definitive Guide to Grails (2nded.), Apress, pp. 648, ISBN 1590599950Smith, Glen; Ledbrook, Peter (June 28, 2009), Grails in Action (1st ed.), ManningPublications, pp. 520, ISBN 1933988932Dickinson, Jon (May 27, 2009), Grails 1.1 Web Application Development (1st ed.),Packt Publishing, pp. 328, ISBN 1847196683Abdul-Jawad, Bashar (December 2, 2008), Groovy and Grails Recipes (1st ed.), Apress,pp. 424, ISBN 143021600XFischer, Robert (April 20, 2009), Grails Persistence with GORM and GSQL (1st ed.),Apress, pp. 125, ISBN 1430219262M. Judd, Christopher; Nusairat, Joseph Faisal; Shingler, Jim (June 18, 2008), BeginningGroovy and Grails: From Novice to Professional (1st ed.), Apress, pp. 440, ISBN1430210451Rudolph, Jason (February 6, 2007), Getting Started with Grails (1st ed.), Lulu.com, pp.132, ISBN 143030782X
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×