Grails from scratch
Gustavo Pintogustavopinto.org
twitter.com/gustavopinto
AgendaIntrodução
Modelos ágeis Groovy
Hands on Grails
Da instalação à aplicaçãoDicas
IntroduçãoModelos ágeis
Processos, técnicas, ferramentas, whatever
O que é ser ágil?
Porque precisamos ser ágeis?
Duas coisas que influenciam na agilidadeA atitude dos membros da equipe As ferramentas
IntroduçãoNecessidades básicas
D.R.Y principleconvention-over-configurationLightweight
IntroduçãoD.R.Y principle ?convention-over-configuration ?lightweight ?
O Que usar?
IntroduçãoD.R.Y principle ?convention-over-configuration ?lightweight ?
GRAILS
IntroduçãoD.R.Y principle ?convention-over-configuration ?lightweight ?
GRAILS
GroovyLinguagem OO baseada no JavaMas com boas idéias de outras linguagens
Ruby, Python Roda na JVMTipagem dinâmicaOnde tudo é objetoPode ser usada como script Sem algumas burocracias do Java Sintax Familiar
Groovy
Radar de tecnologia - ThoughtWorks
Groovy
groovyconsole.appspot.com
Rails
Groovy + Rails = GrailsInstalaçãoPrimeiros comandosPadrão de projetos
Domain ClassesControllers e Views
ValidaçõesRelacionamentosGrails ORM (GORM)
GrailsInstalação
Download do arquivo grails.a.b.c.zipDescopactar e declarar a variável GRAILS_HOME
Digilte: grails
GrailsInstalação
Download do arquivo grails.a.b.c.zipDescopactar e declarar a variável GRAILS_HOME
Digilte: grails
gustavo@zeus:~$ grailsWelcome to Grails 1.3.2 - http://grails.org/Licensed under Apache Standard License 2.0Grails home is set to: /opt/grails-1.3.2
No script name specified. Use 'grails help' for more info or 'grails interactive' to enter interactive mode
GrailsPrimeiros comandos
$ grails create-app racetrack
$ cd racetrack$ grails run-app
$ grails war$ grails clean
GrailsPrimeiros comandos
$ grails create-app racetrackWelcome to Grails 1.2 - http://grails.org/Licensed under Apache Standard License 2.0Grails home is set to: /opt/grails...Created Grails Application at /web/racetrack
GrailsPrimeiros comandos
$ grails [–Dserver.port=9090] run-app...Base Directory: /Users/sdavis/web/racetrackRunning script /opt/grails/scripts/RunApp.groovyEnvironment set to development[mkdir] Created dir:/Users/sdavis/.grails/1.2/projects/racetrack/classes[groovyc] Compiling 6 source files to/Users/sdavis/.grails/1.2/projects/racetrack/classes...Running Grails application..Server running. Browse to http://localhost:8080/racetrack
Grails
Padrão de projetos
M
C
V
Grails
Padrão de projetos
Lembre-se: Convention over Configuration
M
C
V
GrailsDomain Classes
Definem os elementos da aplicaçãoInscrição para a corrida nome, email, pago?
GrailsDomain Classes
Definem os elementos da aplicaçãoInscrição para a corrida nome, email, pago?
$ grails create-domain-class Inscricao
GrailsDomain Classes
Definem os elementos da aplicaçãoInscrição para a corrida nome, email, pago?
$ grails create-domain-class Inscricao
GrailsDomain Classes
Definem os elementos da aplicaçãoInscrição para a corrida nome, email, pago?
$ grails create-domain-class Inscricao class Inscricao { String nome Date dataAniversario String email Boolean pago
....}
GrailsDomain Classes
Definem os elementos da aplicaçãoInscrição para a corrida nome, email, pago?
$ grails create-domain-class Inscricao class Inscricao { .... dateCreated lastUpdated ....}
GrailsDomain Classes
Definem os elementos da aplicaçãoInscrição para a corrida nome, email, pago?
$ grails create-domain-class Inscricao class Inscricao { .... dateCreated lastUpdated ....}
variáveis especiais
GrailsDomain Classes
Definem os elementos da aplicaçãoInscrição para a corrida nome, email, pago?
$ grails create-domain-class Inscricao class Inscricao { .... dateCreated lastUpdated ....}
class Inscricao { ..... def beforeInsert = { // codigo } def beforeUpdate = { } def beforeDelete = { } def onLoad = { }}
GrailsDomain Classes
Definem os elementos da aplicaçãoInscrição para a corrida nome, email, pago? class Inscricao {
..... def beforeInsert = { // codigo } def beforeUpdate = { } def beforeDelete = { } def onLoad = { }}
Para saber mais: http://grails.org/GORM+-+Mapping+DSL.
GrailsDomain Classes
$ grails create-domain-class Corrida class Corrida { String nome Date dataIncio String cidade String estado BigDecimal distancia BigDecimal custo ....}
GrailsDomain Classes
$ grails create-domain-class Corrida class Corrida { String nome Date dataIncio String cidade String estado BigDecimal distancia BigDecimal custo ....}
GrailsControllers e Views
$ grails create-controller Corrida$ grails generate-views
GrailsControllers e Views
$ grails create-controller Corrida$ grails generate-views
class CorridaController { def scaffold = Corrida}
GrailsControllers e Views
scaffold: gera uma aplicação inteira para uma determinada classe de domínio, incluindo:
As views necessáriasControle de ações de um CRUD
GrailsControllers e Views
scaffold: gera uma aplicação inteira para uma determinada classe de domínio, incluindo:
As views necessáriasControle de ações de um CRUD
scaffold: não é o fim, é apenas o começo
Grails
GrailsValidações
1. Apenas inscrições de estados próximos2. O custo não pode ser maior que 1003. Toda corrida precisa de um nome4. Não existe distância negativa
GrailsValidações
1. Apenas inscrições de estados próximos2. O custo não pode ser maior que 1003. Toda corrida precisa de um nome4. Não existe distância negativa
static constraints = { nome(blank:false, maxSize:50) estado(inList:["PA", "AM", "MA", "AC"]) cidade() distancia(min:0.0) custo(min:0.0, max:100.0) }
GrailsValidações
email crediCard password
inList matches min, max
range minSize, maxSize, size
notEqual
unique url validator
GrailsValidações
Personalizando Mensagens
no arquivo: i18n/messages.properties
GrailsValidações
Personalizando Mensagens
no arquivo: i18n/messages.properties
corrida.nome.blank=Por favor, forneça um nome para corridacorrida.nome.maxSize.exceeded=O nome da corrida não pode ser maior que {3} letras
GrailsValidações
Personalizando Mensagens
no arquivo: i18n/messages.properties
corrida.nome.blank=Por favor, forneça um nome para corridacorrida.nome.maxSize.exceeded=O nome da corrida não pode ser maior que {3} letras
classe . objeto . propriedade . [propriedade] = Mensagem
GrailsRelacionamentos
Uma corrida tem muitas inscrições 1 x N
class Corrida { ..... static hasMany = [inscricao:Inscricao, ....]}
GrailsRelacionamentos
Uma corrida tem muitas inscrições 1 x N
class Corrida { ..... static hasMany = [inscricao:Inscricao, ....]}
class Inscricao { .... static belongsTo = [corrida:Corrida]}
GrailsRelacionamentos
Uma corrida tem muitas inscrições 1 x N
class Corrida { ..... static hasMany = [inscricao:Inscricao, ....]}
class Inscricao { .... static belongsTo = [corrida:Corrida]}
Força updatee delete em cascata
GrailsGrails ORMNenhuma necessidade de configuraçãoDAOS?
GrailsGrails ORMNenhuma necessidade de configuraçãoDAOS?
Dynamic domain class methods
GrailsGrails ORMNenhuma necessidade de configuraçãoDAOS?
Dynamic domain class methods
save findAlldelete find
get listcount etc
GrailsGrails ORMNenhuma necessidade de configuraçãoDAOS?
DBVisualizer: Conectar na base do Grails
Dicas
grails.orggrailsbrasil.com
Dúvidas
Grails from scratch
Gustavo Pintogustavopinto.org
twitter.com/gustavopinto