300 likes | 459 Views
Groovy e Grails. Hugo Sena. 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.
E N D
Groovy e Grails Hugo Sena
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
Groovy • Basicamente um superconjunto da Linguagem Java • Pode-se simplesmenterenomear um arquivo .java para .groovy e iráfuncionar (issoprovocasupresaemalgumaspessoas). • Torna as curvas de aprendizadoparausuários Java, praticamente 0, poiselespodemcomeçar com a sintaxe Java e migrargradualmentepara Groovy. • Suportenativoparalinguagens de Marcaçãocomo XML e HTML, com suporte a DOM.
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”
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 = newjava.util.Date() • println x
Groovy – Exemplos • Listas e Mapas • Listas podem ser representadas como vetores • Mapas podem definir os índices • Exemplos: • myList = [1776, -1, 33, 99, 0, 928734928763]printlnmyList[0]printlnmyList.size() • scoreMap = [ "Brett": 100, "Pete": "Did not finish", "Andrew": 86.87934 ]printlnscoreMap[0]printlnscoreMap.size()println scoreMap["Pete"] println scoreMap.PetescoreMap["Pete"] = 3printlnscoreMap.Pete • emptyMap = [:] emptyList = []printlnemptyMap.size() printlnemptyList.size()
Groovy – Código Compacto Código Java Código Groovy
Groovy – Closures • GroovyClosures: • 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 • defsquare = { numberToSquare -> numberToSquare * numberToSquare} printsquare.call(2) • fullString = "“orderParts = ["BUY", 200, "Hot Dogs", "1"] orderParts.each { fullString += it + " " } printlnfullString
Grails • GroovyonRails • Framework para web baseado no RubyonRails, 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.
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.
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.
MÃOS NA MASSA Biblioteca Virtual Simplificada
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
Criando o Projeto • Para criar o projeto em Grails, basta executar o seguinte comando grails: • grailscreate-applibrary • O grails cria automaticamente os seguintes diretórios:
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.
Configurando a Base de Dados • Caso a base de Dados seja Mysql, o DataSource poderá ser:
Rodando a aplicação • Para rodar a aplicação execute o seguinte comando grails: • grailsrun-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: • grailswarprodLibrary.war
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 ObjectRelationalMapping) • 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
Grails – Paradigma MVC • Modelo • Métodos carregados (Mixin) • O método save() salva o objeto no banco de dados • def book = newBook(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. • defbookCount = 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%")
Criando uma Classe de Domínio • Entre no diretório raiz do projeto e utilize o comando grails: • grailscreate-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 ISBN String synopsis Date publicationDate}
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: • grailscreate-controller Book • Apenas cria um documento com a declaração do BookController na pasta grails-app/controller do projeto Grails • No nosso caso: • classBookController { defscaffold = true}
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: • grailsgenerate-all Book • Permite edição das visões e controle
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.
Grails – Relacionamentos • One-to-one, • class Face { Nose nose } class Nose {staticbelongsTo = Face } • one-to-many, • classAuthor { statichasMany = [ books : Book ] String name} • many-to-one, • class Book { ...staticbelongsTo = AuthorAuthorauthor} • many-to-many (Scaffold não funciona) • class Aluno { statichasMany = [disciplinas:Disciplina] } • class Disciplina { statichasMany = [alunos:Aluno] } • new Aluno(..).addDisciplina(Disciplina.get(..)).save() • new Disciplina(..).addAluno(Aluno.get(..)).save()
Grails – convention over configuration • Propriedade transients • Define os atributos que não serão persistidos no banco • Ex:class Book { ...statictransients = [ "digitalCopy" ] File digitalCopy} • Método toString • Define como um objeto será tratado quando houver um relacionamento • Ex:classAuthor { ... String toString() { return "$name" } } • Um scaffold da classe Book que tem relacionamento com Author irá exibir o título do livro no relacionamento.
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 { ...staticconstraints = {title(blank:false, nullable:false, size:5..150) ISBN()synopsis(widget:'textarea')publicationDate()author() } }
Grails – Closure de Modelo - mapping • A propriedade estática mappingé usada para ensinar ao GORM como ele deve mapear o modelo. • Exemplo: • class Book { ...staticmapping = { columns { synopsistype:'text' } } } • As vezes é necessário apagar a tabela para que as alterações sejam realizadas com sucesso.
Grails – Propriedades de Controller • allowedMethods • Limita o acesso as ações do controller baseado no método de requisição HTTP. • Ex: classPersonController { // action1 pode ser acessada via método POST // action2 não tem restrições // action3 pode ser acessada via método POST ou DELETE staticallowedMethods = 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: classBookController { staticdefaultAction = "list" deflist = { [books:Book.list()] } }
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 = {} }
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:classBookController {def show { def book = Book.get(params.id) } def stephen = { render(view: "show", model: [book: new Book(author: 'Stephen King', name: 'Carrie')]) } }