Labora
tóri
o N
ata
lnet
Groovy e Grails
Hugo Sena
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 2
Groovy
• Linguagem Livre
• Scripts é o grande foco
• Suporte ao paradigma da Orientação a Objetos
• Roda na JVM
• Possui grande integração com a plataforma Java– Uso de frameworks próprios de Java são facilmente portáveis
para Groovy:• Ex: Hibernate, Spring, etc.
• Desenvolvida como alternativa a Linguagem Java
• Possui características de Python, Ruby e Smalltalk
• Compila dinamicamente para bytecodes Java
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 3
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 usuários Java, praticamente 0, pois eles podem começar com a sintaxe Java e migrar gradualmente para Groovy.
• Suporte nativo para linguagens de Marcação como XML e HTML, com suporte a DOM.
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 4
Groovy – Características
• Tipagem estática e dinâmica
• Sintaxe nativa para listas, arrays associativos, vetores, expressões regulares, interações polimórficas,
• Closures - blocos de código reutilizáveis
• Sobrecarga de operadores– Vantagem: Simplifica o trabalho com Collections e Maps
– Desvantagem: Pode dificultar o entendimento do código
• Extensão da biblioteca padrão da Java através do GDK– Ex: Desenvolvimento bastante simples de interfaces com o
usuário
• Operador de navegação seguro “?”– Verifica automaticamente se um elemento é nulo.
– Ex: “objeto?.metodo()” ou “objeto?.campo”
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 5
Groovy – Exemplos
• Acesse o groovy através 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
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 6
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.PetescoreMap["Pete"] = 3println scoreMap.Pete
• emptyMap = [:] emptyList = []println emptyMap.size() println emptyList.size()
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 7
Groovy – Código Compacto
Código Java
Código Groovy
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 8
Groovy – Closures
• Groovy Closures:– Uma closure é uma ou mais linhas de código cercadas por
chaves. A principal diferença entre uma closure e um método é que a closure não necessita de uma classe ou um nome de método.
– 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
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 9
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 “convenção por codificação”– Classes de domínio tem seus atributos mapeados como campos
no BD
– Utiliza variáveis reservadas para identificar configurações
• Esconde muito detalhes de configuração que não interessam ao desenvolvedor
• Grails foi desenvolvido para ser fácil de aprender, fácil de desenvolver aplicações e ser extensível, buscando oferecer consistência e características poderosas.
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 10
Grails – Objetivos
• Ser um framework web de alta produtividade para a plataforma Java– Sem configuração XML.
– Ambiente de desenvolvimento pronto pra usar.
– Funcionalidades disponíveis através de mixins.• Mixins são métodos que são adicionados dinamicamente a uma
classe quando ela é compilada.
• Permite ao desenvolvedor realizar operações sem precisar implementar interfaces ou estender classes base.
• Ex: Métodos save, delete e find das classes de Domínio.
• Re-uso de tecnologias Java tais como Spring e Hibernate através de simples interfaces.
• Ser um framework consistente que reduz a confusão das configurações e é fácil de aprender.
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 11
Grails – Características
• Oferece a documentação das partes do framework que interessam ao usuário.
• Criação de Templates facilitada pelo uso do GSP (Groovy Server Pages).– GSP possui sintaxe bastante parecida com o JSP
• Permite a criação de Bibliotecas de Tags.
• Suporta AJAX.
• Suporta JSP
• Provê um modo de desenvolvimento completo, incluindo servidor web e carregamento dinâmico de recursos.
• Utiliza o paradigma MVC.
Labora
tóri
o N
ata
lnet
Biblioteca Virtual Simplificada
MÃOS NA MASSA
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 13
Instalação do Grails
• Pré-requisitos:– JAVA_HOME
• Instalação:– Download
– Define GRAILS_HOME
– Adiciona GRAILS_HOME/bin ao PATH
– Digita “grails xxx” na linha de comando
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 14
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 diretórios:
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 15
Configurando a Base de Dados
• O arquivo DataSource.groovy da pasta grails-app/conf contêm um conjunto de closures que armazenam as configurações da base de dados
• O Grails disponibiliza 3 ambientes diferentes para a aplicação web:– Development
– TestData
– Production
• Por padrão todas as bases de dados são configuradas com uma base de dados HSQLDB persistindo na memória.– Ideal para testar, mas inviável para realizar o deployment
– Pode ser opcional
• Consiste em apenas mudar apenas alguns valores e colocar o arquivo jar do Driver na pasta lib.
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 16
Configurando a Base de Dados
• Caso a base de Dados seja Mysql, o DataSource poderá ser:
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 17
Rodando a aplicação
• Para rodar a aplicação execute o seguinte comando grails:– grails run-app
• O grails traz embutido o servidor de aplicações jetty e o banco HSQLDB que salva os dados na memória RAM.– No nosso caso estamos utilizando o mysql.
• Acesse:– http://localhost:8080/library/
• Grails permite a migração da aplicação, gerando arquivos de deploy WAR:– grails war prod Library.war
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 18
Grails – Paradigma MVC
• Modelo– A representação "domínio" específica da informação em que a
aplicação opera.• Ex: aluno, professor e turma fazem parte do domínio de um
sistema acadêmico.
– Classes de Domínio• São persistidas no banco de dados usando GORM (Grails Object
Relational Mapping)
• Classes de domínio são salvas no diretório de grails-app/domain
• Apenas isto é necessário para que a persistência dessa classe seja gerenciada pelo Grails, o resto o GORM faz a “mágica”
• O GORM adiciona vários métodos estáticos e instanciados para realizar a persistência
• Anti-Padrão: Active-Record
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 19
Grails – Paradigma MVC
• Modelo– Métodos carregados (Mixin)
• O método 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 método delete() apaga o objeto no banco de dados– def book = Book.findByTitle("The Da Vinci Code")
book.delete()
• O método count() retorna o número de registros no banco de dados para uma determinada classe.
– def bookCount = Book.count()
• O método find(parâmetro) retorna o primeiro objeto da base de dados que satisfaz o parâmetro (Sintaxe HQL)
– def book = Book.find("from Book b where b.title = ?", [ 'The Da Vinci Code' ])
• O método findBy*() retorna o primeiro objeto da base de dados que satisfaz um padrão específico.
– def book = Book.findByTitle("The Da Vinci Code")
– def book = Book.findByTitleLike("%Da Vinci%")
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 20
Criando uma Classe de Domínio
• Entre no diretório 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 código:– class Book {
String title int ISBNString synopsisDate publicationDate
}
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 21
Grails – Paradigma MVC
• Controle– Processa e responde a eventos ou ações.
– Pode invocar alterações no Model.
– Valida e filtra dados do usuário.
– Para criar um controller basta executar o comando grails:• grails create-controller Book
– Apenas cria um documento com a declaração do BookController na pasta grails-app/controller do projeto Grails
– No nosso caso:• class BookController {
def scaffold = true }
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 22
Scaffolding
• Grails suporta Scaffolding (gera automaticamente visões e controles para operações CRUD) dinâmico e estático.– Dinâmico – gerado em tempo de execução
• Qualquer classe de domínio pode ser scaffolded, basta criar um controller como o mostrado no slide anterior
• Criando apenas este controller já é possível realizar operações CRUD em: http://localhost:8080/library/book
• Não permite edição das visões e controle
– Estático• Gera os arquivos:
– Templates de visão - 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 estático basta executar o comando grails:– grails generate-all Book
• Permite edição das visões e controle
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 23
Grails – Paradigma MVC
• Visão– Grails suporta JSP e GSP (Groovy Server Pages).
– Camada responsável pela interação com o usuário
– Ex: Listar todos os livros da Classe de Domínio Book para o usuário
– Este arquivo deve ser salvo no seguinte diretório: grails-app/views/book/list.gsp do projeto Grails
– Este local é mapeado pelo controlador BookController como a ação list.
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 24
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 não 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()
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 25
Grails – convention over configuration
• Propriedade transients – Define os atributos que não serão persistidos no banco
– Ex:class Book { ... static transients = [ "digitalCopy" ] File digitalCopy}
• Método 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 título do livro no relacionamento.
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 26
Grails – Closure de Modelo - constraints
• Variável reservada constraints:– Permite a definição declarativa de constantes de validação
– Permite definir a ordem dos campos dos formulários quando se usa scaffold
– Exemplo:• class Book {
...static constraints = {
title(blank:false, nullable:false, size:5..150)ISBN()synopsis(widget:'textarea')publicationDate()author()
} }
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 27
Grails – Closure de Modelo - mapping
• A propriedade estática mapping é usada para ensinar ao GORM como ele deve mapear o modelo.
• Exemplo:– class Book {
...static mapping = {
columns { synopsis type:'text'
} }
}
– As vezes é necessário apagar a tabela para que as alterações sejam realizadas com sucesso.
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 28
Grails – Propriedades de Controller
• allowedMethods– Limita o acesso as ações do controller baseado no método de
requisição HTTP.
– Ex: class PersonController {
// action1 pode ser acessada via método POST // action2 não tem restrições// action3 pode ser acessada via método POST ou DELETE static allowedMethods = action1:'POST', action3:['POST', 'DELETE'] def action1 = { … } def action2 = { … } def action3 = { … }
}
• defaultAction
– Permite definir a ação padrão que será chamada caso nenhuma ação seja especificada na URL.
– Ex: class BookController {
static defaultAction = "list" def list = { [books:Book.list()] }
}
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 29
Grails – Propriedades de Controller
• redirect– Redireciona o fluxo de uma ação para outra usando um redirect
HTTP
• flash– Guarda objetos de sessão para apenas a próxima requisição,
destruindo depois que a requisição é completada.
– Muito útil para exibir mensagens de sucesso ou erro.
• Ex:• class BookController {
def index = { flash.message = "Welcome!" redirect(action:home)
} def home = {}
}
Labora
tóri
o N
ata
lnet
Hugo Sena © NatalNet/UFRN 30
Grails – Propriedades de Controller
• params– Um mapa (hash) multi-dimensional que guarda os dados
enviados pelos formulários
• render– Permite criar várias formas de resposta, desde simples texto,
até visões 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')])}
}