72
Grails Josino Rodrigues Neto [email protected]

Grails parte 1 - introdução

Embed Size (px)

Citation preview

Page 1: Grails   parte 1 - introdução

Grails Josino Rodrigues Neto

[email protected]

Page 2: Grails   parte 1 - introdução

Um pouco do que veremos!!!!!!

Hands On Grails

Page 3: Grails   parte 1 - introdução

Agora vou mostrar o caminho!!!

Page 4: Grails   parte 1 - introdução

Novas Idéias

Page 5: Grails   parte 1 - introdução

Antiga tecnologias

Page 6: Grails   parte 1 - introdução

Antigas Tecnologias

Page 7: Grails   parte 1 - introdução

Arquitetura de plugins

Page 8: Grails   parte 1 - introdução

E agora? O que fazer?

Page 9: Grails   parte 1 - introdução

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

Estruturas de pastas do Grails

Page 11: Grails   parte 1 - introdução

So, let's go

Page 12: Grails   parte 1 - introdução

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

Altere a classe controller package primeiraapp

class ParticipanteController {

static scaffold = true

}

Page 14: Grails   parte 1 - introdução

Go to Prompt

grails clean

grails run-app

Page 15: Grails   parte 1 - introdução
Page 16: Grails   parte 1 - introdução

Scaffolding

• Gera views

• Gera classes de Controller

• Tudo automagicamente

Page 17: Grails   parte 1 - introdução

Hora de pensar nas classes de domínio

Page 18: Grails   parte 1 - introdução

Mas antes ...

Page 19: Grails   parte 1 - introdução
Page 20: Grails   parte 1 - introdução

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

Mapeando Groovy

Page 22: Grails   parte 1 - introdução

Olha a diferença

Page 23: Grails   parte 1 - introdução

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

Groovy Beans class Car {

String name

}

def car = new Car()

car.setNome('Civic')

car.getNome()

car.nome

Page 25: Grails   parte 1 - introdução

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

Tudo é Objeto

Page 27: Grails   parte 1 - introdução

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

Listas

def nomes = ['André', 'Faria']

println nomes[1]

nomes[2] = 'Gomes'

println nomes

Page 29: Grails   parte 1 - introdução

Mapas def http = [ 100:'CONTINUE',

200:'OK',400:'BAD REQUEST']

println http[200]

println http[300]

Page 30: Grails   parte 1 - introdução

Intervalos (Ranges)

def x = 1..10

println x

println x.size()

println x.from

println x.to

Page 31: Grails   parte 1 - introdução

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

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

Each

def list = [0,1,2,3,4,5]

list.each() { item ->

println item

}

Page 34: Grails   parte 1 - introdução

it new File('myfile.txt').eachLine{

println it

}

Page 35: Grails   parte 1 - introdução

Mais informações em: http://groovy.codehaus.org/Portuguese+Home

Page 36: Grails   parte 1 - introdução

...

Voltando ao assunto

Classes de domínio

Page 37: Grails   parte 1 - introdução

Sim, criei uma entidade. Mas, e os

relacionamentos??

Page 38: Grails   parte 1 - introdução

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

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

Altere os Controllers package editora

class LivroController {

static scaffold = true

}

package editora

class AutorController {

static scaffold = true

}

Page 41: Grails   parte 1 - introdução

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

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

One-to-Many

Page 44: Grails   parte 1 - introdução

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

Many-to-Many

Page 46: Grails   parte 1 - introdução

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

• 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

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

Nem tudo são flores. Alguma hora vocês tinham que programar.

Page 50: Grails   parte 1 - introdução

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

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

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

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

Sim, e as regras de negócio ????

Page 55: Grails   parte 1 - introdução

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

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

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

Internacionalização

Agora é só alterar os arquivos e pronto!!!!

Page 59: Grails   parte 1 - introdução

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

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

E a segurança???

Autenticação e controle de acesso

Page 62: Grails   parte 1 - introdução

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

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

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

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

Pronto Controle de acesso terminado

Page 67: Grails   parte 1 - introdução

Agora é só praticar e perguntar!!!

Page 68: Grails   parte 1 - introdução

Um modelo bem simples

Page 69: Grails   parte 1 - introdução

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

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

Mas lembrem-se, não existe bala de prata

Page 72: Grails   parte 1 - introdução

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