You are on page 1of 30

Laboratrio Natalnet

Groovy e Grails

Hugo Sena

Groovy
Linguagem Livre Scripts o grande foco Suporte ao paradigma da Orientao a Objetos
Laboratrio Natalnet

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

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.

Laboratrio Natalnet

Hugo Sena NatalNet/UFRN

Groovy Caractersticas
Tipagem esttica e dinmica Sintaxe nativa para listas, arrays associativos, vetores, expresses regulares, interaes polimrficas,
Laboratrio Natalnet

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
Hugo Sena NatalNet/UFRN 4

Groovy Exemplos
Acesse o groovy atravs dos comandos:
groovyconsole grails console (depois que um projeto tenha sido criado)
Laboratrio Natalnet

Exemplos:
println Hello, World!

123+45*67
x=1 println x x = new java.util.Date() println x

Hugo Sena NatalNet/UFRN

Groovy Exemplos
Listas e Mapas
Listas podem ser representadas como vetores Mapas podem definir os ndices Exemplos:
Laboratrio Natalnet
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()
Hugo Sena NatalNet/UFRN 6

Groovy Cdigo Compacto


Cdigo Java

Laboratrio Natalnet

Cdigo Groovy

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 Hugo Sena NatalNet/UFRN 8

Laboratrio Natalnet

Grails
Groovy on Rails Framework para web baseado no Ruby on Rails, para desenvolvimento em Groovy.
Laboratrio Natalnet

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.
Hugo Sena NatalNet/UFRN 9

Grails Objetivos
Ser um framework web de alta produtividade para a plataforma Java
Sem configurao XML. Ambiente de desenvolvimento pronto pra usar.
Laboratrio Natalnet

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.
Hugo Sena NatalNet/UFRN 10

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

Laboratrio Natalnet

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.

Hugo Sena NatalNet/UFRN

11

Laboratrio Natalnet

MOS NA MASSA

Biblioteca Virtual Simplificada

Instalao do Grails
Pr-requisitos:
JAVA_HOME

Laboratrio Natalnet

Instalao:
Download Define GRAILS_HOME

Adiciona GRAILS_HOME/bin ao PATH


Digita grails xxx na linha de comando

Hugo Sena NatalNet/UFRN

13

Criando o Projeto
Para criar o projeto em Grails, basta executar o seguinte comando grails:
grails create-app library
Laboratrio Natalnet

O grails cria automaticamente os seguintes diretrios:

Hugo Sena NatalNet/UFRN

14

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
Laboratrio Natalnet

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.
Hugo Sena NatalNet/UFRN 15

Configurando a Base de Dados


Caso a base de Dados seja Mysql, o DataSource poder ser:

Laboratrio Natalnet

Hugo Sena NatalNet/UFRN

16

Rodando a aplicao
Para rodar a aplicao execute o seguinte comando grails:
grails run-app

Laboratrio Natalnet

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

Hugo Sena NatalNet/UFRN

17

Grails Paradigma MVC


Modelo
A representao "domnio" especfica da informao em que a aplicao opera.
Laboratrio Natalnet

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

Hugo Sena NatalNet/UFRN

18

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()

Laboratrio Natalnet

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%")
Hugo Sena NatalNet/UFRN 19

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
Laboratrio Natalnet

Edite o arquivo Book.groovy e adicione o seguinte cdigo:


class Book { String title int ISBN String synopsis Date publicationDate }

Hugo Sena NatalNet/UFRN

20

Grails Paradigma MVC


Controle
Processa e responde a eventos ou aes. Pode invocar alteraes no Model. Valida e filtra dados do usurio.
Laboratrio Natalnet

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 }

Hugo Sena NatalNet/UFRN

21

Scaffolding
Grails suporta Scaffolding (gera automaticamente vises e controles para operaes CRUD) dinmico e esttico.
Dinmico gerado em tempo de execuo
Laboratrio Natalnet

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


Hugo Sena NatalNet/UFRN 22

Grails Paradigma MVC


Viso
Grails suporta JSP e GSP (Groovy Server Pages). Camada responsvel pela interao com o usurio
Laboratrio Natalnet

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.
Hugo Sena NatalNet/UFRN 23

Grails Relacionamentos
One-to-one,
class Face { Nose nose } class Nose {static belongsTo = Face }

one-to-many,

Laboratrio Natalnet

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()
Hugo Sena NatalNet/UFRN 24

Grails convention over configuration


Propriedade transients
Define os atributos que no sero persistidos no banco Ex:
Laboratrio Natalnet
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.
Hugo Sena NatalNet/UFRN 25

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
Laboratrio Natalnet

Exemplo:
class Book { ... static constraints = { title(blank:false, nullable:false, size:5..150) ISBN() synopsis(widget:'textarea') publicationDate() author() } }

Hugo Sena NatalNet/UFRN

26

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' } } }
Laboratrio Natalnet

As vezes necessrio apagar a tabela para que as alteraes sejam realizadas com sucesso.

Hugo Sena NatalNet/UFRN

27

Grails Propriedades de Controller


allowedMethods
Limita o acesso as aes do controller baseado no mtodo de requisio HTTP. Ex:
Laboratrio Natalnet
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()] } } Hugo Sena NatalNet/UFRN 28

Grails Propriedades de Controller


redirect
Redireciona o fluxo de uma ao para outra usando um redirect HTTP

flash
Laboratrio Natalnet

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 = {} }
Hugo Sena NatalNet/UFRN 29

Grails Propriedades de Controller


params
Um mapa (hash) multi-dimensional que guarda os dados enviados pelos formulrios

render
Laboratrio Natalnet

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')]) } }

Hugo Sena NatalNet/UFRN

30