Você está na página 1de 30

L

a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Groovy e Grails
Hugo Sena
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Groovy
Linguagem Livre
Scripts o grande foco
Suporte ao paradigma da Orientao a Objetos
Roda na JVM
Possui grande integrao com a plataforma Java
Uso de frameworks prprios de Java so facilmente portveis
para Groovy:
Ex: Hibernate, Spring, etc.
Desenvolvida como alternativa a Linguagem Java
Possui caractersticas de Python, Ruby e Smalltalk
Compila dinamicamente para bytecodes Java

2
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Groovy
Basicamente um superconjunto da Linguagem Java
Pode-se simplesmente renomear um arquivo .java para
.groovy e ir funcionar (isso provoca supresa em algumas
pessoas ).
Torna as curvas de aprendizado para usurios Java,
praticamente 0, pois eles podem comear com a sintaxe
Java e migrar gradualmente para Groovy.
Suporte nativo para linguagens de Marcao como XML e
HTML, com suporte a DOM.

3
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Groovy Caractersticas
Tipagem esttica e dinmica
Sintaxe nativa para listas, arrays associativos, vetores,
expresses regulares, interaes polimrficas,
Closures - blocos de cdigo reutilizveis
Sobrecarga de operadores
Vantagem: Simplifica o trabalho com Collections e Maps
Desvantagem: Pode dificultar o entendimento do cdigo
Extenso da biblioteca padro da Java atravs do GDK
Ex: Desenvolvimento bastante simples de interfaces com o
usurio
Operador de navegao seguro ?
Verifica automaticamente se um elemento nulo.
Ex: objeto?.metodo() ou objeto?.campo
4
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Groovy Exemplos
Acesse o groovy atravs dos comandos:
groovyconsole
grails console (depois que um projeto tenha sido criado)
Exemplos:
println Hello, World!

123+45*67

x = 1
println x

x = new java.util.Date()
println x

5
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Groovy Exemplos
Listas e Mapas
Listas podem ser representadas como vetores
Mapas podem definir os ndices
Exemplos:
myList = [1776, -1, 33, 99, 0, 928734928763]
println myList[0]
println myList.size()

scoreMap = [ "Brett": 100, "Pete": "Did not finish", "Andrew": 86.87934 ]
println scoreMap[0]
println scoreMap.size()
println scoreMap["Pete"]
println scoreMap.Pete
scoreMap["Pete"] = 3
println scoreMap.Pete

emptyMap = [:]
emptyList = []
println emptyMap.size()
println emptyList.size()


6
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Groovy Cdigo Compacto
7
Cdigo Java









Cdigo Groovy
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Groovy Closures
Groovy Closures:
Uma closure uma ou mais linhas de cdigo cercadas por
chaves. A principal diferena entre uma closure e um mtodo
que a closure no necessita de uma classe ou um nome de
mtodo.

Exemplos:
square = { it * it }
println square(9)
z = [ 1, 2, 3, 4 ].collect(square)
print z

def square = { numberToSquare ->
numberToSquare * numberToSquare
}
print square.call(2)

fullString = "
orderParts = ["BUY", 200, "Hot Dogs", "1"]
orderParts.each {
fullString += it + " "
}
println fullString
8
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Grails
Groovy on Rails
Framework para web baseado no Ruby on Rails, para
desenvolvimento em Groovy.
Pretende ser um framework de alta produtividade seguindo
o paradigma de conveno por codificao
Classes de domnio tem seus atributos mapeados como campos
no BD
Utiliza variveis reservadas para identificar configuraes
Esconde muito detalhes de configurao que no interessam
ao desenvolvedor
Grails foi desenvolvido para ser fcil de aprender, fcil de
desenvolver aplicaes e ser extensvel, buscando oferecer
consistncia e caractersticas poderosas.
9
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Grails Objetivos
Ser um framework web de alta produtividade para a
plataforma Java
Sem configurao XML.
Ambiente de desenvolvimento pronto pra usar.
Funcionalidades disponveis atravs de mixins.
Mixins so mtodos que so adicionados dinamicamente a uma
classe quando ela compilada.
Permite ao desenvolvedor realizar operaes sem precisar
implementar interfaces ou estender classes base.
Ex: Mtodos save, delete e find das classes de Domnio.
Re-uso de tecnologias Java tais como Spring e Hibernate
atravs de simples interfaces.
Ser um framework consistente que reduz a confuso das
configuraes e fcil de aprender.

10
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Grails Caractersticas
Oferece a documentao das partes do framework que
interessam ao usurio.
Criao de Templates facilitada pelo uso do GSP (Groovy
Server Pages).
GSP possui sintaxe bastante parecida com o JSP
Permite a criao de Bibliotecas de Tags.
Suporta AJAX.
Suporta JSP
Prov um modo de desenvolvimento completo, incluindo
servidor web e carregamento dinmico de recursos.
Utiliza o paradigma MVC.


11
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Biblioteca Virtual Simplificada
MOS NA MASSA
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Instalao do Grails
Pr-requisitos:
JAVA_HOME

Instalao:
Download
Define GRAILS_HOME
Adiciona GRAILS_HOME/bin ao PATH
Digita grails xxx na linha de comando

13
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Criando o Projeto
Para criar o projeto em Grails, basta executar o seguinte
comando grails:
grails create-app library
O grails cria automaticamente os seguintes diretrios:

14
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Configurando a Base de Dados
O arquivo DataSource.groovy da pasta grails-app/conf
contm um conjunto de closures que armazenam as
configuraes da base de dados
O Grails disponibiliza 3 ambientes diferentes para a
aplicao web:
Development
TestData
Production
Por padro todas as bases de dados so configuradas com
uma base de dados HSQLDB persistindo na memria.
Ideal para testar, mas invivel para realizar o deployment
Pode ser opcional
Consiste em apenas mudar apenas alguns valores e colocar
o arquivo jar do Driver na pasta lib.

15
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Configurando a Base de Dados
Caso a base de Dados seja Mysql, o DataSource poder ser:
16
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Rodando a aplicao
Para rodar a aplicao execute o seguinte comando grails:
grails run-app
O grails traz embutido o servidor de aplicaes jetty e o
banco HSQLDB que salva os dados na memria RAM.
No nosso caso estamos utilizando o mysql.
Acesse:
http://localhost:8080/library/

Grails permite a migrao da aplicao, gerando arquivos de
deploy WAR:
grails war prod Library.war

17
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Grails Paradigma MVC
Modelo
A representao "domnio" especfica da informao em que a
aplicao opera.
Ex: aluno, professor e turma fazem parte do domnio de um
sistema acadmico.
Classes de Domnio
So persistidas no banco de dados usando GORM (Grails Object
Relational Mapping)
Classes de domnio so salvas no diretrio de grails-app/domain
Apenas isto necessrio para que a persistncia dessa classe seja
gerenciada pelo Grails, o resto o GORM faz a mgica
O GORM adiciona vrios mtodos estticos e instanciados para
realizar a persistncia
Anti-Padro: Active-Record



18
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Grails Paradigma MVC
Modelo
Mtodos carregados (Mixin)
O mtodo save() salva o objeto no banco de dados
def book = new Book(title: "The Da Vinci Code", author: Author.findByName("Dan
Brown"))
book.save()
O mtodo delete() apaga o objeto no banco de dados
def book = Book.findByTitle("The Da Vinci Code")
book.delete()
O mtodo count() retorna o nmero de registros no banco de dados para
uma determinada classe.
def bookCount = Book.count()
O mtodo find(parmetro) retorna o primeiro objeto da base de dados que
satisfaz o parmetro (Sintaxe HQL)
def book = Book.find("from Book b where b.title = ?", [ 'The Da Vinci Code' ])
O mtodo findBy*() retorna o primeiro objeto da base de dados que satisfaz
um padro especfico.
def book = Book.findByTitle("The Da Vinci Code")
def book = Book.findByTitleLike("%Da Vinci%")


19
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Criando uma Classe de Domnio
Entre no diretrio raiz do projeto e utilize o comando grails:
grails create-domain-class Book
Este comando cria um arquivo chamado Book.groovy na pasta
grails-app/domain

Edite o arquivo Book.groovy e adicione o seguinte cdigo:
class Book {
String title
int ISBN
String synopsis
Date publicationDate
}

20
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Grails Paradigma MVC
Controle
Processa e responde a eventos ou aes.
Pode invocar alteraes no Model.
Valida e filtra dados do usurio.
Para criar um controller basta executar o comando grails:
grails create-controller Book
Apenas cria um documento com a declarao do BookController na
pasta grails-app/controller do projeto Grails
No nosso caso:
class BookController {
def scaffold = true
}
21
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Scaffolding
Grails suporta Scaffolding (gera automaticamente vises e
controles para operaes CRUD) dinmico e esttico.
Dinmico gerado em tempo de execuo
Qualquer classe de domnio pode ser scaffolded, basta criar um
controller como o mostrado no slide anterior
Criando apenas este controller j possvel realizar operaes
CRUD em: http://localhost:8080/library/book
No permite edio das vises e controle
Esttico
Gera os arquivos:
Templates de viso - list.gsp, create.gsp, edit.gsp e show.gsp na pasta
grails-app/views/book
Controller - BookController.groovy na pasta grails-app/controllers
Para realizar o scaffold esttico basta executar o comando grails:
grails generate-all Book
Permite edio das vises e controle



22
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Grails Paradigma MVC
Viso
Grails suporta JSP e GSP (Groovy Server Pages).
Camada responsvel pela interao com o usurio
Ex: Listar todos os livros da Classe de Domnio Book para o
usurio





Este arquivo deve ser salvo no seguinte diretrio:
grails-app/views/book/list.gsp do projeto Grails
Este local mapeado pelo controlador BookController como a
ao list.


23
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Grails Relacionamentos
One-to-one,
class Face { Nose nose } class Nose {static belongsTo = Face }
one-to-many,
class Author {
static hasMany = [ books : Book ]
String name
}
many-to-one,
class Book {
...
static belongsTo = Author
Author author
}
many-to-many (Scaffold no funciona)
class Aluno {
static hasMany = [disciplinas:Disciplina]
}
class Disciplina { static hasMany = [alunos:Aluno] }
new Aluno(..).addDisciplina(Disciplina.get(..)).save()
new Disciplina(..).addAluno(Aluno.get(..)).save()

24
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Grails convention over configuration
Propriedade transients
Define os atributos que no sero persistidos no banco
Ex:
class Book {
...
static transients = [ "digitalCopy" ]
File digitalCopy
}
Mtodo toString
Define como um objeto ser tratado quando houver um
relacionamento
Ex:
class Author {
...
String toString() { return "$name" }
}
Um scaffold da classe Book que tem relacionamento com
Author ir exibir o ttulo do livro no relacionamento.
25
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Grails Closure de Modelo - constraints
Varivel reservada constraints:
Permite a definio declarativa de constantes de validao
Permite definir a ordem dos campos dos formulrios quando se
usa scaffold
Exemplo:
class Book {
...
static constraints = {
title(blank:false, nullable:false, size:5..150)
ISBN()
synopsis(widget:'textarea')
publicationDate()
author()
}
}
26
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Grails Closure de Modelo - mapping
A propriedade esttica mapping usada para ensinar ao
GORM como ele deve mapear o modelo.
Exemplo:
class Book {
...
static mapping = {
columns {
synopsis type:'text'
}
}
}
As vezes necessrio apagar a tabela para que as alteraes
sejam realizadas com sucesso.
27
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Grails Propriedades de Controller
allowedMethods
Limita o acesso as aes do controller baseado no mtodo de
requisio HTTP.
Ex:
class PersonController {
// action1 pode ser acessada via mtodo POST
// action2 no tem restries
// action3 pode ser acessada via mtodo POST ou DELETE
static allowedMethods = action1:'POST', action3:['POST', 'DELETE']
def action1 = { }
def action2 = { }
def action3 = { }
}
defaultAction
Permite definir a ao padro que ser chamada caso nenhuma
ao seja especificada na URL.
Ex:
class BookController {
static defaultAction = "list"
def list = { [books:Book.list()] }
}
28
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Grails Propriedades de Controller
redirect
Redireciona o fluxo de uma ao para outra usando um redirect
HTTP
flash
Guarda objetos de sesso para apenas a prxima requisio,
destruindo depois que a requisio completada.
Muito til para exibir mensagens de sucesso ou erro.
Ex:
class BookController {
def index = {
flash.message = "Welcome!"
redirect(action:home)
}
def home = {}
}
29
L
a
b
o
r
a
t

r
i
o

N
a
t
a
l
n
e
t

Hugo Sena NatalNet/UFRN
Grails Propriedades de Controller
params
Um mapa (hash) multi-dimensional que guarda os dados
enviados pelos formulrios
render
Permite criar vrias formas de resposta, desde simples texto,
at vises e templates
Ex:
class BookController {
def show {
def book = Book.get(params.id)
}
def stephen = {
render(view: "show", model: [book: new Book(author: 'Stephen King', name: 'Carrie')])
}
}

30

Você também pode gostar