SlideShare une entreprise Scribd logo
1  sur  72
Télécharger pour lire hors ligne
Grails
  Josino Rodrigues Neto
josino.neto@rise.com.br
Um pouco do que
veremos!!!!!!
Hands On Grails
Agora vou mostrar
o caminho!!!
Novas Idéias
Antiga tecnologias
Antigas Tecnologias
Arquitetura de plugins
E agora? O que fazer?
Go to Prompt


grails create-app PrimeiraApp
cd PrimeiraApp
grails create-domain-class Participante
grails create-controller primeiraapp.Participante
Estruturas de pastas do
         Grails
So, let's go
Altere a classe de domínio
package primeiraapp

class Participante {
     String nome
     String login
     String senha
     String email
     String endereco
     String telefone
     static constraints = {   }
}
Altere a classe controller
package primeiraapp

class ParticipanteController {
     static scaffold = true
}
Go to Prompt


grails clean
grails run-app
Scaffolding
    • Gera views
    • Gera classes de
      Controller
    • Tudo automagicamente
Hora de
pensar nas
classes de
domínio
Mas antes ...
Groovy???
Groovy é uma linguagem ágil dinâmica
para a plataforma java com muitas
funcionalidades inspiradas de linguagens
como Python, Ruby e Smalltalk,
disponibilizando tais funcionalidades
para os desenvolvedores Java em uma
sintaxe muito semelhante a Java.
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 Beans
class Car {
    String name
}

def car = new Car()
car.setNome('Civic')
car.getNome()
car.nome
GString
def nick = 'Gina'
def book = 'Groovy in Action'
def isEquals = "$nick is $book" == 'Gina is
     Groovy in Action'
Tudo é Objeto
Números
def x =   1
def y =   2
println   x + y == 3
println   x.plus(y) == 3
println   x instanceof Integer
Listas
def nomes = ['André', 'Faria']
println nomes[1]
nomes[2] = 'Gomes'
println nomes
Mapas
def http = [ 100:'CONTINUE',
    200:'OK',400:'BAD REQUEST']
println http[200]
println http[300]
Intervalos (Ranges)
def x =    1..10
println   x
println   x.size()
println   x.from
println   x.to
Null também significa false
def variavel = null
if(variavel){
    println 'Não passa aqui'
} else {
    println 'Passa aqui'
}
For in
for (index in 1..10){
    println index
}

def list = [0,1,2,3,4,5]
for (item in list){
    println item
}
Each
def list = [0,1,2,3,4,5]
list.each() { item ->
    println item
}
it
new File('myfile.txt').eachLine{
    println it
}
Mais informações em:
http://groovy.codehaus.org/Portuguese+Home
...
Voltando ao
assunto
Classes de domínio
Sim, criei uma entidade.
       Mas, e os
  relacionamentos??
One-to-One

grails create-app Editora
cd Editora
grails create-domain-class Livro
grails create-domain-class Autor
grails create-controller editora.Livro
grails create-controller editora.Autor
One-to-One
package editora
class Autor {
     String nome
     static constraints = { }
}

package editora
class Livro {
     String nome
     Autor autor
     static constraints = { }
}
Altere os Controllers
package editora
class LivroController {
    static scaffold = true
}

package editora
class AutorController {
    static scaffold = true
}
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
);
One-to-One Bi-direcional
package editora
class Autor {
     String nome
     Livro livro
     static constraints = { }
}

package editora
class Livro {
     String nome
     static belongsTo = [autor: Autor]
     static constraints = { }
}
One-to-Many
One-to-Many
package editora
class Livro {
     String nome
     Autor autor
     static constraints = {}
}

package editora
class Autor {
     String nome
     static hasMany = [livro : Livro]
     static constraints = {}
}
Many-to-Many
Many-to-Many
package editora
class Livro {
      String nome
      static hasMany = [autores : Autor]
      static constraints = {    }
}

package editora
class Autor {
      String nome
      static belongsTo = Livro
      static hasMany = [livros : Livro]
      static constraints = { }
}
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
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?
Nem tudo são flores. Alguma hora
vocês tinham que programar. 
Então, mãos à massa
grails generate-all editora.Autor
grails generate-all editora.Livro



 Isso recria as classes de controller
 e gera os arquivos da camada de
 visão
Controller
O 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
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
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>
Sim, e as regras
de negócio ????
Constraints
•   blank             •   notEqual
•   creditCard        •   nullable
•   email             •   range
•   inList            •   scale
•   matches           •   size
•   max               •   unique
•   maxSize           •   url
•   min               •   validator
•   minSize           •   widget
Exemplos
login(blank:false)
Error Code: className.propertyName.blank

homeEmail(email:true)
Error Code: className.propertyName.email.invalid

name(inList:["Joe", "Fred", "Bob"])
Error Code: className.propertyName.not.inList

login(matches:"[a-zA-Z]+")
Error Code: className.propertyName.matches.invalid

homePage(url:true)
Error Code: className.propertyName.url.invalid
Internacionalização
Veja o arquivo
     grails-app/i18n/message.properties

Mas tem também ...

     grails-app/i18n/message_pt_BR .properties
     grails-app/i18n/message_pt_PT.properties
     ...
     grails-app/i18n/message_es.properties
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 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
Services
class TaskService {
  boolean transactional = true
  def serviceMethod() {
     …
  }
}
class TekEventController {
     def taskService
     def index = {
          taskService.serviceMethod()
          redirect(action:list,params:params)
     }
}
E a segurança???
Autenticação e controle
de 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ó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
Mãos à obra
Instalando plugins spring-security-core

grails install-plugin spring-security-core
grails s2-quickstart editora.access SecUser Role Requestmap
Altere o BootStrap.groovy
class BootStrap {

      def springSecurityService

      def init = {
             servletContext ->
             String password =
             springSecurityService.encodePassword('123')
      }
      def destroy = {    }
}
Altere o BootStrap.groovy
def userAdmin = new SecUser(username: 'admin', enabled: true,
password: password).save()
def adminRole = new Role(authority: 'ROLE_ADMIN').save()
SecUserRole.create userAdmin, adminRole, true

new 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()
Pronto Controle de acesso
        terminado
Agora é só praticar e
perguntar!!!
Um modelo bem simples
Go to Prompt

grails create-domain-class Lance
grails create-controller primeiraapp.Lance
grails create-domain-class Leilao
grails create-controller primeiraapp.Leilao
grails create-domain-class ItemLeilao
grails create-controller primeiraapp.ItemLeilao
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
Mas lembrem-se, não
 existe bala de prata
Bibliografia
Brown, Jeff; Rocher, Graeme (January 15, 2009), The Definitive Guide to Grails (2nd
ed.), Apress, pp. 648, ISBN 1590599950
Smith, Glen; Ledbrook, Peter (June 28, 2009), Grails in Action (1st ed.), Manning
Publications, pp. 520, ISBN 1933988932
Dickinson, Jon (May 27, 2009), Grails 1.1 Web Application Development (1st ed.),
Packt Publishing, pp. 328, ISBN 1847196683
Abdul-Jawad, Bashar (December 2, 2008), Groovy and Grails Recipes (1st ed.), Apress,
pp. 424, ISBN 143021600X
Fischer, Robert (April 20, 2009), Grails Persistence with GORM and GSQL (1st ed.),
Apress, pp. 125, ISBN 1430219262
M. Judd, Christopher; Nusairat, Joseph Faisal; Shingler, Jim (June 18, 2008), Beginning
Groovy and Grails: From Novice to Professional (1st ed.), Apress, pp. 440, ISBN
1430210451
Rudolph, Jason (February 6, 2007), Getting Started with Grails (1st ed.), Lulu.com, pp.
132, ISBN 143030782X

Contenu connexe

Tendances

Tendances (20)

Idiomatic Kotlin
Idiomatic KotlinIdiomatic Kotlin
Idiomatic Kotlin
 
Aula 2 - Comandos DDL DML DQL E DCL
Aula 2 - Comandos DDL DML DQL E DCLAula 2 - Comandos DDL DML DQL E DCL
Aula 2 - Comandos DDL DML DQL E DCL
 
POO - 21 - Java e Banco de Dados
POO - 21 - Java e Banco de DadosPOO - 21 - Java e Banco de Dados
POO - 21 - Java e Banco de Dados
 
Introduction to the DOM
Introduction to the DOMIntroduction to the DOM
Introduction to the DOM
 
Aula02 - JavaScript
Aula02 - JavaScriptAula02 - JavaScript
Aula02 - JavaScript
 
Linguagem C 06 Funcoes
Linguagem C 06 FuncoesLinguagem C 06 Funcoes
Linguagem C 06 Funcoes
 
Clean code
Clean codeClean code
Clean code
 
An introduction to React.js
An introduction to React.jsAn introduction to React.js
An introduction to React.js
 
Gradle Introduction
Gradle IntroductionGradle Introduction
Gradle Introduction
 
Clean code: meaningful Name
Clean code: meaningful NameClean code: meaningful Name
Clean code: meaningful Name
 
Collections and its types in C# (with examples)
Collections and its types in C# (with examples)Collections and its types in C# (with examples)
Collections and its types in C# (with examples)
 
JAVA - Herança
JAVA - HerançaJAVA - Herança
JAVA - Herança
 
Clean code
Clean codeClean code
Clean code
 
OOP V3.1
OOP V3.1OOP V3.1
OOP V3.1
 
Clean code
Clean codeClean code
Clean code
 
Object-oriented Programming-with C#
Object-oriented Programming-with C#Object-oriented Programming-with C#
Object-oriented Programming-with C#
 
Java inheritance
Java inheritanceJava inheritance
Java inheritance
 
Programação Orientada a Objetos
Programação Orientada a ObjetosProgramação Orientada a Objetos
Programação Orientada a Objetos
 
Document Object Model (DOM)
Document Object Model (DOM)Document Object Model (DOM)
Document Object Model (DOM)
 
Java Basics V3
Java Basics V3Java Basics V3
Java Basics V3
 

Similaire à Grails parte 1 - introdução

Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Douglas Mendes
 
Grails from scratch
Grails from scratchGrails from scratch
Grails from scratchUFPA
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o JavascriptMichel Ribeiro
 
Produtividade na web_com_groovy_e_grails_pt2
Produtividade na web_com_groovy_e_grails_pt2Produtividade na web_com_groovy_e_grails_pt2
Produtividade na web_com_groovy_e_grails_pt2Lucas Aquiles
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoFreedom DayMS
 
LPII_Aula_7-JQuery.pdf
LPII_Aula_7-JQuery.pdfLPII_Aula_7-JQuery.pdf
LPII_Aula_7-JQuery.pdfGabrielaMota46
 
Backbone.js - A espinha dorsal de aplicações web
Backbone.js - A espinha dorsal de aplicações webBackbone.js - A espinha dorsal de aplicações web
Backbone.js - A espinha dorsal de aplicações webHenrique Gogó
 
ODIG - Javascript, DOM Elements e jQuery
ODIG - Javascript, DOM Elements e jQueryODIG - Javascript, DOM Elements e jQuery
ODIG - Javascript, DOM Elements e jQueryMarketing Digital ODIG
 
Backbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosBackbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosHenrique Gogó
 
Design de código: princípios e práticas para ter um código sustentável
Design de código: princípios e práticas para ter um código sustentávelDesign de código: princípios e práticas para ter um código sustentável
Design de código: princípios e práticas para ter um código sustentávelAndrews Medina
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersHarlley Oliveira
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBLuciano Borges
 

Similaire à Grails parte 1 - introdução (20)

Groovy grails
Groovy grailsGroovy grails
Groovy grails
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 
Minicurso groovy grails
Minicurso groovy grailsMinicurso groovy grails
Minicurso groovy grails
 
Grails
GrailsGrails
Grails
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)
 
Grails from scratch
Grails from scratchGrails from scratch
Grails from scratch
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 
Produtividade na web_com_groovy_e_grails_pt2
Produtividade na web_com_groovy_e_grails_pt2Produtividade na web_com_groovy_e_grails_pt2
Produtividade na web_com_groovy_e_grails_pt2
 
Palestra cbq
Palestra cbqPalestra cbq
Palestra cbq
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com Django
 
LPII_Aula_7-JQuery.pdf
LPII_Aula_7-JQuery.pdfLPII_Aula_7-JQuery.pdf
LPII_Aula_7-JQuery.pdf
 
Backbone.js - A espinha dorsal de aplicações web
Backbone.js - A espinha dorsal de aplicações webBackbone.js - A espinha dorsal de aplicações web
Backbone.js - A espinha dorsal de aplicações web
 
ODIG - Javascript, DOM Elements e jQuery
ODIG - Javascript, DOM Elements e jQueryODIG - Javascript, DOM Elements e jQuery
ODIG - Javascript, DOM Elements e jQuery
 
Backbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosBackbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectados
 
Design de código: princípios e práticas para ter um código sustentável
Design de código: princípios e práticas para ter um código sustentávelDesign de código: princípios e práticas para ter um código sustentável
Design de código: princípios e práticas para ter um código sustentável
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para Webdesigners
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
JavaScript - A Linguagem
JavaScript - A LinguagemJavaScript - A Linguagem
JavaScript - A Linguagem
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEB
 

Grails parte 1 - introdução

  • 1. Grails Josino Rodrigues Neto josino.neto@rise.com.br
  • 2. Um pouco do que veremos!!!!!! Hands On Grails
  • 3. Agora vou mostrar o caminho!!!
  • 8. E agora? O que fazer?
  • 9. Go to Prompt grails create-app PrimeiraApp cd PrimeiraApp grails create-domain-class Participante grails create-controller primeiraapp.Participante
  • 10. Estruturas de pastas do Grails
  • 12. Altere a classe de domínio package primeiraapp class Participante { String nome String login String senha String email String endereco String telefone static constraints = { } }
  • 13. Altere a classe controller package primeiraapp class ParticipanteController { static scaffold = true }
  • 14. Go to Prompt grails clean grails run-app
  • 15.
  • 16. Scaffolding • Gera views • Gera classes de Controller • Tudo automagicamente
  • 19.
  • 20. Groovy??? Groovy é uma linguagem ágil dinâmica para a plataforma java com muitas funcionalidades inspiradas de linguagens como Python, Ruby e Smalltalk, disponibilizando tais funcionalidades para os desenvolvedores Java em uma sintaxe muito semelhante a Java.
  • 23. Groovy Beans • Métodos públicos por padrão • Métodos de acesso por padrão • Acesso simplificado a atributos de Beans
  • 24. Groovy Beans class Car { String name } def car = new Car() car.setNome('Civic') car.getNome() car.nome
  • 25. GString def nick = 'Gina' def book = 'Groovy in Action' def isEquals = "$nick is $book" == 'Gina is Groovy in Action'
  • 27. Números def x = 1 def y = 2 println x + y == 3 println x.plus(y) == 3 println x instanceof Integer
  • 28. Listas def nomes = ['André', 'Faria'] println nomes[1] nomes[2] = 'Gomes' println nomes
  • 29. Mapas def http = [ 100:'CONTINUE', 200:'OK',400:'BAD REQUEST'] println http[200] println http[300]
  • 30. Intervalos (Ranges) def x = 1..10 println x println x.size() println x.from println x.to
  • 31. Null também significa false def variavel = null if(variavel){ println 'Não passa aqui' } else { println 'Passa aqui' }
  • 32. For in for (index in 1..10){ println index } def list = [0,1,2,3,4,5] for (item in list){ println item }
  • 33. Each def list = [0,1,2,3,4,5] list.each() { item -> println item }
  • 37. Sim, criei uma entidade. Mas, e os relacionamentos??
  • 38. One-to-One grails create-app Editora cd Editora grails create-domain-class Livro grails create-domain-class Autor grails create-controller editora.Livro grails create-controller editora.Autor
  • 39. One-to-One package editora class Autor { String nome static constraints = { } } package editora class Livro { String nome Autor autor static constraints = { } }
  • 40. Altere os Controllers package editora class LivroController { static scaffold = true } package editora class AutorController { static scaffold = true }
  • 41. 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 );
  • 42. One-to-One Bi-direcional package editora class Autor { String nome Livro livro static constraints = { } } package editora class Livro { String nome static belongsTo = [autor: Autor] static constraints = { } }
  • 44. One-to-Many package editora class Livro { String nome Autor autor static constraints = {} } package editora class Autor { String nome static hasMany = [livro : Livro] static constraints = {} }
  • 46. Many-to-Many package editora class Livro { String nome static hasMany = [autores : Autor] static constraints = { } } package editora class Autor { String nome static belongsTo = Livro static hasMany = [livros : Livro] static constraints = { } }
  • 47. 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
  • 48. 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?
  • 49. Nem tudo são flores. Alguma hora vocês tinham que programar. 
  • 50. Então, mãos à massa grails generate-all editora.Autor grails generate-all editora.Livro Isso recria as classes de controller e gera os arquivos da camada de visão
  • 51. Controller O 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
  • 52. 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
  • 53. 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>
  • 54. Sim, e as regras de negócio ????
  • 55. Constraints • blank • notEqual • creditCard • nullable • email • range • inList • scale • matches • size • max • unique • maxSize • url • min • validator • minSize • widget
  • 56. Exemplos login(blank:false) Error Code: className.propertyName.blank homeEmail(email:true) Error Code: className.propertyName.email.invalid name(inList:["Joe", "Fred", "Bob"]) Error Code: className.propertyName.not.inList login(matches:"[a-zA-Z]+") Error Code: className.propertyName.matches.invalid homePage(url:true) Error Code: className.propertyName.url.invalid
  • 57. Internacionalização Veja o arquivo grails-app/i18n/message.properties Mas tem também ... grails-app/i18n/message_pt_BR .properties grails-app/i18n/message_pt_PT.properties ... grails-app/i18n/message_es.properties
  • 58. Internacionalização Agora é só alterar os arquivos e pronto!!!!
  • 59. 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
  • 60. Services class TaskService { boolean transactional = true def serviceMethod() { … } } class TekEventController { def taskService def index = { taskService.serviceMethod() redirect(action:list,params:params) } }
  • 61. E a segurança??? Autenticação e controle de acesso
  • 62. 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
  • 63. Mãos à obra Instalando plugins spring-security-core grails install-plugin spring-security-core grails s2-quickstart editora.access SecUser Role Requestmap
  • 64. Altere o BootStrap.groovy class BootStrap { def springSecurityService def init = { servletContext -> String password = springSecurityService.encodePassword('123') } def destroy = { } }
  • 65. Altere o BootStrap.groovy def userAdmin = new SecUser(username: 'admin', enabled: true, password: password).save() def adminRole = new Role(authority: 'ROLE_ADMIN').save() SecUserRole.create userAdmin, adminRole, true new 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()
  • 66. Pronto Controle de acesso terminado
  • 67. Agora é só praticar e perguntar!!!
  • 68. Um modelo bem simples
  • 69. Go to Prompt grails create-domain-class Lance grails create-controller primeiraapp.Lance grails create-domain-class Leilao grails create-controller primeiraapp.Leilao grails create-domain-class ItemLeilao grails create-controller primeiraapp.ItemLeilao
  • 70. 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
  • 71. Mas lembrem-se, não existe bala de prata
  • 72. Bibliografia Brown, Jeff; Rocher, Graeme (January 15, 2009), The Definitive Guide to Grails (2nd ed.), Apress, pp. 648, ISBN 1590599950 Smith, Glen; Ledbrook, Peter (June 28, 2009), Grails in Action (1st ed.), Manning Publications, pp. 520, ISBN 1933988932 Dickinson, Jon (May 27, 2009), Grails 1.1 Web Application Development (1st ed.), Packt Publishing, pp. 328, ISBN 1847196683 Abdul-Jawad, Bashar (December 2, 2008), Groovy and Grails Recipes (1st ed.), Apress, pp. 424, ISBN 143021600X Fischer, Robert (April 20, 2009), Grails Persistence with GORM and GSQL (1st ed.), Apress, pp. 125, ISBN 1430219262 M. Judd, Christopher; Nusairat, Joseph Faisal; Shingler, Jim (June 18, 2008), Beginning Groovy and Grails: From Novice to Professional (1st ed.), Apress, pp. 440, ISBN 1430210451 Rudolph, Jason (February 6, 2007), Getting Started with Grails (1st ed.), Lulu.com, pp. 132, ISBN 143030782X