O documento introduz o framework Grails, começando por explicar os princípios ágeis e o que é ser ágil. Em seguida, apresenta a linguagem Groovy e como o Grails utiliza Groovy e padrões como convention over configuration para ser leve e produtivo. Por fim, explica os principais recursos do Grails como domain classes, controllers, validações e o ORM.
3. Introdução
Modelos ágeis
Processos, técnicas, ferramentas, whatever
O que é ser ágil?
Porque precisamos ser ágeis?
Duas coisas que influenciam na agilidade
A atitude dos membros da equipe
As ferramentas
8. Groovy
Linguagem OO baseada no Java
Mas com boas idéias de outras linguagens
Ruby, Python
Roda na JVM
Tipagem dinâmica
Onde tudo é objeto
Pode ser usada como script
Sem algumas burocracias do Java
Sintax Familiar
12. Groovy + Rails = Grails
Instalação
Primeiros comandos
Padrão de projetos
Domain Classes
Controllers e Views
Validações
Relacionamentos
Grails ORM (GORM)
13. Grails
Instalação
Download do arquivo grails.a.b.c.zip
Descopactar e declarar a variável GRAILS_HOME
Digilte: grails
14. Grails
Instalação
Download do arquivo grails.a.b.c.zip
Descopactar e declarar a variável GRAILS_HOME
Digilte: grails
gustavo@zeus:~$ grails
Welcome to Grails 1.3.2 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails 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
16. Grails
Primeiros comandos
$ grails create-app racetrack
Welcome to Grails 1.2 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: /opt/grails
...
Created Grails Application at /web/racetrack
17. Grails
Primeiros comandos
$ grails [–Dserver.port=9090] run-app
...
Base Directory: /Users/sdavis/web/racetrack
Running script /opt/grails/scripts/RunApp.groovy
Environment 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
19. C
M
Grails
V
Padrão de projetos
Lembre-se:
Convention over Configuration
20. Grails
Domain Classes
Definem os elementos da aplicação
Inscrição para a corrida
nome, email, pago?
21. Grails
Domain Classes
Definem os elementos da aplicação
Inscrição para a corrida
nome, email, pago?
$ grails create-domain-class Inscricao
22. Grails
Domain Classes
Definem os elementos da aplicação
Inscrição para a corrida
nome, email, pago?
$ grails create-domain-class Inscricao
23. Grails
Domain Classes
Definem os elementos da aplicação
Inscrição para a corrida
nome, email, pago?
$ grails create-domain-class Inscricao
class Inscricao {
String nome
Date dataAniversario
String email
Boolean pago
....
}
24. Grails
Domain Classes
Definem os elementos da aplicação
Inscrição para a corrida
nome, email, pago?
$ grails create-domain-class Inscricao
class Inscricao {
....
dateCreated
lastUpdated
....
}
25. Grails
Domain Classes
Definem os elementos da aplicação
Inscrição para a corrida
nome, email, pago?
$ grails create-domain-class Inscricao
class Inscricao {
....
dateCreated variáveis especiais
lastUpdated
....
}
26. Grails
Domain Classes
Definem os elementos da aplicação
Inscrição para a corrida
nome, email, pago?
class Inscricao {
$ grails create-domain-class Inscricao .....
def beforeInsert = {
class Inscricao { // codigo
.... }
def beforeUpdate = {
dateCreated }
lastUpdated def beforeDelete = {
.... }
} def onLoad = {
}
}
27. Grails
Domain Classes
Definem os elementos da aplicação
Inscrição para a corrida
nome, email, pago?
class Inscricao {
.....
def beforeInsert = {
// codigo
Para saber mais: }
http://grails.org/GORM+-+Mapping+DSL. def beforeUpdate = {
}
def beforeDelete = {
}
def onLoad = {
}
}
28. Grails
Domain Classes
$ grails create-domain-class Corrida
class Corrida {
String nome
Date dataIncio
String cidade
String estado
BigDecimal distancia
BigDecimal custo
....
}
29. Grails
Domain Classes
$ grails create-domain-class Corrida
class Corrida {
String nome
Date dataIncio
String cidade
String estado
BigDecimal distancia
BigDecimal custo
....
}
31. Grails
Controllers e Views
class CorridaController {
$ grails create-controller Corrida
def scaffold = Corrida
$ grails generate-views
}
32. Grails
Controllers e Views
scaffold: gera uma aplicação inteira para uma
determinada classe de domínio, incluindo:
As views necessárias
Controle de ações de um CRUD
33. Grails
Controllers e Views
scaffold: gera uma aplicação inteira para uma
determinada classe de domínio, incluindo:
As views necessárias
Controle de ações de um CRUD
scaffold: não é o fim, é apenas o começo
35. Grails
Validações
1. Apenas inscrições de estados próximos
2. O custo não pode ser maior que 100
3. Toda corrida precisa de um nome
4. Não existe distância negativa
36. Grails
Validações
1. Apenas inscrições de estados próximos
2. O custo não pode ser maior que 100
3. Toda corrida precisa de um nome
4. 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)
}
37. Grails
Validações
email crediCard password
inList matches min, max
range minSize, notEqual
maxSize, size
unique url validator
38. Grails
Validações
Personalizando Mensagens
no arquivo: i18n/messages.properties
39. Grails
Validações
Personalizando Mensagens
no arquivo: i18n/messages.properties
corrida.nome.blank=Por favor, forneça um nome para corrida
corrida.nome.maxSize.exceeded=O nome da corrida não pode ser maior
que {3} letras
40. Grails
Validações
Personalizando Mensagens
no arquivo: i18n/messages.properties
corrida.nome.blank=Por favor, forneça um nome para corrida
corrida.nome.maxSize.exceeded=O nome da corrida não pode ser maior
que {3} letras
classe . objeto . propriedade . [propriedade] = Mensagem
41. Grails
Relacionamentos
Uma corrida tem muitas inscrições
1 x N
class Corrida {
.....
static hasMany = [inscricao:Inscricao, ....]
}
42. Grails
Relacionamentos
Uma corrida tem muitas inscrições
1 x N
class Corrida {
.....
static hasMany = [inscricao:Inscricao, ....]
}
class Inscricao {
....
static belongsTo = [corrida:Corrida]
}
43. Grails
Relacionamentos
Uma corrida tem muitas inscrições
1 x N
class Corrida {
.....
static hasMany = [inscricao:Inscricao, ....] Força update
} e delete em
cascata
class Inscricao {
....
static belongsTo = [corrida:Corrida]
}