Grails parte 1 - introdução
-
Upload
josino-rodrigues -
Category
Documents
-
view
2.697 -
download
1
Transcript of Grails parte 1 - introdução
![Page 2: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/2.jpg)
Um pouco do que veremos!!!!!!
Hands On Grails
![Page 3: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/3.jpg)
Agora vou mostrar o caminho!!!
![Page 4: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/4.jpg)
Novas Idéias
![Page 5: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/5.jpg)
Antiga tecnologias
![Page 6: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/6.jpg)
Antigas Tecnologias
![Page 7: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/7.jpg)
Arquitetura de plugins
![Page 8: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/8.jpg)
E agora? O que fazer?
![Page 9: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/9.jpg)
Go to Prompt
grails create-app PrimeiraApp
cd PrimeiraApp
grails create-domain-class Participante
grails create-controller primeiraapp.Participante
![Page 10: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/10.jpg)
Estruturas de pastas do Grails
![Page 11: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/11.jpg)
So, let's go
![Page 12: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/12.jpg)
Altere a classe de domínio package primeiraapp
class Participante {
String nome
String login
String senha
String email
String endereco
String telefone
static constraints = { }
}
![Page 13: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/13.jpg)
Altere a classe controller package primeiraapp
class ParticipanteController {
static scaffold = true
}
![Page 14: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/14.jpg)
Go to Prompt
grails clean
grails run-app
![Page 15: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/15.jpg)
![Page 16: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/16.jpg)
Scaffolding
• Gera views
• Gera classes de Controller
• Tudo automagicamente
![Page 17: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/17.jpg)
Hora de pensar nas classes de domínio
![Page 18: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/18.jpg)
Mas antes ...
![Page 19: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/19.jpg)
![Page 20: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/20.jpg)
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.
![Page 21: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/21.jpg)
Mapeando Groovy
![Page 22: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/22.jpg)
Olha a diferença
![Page 23: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/23.jpg)
Groovy Beans
• Métodos públicos por padrão
• Métodos de acesso por padrão
• Acesso simplificado a atributos de Beans
![Page 24: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/24.jpg)
Groovy Beans class Car {
String name
}
def car = new Car()
car.setNome('Civic')
car.getNome()
car.nome
![Page 25: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/25.jpg)
GString
def nick = 'Gina'
def book = 'Groovy in Action'
def isEquals = "$nick is $book" == 'Gina is
Groovy in Action'
![Page 26: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/26.jpg)
Tudo é Objeto
![Page 27: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/27.jpg)
Números def x = 1
def y = 2
println x + y == 3
println x.plus(y) == 3
println x instanceof Integer
![Page 28: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/28.jpg)
Listas
def nomes = ['André', 'Faria']
println nomes[1]
nomes[2] = 'Gomes'
println nomes
![Page 29: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/29.jpg)
Mapas def http = [ 100:'CONTINUE',
200:'OK',400:'BAD REQUEST']
println http[200]
println http[300]
![Page 30: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/30.jpg)
Intervalos (Ranges)
def x = 1..10
println x
println x.size()
println x.from
println x.to
![Page 31: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/31.jpg)
Null também significa false
def variavel = null
if(variavel){
println 'Não passa aqui'
} else {
println 'Passa aqui'
}
![Page 32: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/32.jpg)
For in for (index in 1..10){
println index
}
def list = [0,1,2,3,4,5]
for (item in list){
println item
}
![Page 33: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/33.jpg)
Each
def list = [0,1,2,3,4,5]
list.each() { item ->
println item
}
![Page 34: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/34.jpg)
it new File('myfile.txt').eachLine{
println it
}
![Page 35: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/35.jpg)
Mais informações em: http://groovy.codehaus.org/Portuguese+Home
![Page 36: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/36.jpg)
...
Voltando ao assunto
Classes de domínio
![Page 37: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/37.jpg)
Sim, criei uma entidade. Mas, e os
relacionamentos??
![Page 38: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/38.jpg)
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
![Page 39: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/39.jpg)
package editora
class Autor {
String nome
static constraints = { }
}
package editora
class Livro {
String nome
Autor autor
static constraints = { }
}
One-to-One
![Page 40: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/40.jpg)
Altere os Controllers package editora
class LivroController {
static scaffold = true
}
package editora
class AutorController {
static scaffold = true
}
![Page 41: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/41.jpg)
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
);
![Page 42: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/42.jpg)
package editora
class Autor {
String nome
Livro livro
static constraints = { }
}
package editora
class Livro {
String nome
static belongsTo = [autor: Autor]
static constraints = { }
}
One-to-One Bi-direcional
![Page 43: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/43.jpg)
One-to-Many
![Page 44: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/44.jpg)
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 = {}
}
![Page 45: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/45.jpg)
Many-to-Many
![Page 46: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/46.jpg)
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 = { }
}
![Page 47: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/47.jpg)
• 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
Many-to-Many
![Page 48: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/48.jpg)
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?
![Page 49: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/49.jpg)
Nem tudo são flores. Alguma hora vocês tinham que programar.
![Page 50: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/50.jpg)
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
![Page 51: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/51.jpg)
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
![Page 52: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/52.jpg)
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
![Page 53: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/53.jpg)
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>
![Page 54: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/54.jpg)
Sim, e as regras de negócio ????
![Page 55: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/55.jpg)
Constraints • blank • creditCard • email • inList • matches • max • maxSize • min • minSize
• notEqual • nullable • range • scale • size • unique • url • validator • widget
![Page 56: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/56.jpg)
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
![Page 57: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/57.jpg)
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
![Page 58: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/58.jpg)
Internacionalização
Agora é só alterar os arquivos e pronto!!!!
![Page 59: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/59.jpg)
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
![Page 60: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/60.jpg)
Services class TaskService {
boolean transactional = true
def serviceMethod() {
…
}
}
class TekEventController {
def taskService
def index = {
taskService.serviceMethod()
redirect(action:list,params:params)
}
}
![Page 61: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/61.jpg)
E a segurança???
Autenticação e controle de acesso
![Page 62: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/62.jpg)
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
![Page 63: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/63.jpg)
Mãos à obra Instalando plugins spring-security-core
grails install-plugin spring-security-core grails s2-quickstart editora.access SecUser Role Requestmap
![Page 64: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/64.jpg)
Altere o BootStrap.groovy class BootStrap {
def springSecurityService
def init = {
servletContext ->
String password =
springSecurityService.encodePassword('123')
}
def destroy = { }
}
![Page 65: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/65.jpg)
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()
![Page 66: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/66.jpg)
Pronto Controle de acesso terminado
![Page 67: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/67.jpg)
Agora é só praticar e perguntar!!!
![Page 68: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/68.jpg)
Um modelo bem simples
![Page 69: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/69.jpg)
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
![Page 70: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/70.jpg)
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
![Page 71: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/71.jpg)
Mas lembrem-se, não existe bala de prata
![Page 72: Grails parte 1 - introdução](https://reader034.fdocuments.net/reader034/viewer/2022052622/5590a6191a28ab73528b458b/html5/thumbnails/72.jpg)
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