laboratório natalnet groovy e grails hugo sena. laboratório natalnet hugo sena © natalnet/ufrn...

30
Laboratório Natalnet Groovy e Grails Hugo Sena

Upload: internet

Post on 18-Apr-2015

106 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

Labora

tóri

o N

ata

lnet

Groovy e Grails

Hugo Sena

Page 2: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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

Page 3: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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.

Page 4: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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”

Page 5: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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

Page 6: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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

Page 7: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

Labora

tóri

o N

ata

lnet

Hugo Sena © NatalNet/UFRN 7

Groovy – Código Compacto

Código Java

Código Groovy

Page 8: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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

Page 9: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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.

Page 10: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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.

Page 11: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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.

Page 12: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

Labora

tóri

o N

ata

lnet

Biblioteca Virtual Simplificada

MÃOS NA MASSA

Page 13: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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

Page 14: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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:

Page 15: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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.

Page 16: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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:

Page 17: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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

Page 18: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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

Page 19: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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%")

Page 20: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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

}

Page 21: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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 }

Page 22: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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

Page 23: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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.

Page 24: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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

Page 25: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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.

Page 26: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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

} }

Page 27: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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.

Page 28: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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

}

Page 29: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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 = {}

}

Page 30: Laboratório Natalnet Groovy e Grails Hugo Sena. Laboratório Natalnet Hugo Sena © NatalNet/UFRN Groovy Linguagem Livre Scripts é o grande foco Suporte

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

}