SlideShare ist ein Scribd-Unternehmen logo
1 von 74
Downloaden Sie, um offline zu lesen
Groovy & Grails
Desenvolvimento ágil para
    plataforma Java




       Luís Bruno P. Nascimento
         luisbrunu@gmail.com
Enucomp 2010
●   Groovy e Grails – Parte II




    Introdução ao Grails
Introdução ao Grails
●   Java EE
    ●   Java Enterprise Edition – Java Edição Empresarial
        –   Plataforma de programação para servidores na
            linguagem Java.
    ●   Alvo de várias críticas relacionadas à complexidade
        no desenvolvimento de aplicações web;
        –   Muita configuração XML;
        –   Muito trabalho repetitivo;
        –   Fazer muito para criar pouco;
    ●   Daí surge o Grails
O que é Grails?
●   Uma Web framework baseado em RoR para
    desenvolvimento de aplicações Java utilizando
    a linguagem Groovy.
    ●   Framework de ALTA produtividade;
    ●   Full Stack web framework;
    ●   Programação por Convenção;
    ●   Don’t Repeat Yourself (DRY);
●   Lançamento versão 0.1, Março/2006;
●   Ultima versão: 1.3.5
Grails
●   Framework de alta produtividade:
    ●   Em questão de minutos você cria toda a estrutura
        de banco de dados, as telas HTML e CSS, tudo já
        funcionando.
    ●   CRUD fácil
        –   Com apenas alguns comandos, a framework gera toda a
            estrutura de um CRUD;
Full Stack web Framework
●   Após instalado, o Grails já vem com todos os
    componentes necessários para que possamos
    iniciar o trabalho;
    ●   É completo, pois já vem com diversos
        componentes pré-configurados para o uso:
        –   Spring;
        –   Hibernate;
        –   Apache;
        –   HSQLDB;
        –   E muitos outros;
Convenção sobre configuração
●   Programar seguindo convenções da framework;
    ●   Essas convenções definem o padão de
        comportamento da framework;
    ●   Principal motivação: programar fazendo
        configurações de arquivos XML;
    ●   Se não quisermos configurar nada, basta seguir as
        convenções da framework;
    ●   É dessa forma que o Grails pode ajudar na
        programação, dando mais praticidade no
        desenvolvimento e também mais agilidade.
DRY
●   DRY - Don't Repeat Yourself – Não se repita
●   No desenvolvimento de aplicações web, boa
    parte do trabalho feito pelo desenvolvedor é
    repetitiva;
●   Agora o framework passa a farzer essas
    tarefas repetitivas;
●   Código mais enxuto;
Instalando
●   Faça o download da ultima versão do Grails:
    http://www.grails.org/Download
●   Para instalar, basta descompactar o arquivo
    grails-1.3.5.zip em qualquer diretório;
●   Definir as variáveis de ambiente e o PATH;
●   Para testar, basta digitar grails no terminal:
      >>Welcome to Grails 1.3.5 - http://grails.org/
      >>Licensed under Apache Standard License 2.0
Ambientes para desenvolvimento
●   Grails plugin para Eclipse
    ●   www.grails.org/Eclipse+IDE+Integration
●   Netbeans já vem com suporte total à Groovy e
    Grails;
●   Os editores de texto em geral, já resolvem
    nosso problema;
    ●   Gedit;
    ●   JEdit
    ●   Notpad++
Grails Comandos
>> grails help
●   Lista todos os comandos que podemos
    executar na linha de comando em Grails:
    ●   grails create-app
    ●   grails generate-controller
    ●   grails generate-views
    ●   grails install-plugins
    ●   ...
Atualizando Grails
●   Para atualizar devemos fazer o download da
    versão mais nova, descompactar e trocar as
    variáveis definidas.
●   Dentro do projeto:
    ●   >>grails upgrade
        –   Esse comando atualizará o seu projeto para a utilização
            dos recursos da nova versão do grails;
Projeto
●   Livraria Virtual
Criando a aplicação
●   >>grails create-app livraria
    Welcome to Grails 1.3.4 - http://grails.org/
    Licensed under Apache Standard License 2.0
    Grails home is set to: /opt/Groovy/grails-1.3.4

    Base Directory: /opt/Groovy/web
    Resolving dependencies...
    Dependencies resolved in 1653ms.
    Running script /opt/Groovy/grails-1.3.4/scripts/CreateApp_.groovy
    Environment set to development
      [mkdir] Created dir: /opt/Groovy/web/livraria/src
      [mkdir] Created dir: /opt/Groovy/web/livraria/src/java
      [mkdir] Created dir: /opt/Groovy/web/livraria/src/groovy
      [mkdir] Created dir: /opt/Groovy/web/livraria/grails-app
      [mkdir] Created dir: /opt/Groovy/web/livraria/grails-app/controllers
      [mkdir] Created dir: /opt/Groovy/web/livraria/grails-app/services
      [mkdir] Created dir: /opt/Groovy/web/livraria/grails-app/domain
      .......
Diretórios da aplicação


              M
              V
              C
Diretórios da aplicação
●   Grails-app é o diretório principal. É onde se
    encontra as classes modelos, os controllers, as
    views, traduções...
    ●   conf – Possui arquivos de configuração da aplicação
        –   config.groovy – várias configurações da aplicação como
            ambientes de execução;
        –   DataSource.groovy – configurações da base de dados;
        –   Bootstrap.groovy – habilita códigos a serem executados
            quando a aplicação é estartada;
        –   URLMappings.groovy – alterar como as requisições são
            tratadas através de URLs.
Diretórios da Aplicação
●   I18n
    ●   Recursos para internacionalização e mensagens de
        erro.
        –   Traduções e/ou customização de mensagens
●   taglib
    ●   Tags criadas pelo usuário.
        –   Tags usadas em páginas GSP
Diretórios da aplicação
●   controllers
    ●   Diretórios onde ficam os controllers da aplicação;
    ●   Tratam de requisições web;
●   doimain
    ●   Os modelos da plicação;
    ●   Classes onde serão mapeados os objetos e
        propriedades do mundo OO para o mundo
        relacional (tabelas, colunas);
        –   GORM – Grails Object Relational Mapping;
Diretórios da aplicação
●   views
    ●   Arquivos GSP – Groovy Server Pages;
        –   Páginas HTML que suportam código em Groovy;
        –   Similar às JSP;
    ●   As visões são responsáveis por mostrar o retorno
        da das requisições para o browser;
Executando...
>>cd livraria
>>grails run-app
  Welcome to Grails 1.3.4 - http://grails.org/
  Licensed under Apache Standard License 2.0
  Grails home is set to: /opt/Groovy/grails-1.3.4

  Base Directory: /opt/Groovy/web/livraria
  Resolving dependencies...
  Dependencies resolved in 1116ms.
  Running script /opt/Groovy/grails-1.3.4/scripts/RunApp.groovy
  Environment set to development
     [mkdir] Created dir: /opt/Groovy/web/livraria/target/classes
   [groovyc] Compiling 7 source files to /opt/Groovy/web/livraria/target/classes
      [copy] Copying 1 file to /opt/Groovy/web/livraria/target/classes
    [delete] Deleting directory /home/bruno/.grails/1.3.4/projects/livraria/tomcat
  Running Grails application..
  Server running. Browse to http://localhost:8080/livraria
Executando...
Executando...
●   Para remover o nome do projeto do fim da URL, como
    normalmente deve ser no modo de produção, você seta
    a propriedade app.nome em application.properties, o
    diretório raiz da nossa aplicação;
    ●   app.nome=/
●   Para rodar a aplicação em outra porta:
    ●   » grails run-app -Dserver.port=9090
●   Para parar a aplicação:
    ●   Ctrl + C
Ambientes de execução
●   development(dev)
    ●   Em modo de desenvolvimento;
    ●   Padrão;
●   production(prod)
    ●   Em modo de produção;
    ●   As alterações são salvas no banco de dados;
    ●   » grails prod run-app
●   test(test)
    ●   Ambiente para testes
MVC em Grails
●   MVC é um padrão de projeto, para outros, uma
    arquitetura de software no qual a aplicação
    web é dividida em camadas para separar a
    lógica de negócio da apresentação dos dados;
    ●   Model – Modelo → domains;
    ●   View – Visão → views;
    ●   Controller – Controlador → controllers;
MVC em Grails
GORM
●   GORM é um componente do Grails para
    implementar o ORM – Mapeamento Objeto
    Relacional;
●   O GORM que cuida da parte do mapeamento
    das classes -domains- para se tornarem
    tabelas;
    ●   As classes de domínio são tabelas;
    ●   Os atributos os campos;
Classes de domínio
●   Classes de domínio são a força vital de uma aplicação
    grails. Elas definem as “coisas” que você está controlando.
    –   As tabelas do banco de dados são criadas para as classes de
        domínio correspondente.
●   » grails create-domain-class <Nome do Modelo>
    –   Gerar uma classe de domínio em /grails-app/domain/;
●   No contexto da nossa aplicação, os domínios existentes
    são:
    –   Livro;
    –   Categoria;
    –   Autor;
    –   Usuário;
Classes de domínio
●   » grails create-domain-class liv.enucomp.Livro
    –   O Grails cria a classe de domínio Post.groovy. Abra-o em
        seu editor de texto.
            class Livro {
               static constraints = {   }
            }

    –   Adicione os atributos de acordo com o diagrama de
        classes.
            class Livro {
             String titulo
             String descricao
             Float valor
             int anoLancamento
             byte[] imagem
             ...
Classes de domínio
» grails create-domain-class liv.enucomp.Categoria


» grails create-domain-class liv.enucomp.Autor


» grails create-domain-class liv.enucomp.seg.Usuario


●   Inserir os atributos de acordo com o diagrama de
    classes;
Controllers
●   Comando para criar um controller:
» grails create-controller <Classe de domínio>
●   » grails create-controller liv.enucomp.Livro
    ●   Gera uma classe chamada LivroController.groovy;
    ●   O controller, a partir do método index vazio, chama
        um arquivo chamado index.gsp;
    ●   Podemos simular uma página dentro .gsp através
        do método render, ou chamar um outro arquivo;
            class LivroController {
               def index = { render 'Hello World' }
                ou
               def chama = {render(view:'teste.gsp') }
            }
Scaffolding
●   Estrutura de CRUD em MCV já conectada com
    banco de dados gerada pela mágica da meta-
    programação.
●   Em grails, para tornar isso realidade, basta
    adicionar uma linha de código em seu
    controller:
             class LivroController {
                def scaffold = Livro
             }

    ●   Agora rode novamente a aplicação;
Scaffolding
●   Faça o mesmo agora para as outras classes de
    domínio:
        » grails create-controller liv.enucomp.Livro
        » grails create-controller liv.enucomp.Categoria
        » grails create-controller liv.enucomp.Autor
        » grails create-controller liv.enucomp.seg.Usuario
    ●   Adicione o código do scaffolding para todos os domínios,
        exceto para Usuario, pois vamos fazer de forma diferente;
    ●   Restarte o servidor;
Scaffolding
Scaffolding
Mudar a ordem dos campos
●   Adicionar os campos na ordem específica dentro
    do bloco static constraints;
       class Livro {
        static constraints = {
          imagem()
          titulo()
          descricao()
          anoLancamento()
          valor()
        }
        String titulo
        String descricao
        Float valor
        int anoLancamento
        byte[] imagem
Tratando as Imagens
●   Controller em questão:
     def imagem = {
         def livro = Livro.get(params.id)
         byte[] imagem = livro.imagem
         response.outputStream << imagem
       }

●   Visões:
<img src="${createLink(controller:'livro', action:'imagem', id: livroInstance.id)}" width="80px"
height="100px"/>
Validações
     class Livro {
         static constraints = {
             imagem()
             titulo(blank:false)
             descricao(blank:false, maxSize:1000)
             anoLancamento(blank: false)
             valor()
         }
         …
     }


●   Opções de validação em Grails:
Validações
Validações
Validações
●   Para alterar uma validação, edite o arquivo grails-
    app/i18n/messages_pt_BR.properties

    default.blank.message = Por favor, digite um
    valor para [{0}]. O campo não pode estar vazio.


●   Mais sobre validações:
    http://grails.org/doc/latest/guide/7.%20Validation.html
Traduzindo o Scaffold
●   No mesmo arquivo adicione as seguintes linhas:
     default.home.label=Principal
     default.list.label=Listar {0}
     default.add.label=Adicionar {0}
     default.new.label=Cadastrar {0}
     default.create.label=Cadastrar {0}
     default.show.label=Exibir {0}
     default.edit.labe=Editar {0}
     default.button.create.label=Gravar
     default.button.edit.label=Editar
     default.button.update.label=Alterar
     default.button.delete.label=Excluir
     default.button.delete.confirm.message=Você tem certeza?
Views
●   Para obter as visões usamos o comando:
      » grails generate-view liv.enucomp.Livro
       –   O comando irá gerar as visões para a classe Post
●   Gerar para todos os domínios:
      » grails generate-all
●   As visões geradas ficam dentro do diretório grails-
    app/views/liv/enucomp/
Relacionamentos
●   One-to-One
    ●   belongsTo
    ●   belongsTo
●   One-to-Many
    ●   hasMany
    ●   belongsTo
●   Many-to-Many
    ●   hasMany
    ●   hasMany
Relacionamentos
●   Um Livro tem uma Categoria;
●   Uma Categoria pode ser de vários Livros
●   O Livro pertence a um Autor
●   Um Autor pode ter vários Livros
Relacionamentos
●   Livro.groovy
    ●   static belongsTo = [categoria:Categoria,
        autor:Autor]
●   Categoria.groovy
    ●   static has_many = [livros:Livro]
●   Autor.groovy
    ●   static has_many = [livros:Livro]
BootStrap.groovy
●   Abra o arquivo grails-app/conf/BootStrap.groovy
●       class BootStrap {
          def init = { servletContext ->
●

            }
●

            def destroy = {}
●
        }
●   Dentro do bloco init, instancie as classes de
    domínio.
    ●       Tudo que esta dentro do init será carregado no
            momento que a aplicação for iniciada.
BootStrap.groovy
import liv.enucomp.*
class BootStrap {
  def init = { servletContext ->
    def fernando = new Autor(
                nome:'Fernando Anselmo',
                nascimento:new Date(),
                email:'autor@empresa.com',
               )
    fernando.save()
    if(fernando.hasErrors()){
      println fernando.errors
    }

    def destroy = {   }

}
DataSource.groovy
●   datasource – Configurações gerais do banco de
    dados;
●   hibernate – configurações específicas do
    Hibernate, como performance...
●   environments – Configurações específicas para
    cada ambiente de desenvolvimento.
Alterar a Base de Dados
    ●   Criar a base de dados;
    ●   Copie o driver JDBC para o diretorio grails-app/lib;
    ●   Ajustar as configurações em DataSource.groovy.
●   Em nossa aplicação, vamos usar o banco de
    dados MySQL.
    ●   O ideal é criar base de dados distintas para cada
        um dos ambientes(development, production,
        test), mas em nosso exemplo será criada apenas
        uma geral.
Alterar a Base de Dados
       $ mysql -u root -p
       Enter password: ********
       Welcome to the MySQL monitor. Commands end with ; or g.
       ...
       mysql> create database livraria_dev;
       ...
       mysql> grant all on livraria_dev.* to grails@localhost
       identified by 'server';
       ...
       mysql> exit

●   O penultimo comando está concedendo todos
    os privilégios(criar, apagar...) ao usuário grails
    que se loga através de localhost, cuja senha é
    server;
Alterar a Base de Dados
    $ mysql --user=grails –p --database=livraria_dev
    Welcome to the MySQL monitor.

    Mysql> show tables;
    Empty set (0.00 sec)

●   Próximo passo é copiar o driver MySQL para o
    diretório /livraria/lib
       –   O driver pode ser baixado no site:
           http://dev.mysql.com/downloads/connector/j/
       –   Descompacte o arquivo .zip e copie o JAR mysql-
           connector-java-x.x.x-bin.jar
       –   Agora é só ajustar as configurações no DataSource.groovy
Alterar a Base de Dados

dataSource {
  pooled = true
  driverClassName = "com.mysql.jdbc.Driver"
  username = "grails"
  password = "server"
}

environments {
  development {
     dataSource {
        dbCreate = "create-drop"
       //Vamos definir essa mesma url para todos os ambientes
        url = "jdbc:mysql://localhost:3306/livraria_dev?autoreconnect=true"
     }
  }
  …
}
Página inicial
●   Criando uma página para listar os livros cadastrados;
    ●   Crie um controller chamado Home;
        –   Adicione o seguinte código:
             ● def home = { [livroList:Livro.list()]}


    ●   Copie:
        –   A imagem logo.jpg e cole em /web-app/imagens/;
        –   O arquivo style.css para /web-app/css
        –   O arquivo index.html para /grails_apps/views/layout com o nome
            de index.gsp
Página inicial
●   Abra o arquivo index.gsp e modifique a linha
    do css para:
    ●   <link rel="stylesheet" href="${createLinkTo(dir:'css',
        file:'style.css')}" type="text/css" />
    ●   Na ultima linha do <head>, a dicione a tag
        <g:layoutHead/>
    ●   Apague os textos do html e adicione a tag
        <g:layoutBody/>
Página inicial
●   Crie um controller chamado Home;
    ●   Modifique para isso:
         class HomeController {
             def home = {                         
               [livroList:Livro.list()]
           }
         }
Página inicial
●   Crie um arquivo home.gsp dentro de /views/home/
      <head>
       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
       <meta name="layout" content="index" />
       <title> Meu blogão </title>
      </head>
      <body>
       <g:each in="${postList}" status="i" var="post">
        <div id="${ (i % 2) == 0 ? 'left' : 'right'}">
          <h2>${post.titulo}</h2>
          <p align="justify"> ${post.conteudo}</p>
          <div id="notice">
            <p>Coloque aqui uma chamada em destaque em seu blog</p>
          </div>
        </div>
       </g:each>
      </body>
Templates
●   Alterando as templates geradas por padrão no
    grails:
        –   grails install-templates
    ●   Arquivos gerados no diretório:
        –   .../livraria/src/templates
Autorização
●   Um usuário eterno não poderá ter acesso às
    funcionalidades de administração do sistema,
    somente um usuário cadastrado poderá ter
    acesso a tais funções;
    ●   Criar;
    ●   Editar;
    ●   Excluir;
    ●   Listagem;
Autorização
●   Modificar o UsuarioController:
    def login = {
       if (params.cNome)
         return [cNome:params.cNome, aNome:params.aNome]
       redirect(url:resource(dir:'' ))
     }
     def logout = {
       session.usuario = null
       redirect(url:resource(dir:'' ))
     }
     def validate = {
       def usuario = Usuario.findByLogin(params.login)
       if (usuario && usuario.senha == params.senha) {
         session.usuario = usuario
         if (params.cNome) {
           redirect(controller:params.cNome, action:params.aNome)
         }
         redirect(url:resource(dir:'' ))
       } else {
         flash.message = "Usuário ou Senha inválidos."
         render(view:'home' )
       }
     }
Autorização
●   Criar uma tagLib:
    ●   grails create-tag-lib Protege
         class ProtegeTagLib {
           def loginLogout = {
             out << "<div>"
             if (session.usuario) {
               out << "<span style='float:left'>"
               out << "&nbsp;Bem Vindo <b>${session.usuario.nome}</b>."
               out << "</span><span style='float:right;margin-right:10px'>"
               out << "<a href='${createLink(controller:'usuario', action:'logout')}'>"
               out << "Logout </a></span>"
             } else {
               out << "<span style='float:right;margin-right:10px'>"
               out << "<a href='${createLink(controller:'usuario', action:'login')}'>"
               out << "Login </a></span>"
             }
             out << "</div><br/><br/>"
           }
         }
Autorização
●   Agora adicione a tag no arquivo
    app/views/layouts/main.gsp na segunte linha:
     <html>
      ...
       </div>
          <g:loginLogout />
          <g:layoutBody />
      ...
     </html>
Autorização
●   Criar um Filtro:
    ●   Um filtro age em uma determinada ação ou em
        todas elas. E determina se é antes, depois de ter
        acontecido. No nosso caso, agiremos sobre todas e
        antes que elas acontecem.
    ●   grails create-filters liv.enucomp.seg.Seguranca
        –   Altere o conteudo do arquivo grails-
            app/conf/liv/.../SegurancaFilters.groovy
Autorização
...
def filters = {
   all(controller:'*', action:'*') {
    before = {
          if (!controllerName)
            return true
          def allowedActions = [ 'index' , 'login', 'logout' , 'validate', 'home',
'entrar']
          if (!session.usuario && !allowedActions.contains(actionName)){
            redirect(controller:'usuario' , action:'entrar.gsp' ,
              params:['cNome': controllerName, 'aNome': actionName])
            return false
          }
        }
...
Autorização
●   Agora iremos construirum formulário de login. Crie um
    arquivo chamado entrar.jsp e, grails-app/views/usuario/
    com os seguintes códigos:
       <html>
        <head>
         <meta name="layout" content="main" />
         <title>Login</title>
        </head>
        <body>
         <g:if test="${flash.message}" >
          <div class="message" >${flash.message}</div>
         </g:if>
         <h1 style="margin-left:20px;">Bem Vindo a Livraria Virtual</h1>
         <p style="margin-left:20px;width:80%">Para modificar os dados é necessário
       proceder o acesso ao sistema:</p>
         <br />
         <g:form action="validate" >
          <input type="hidden" name="cNome" value="${cNome}" >
          <input type="hidden" name="aNome" value="${aNome}" >
          <table>
cont. entrar.gsp
  <tr class="prop" >
       <td class="name" >
        <label for="login" >Usuário:</label>
       </td>
       <td class="value" >
        <input type="text" id="login" name="login" value="" >
       </td>
     </tr>
     <tr class="prop" >
       <td class="name" >
        <label for="senha" >Senha:</label>
       </td>
       <td class="value" >
        <input type="password" id="senha" name="senha" value="" >
       </td>
     </tr>
     <tr>
       <td></td>
       <td><input type="submit" value="Acessar" /></td>
     </tr>
    </table>
  </g:form>
 </body>
</html>
Grails Deployment
●   Container
    ●   É a parte do servidor destinado a alojar a
        tecnologia Java
        –   Tomcat: Container Web para Servlet e JSP
        –   Apache: Servidor web
●   Deploy → Implantar
    ●   Instalar a sua aplicação em um servidor de
        aplicações, mais especificamente, em um
        container.
Grails Deployment
●   grails war → gera um arquivo .war, o
    servidor retornará para o browser a aplicação
    rodando, já em modo de produção.
>>grails war
    ●   Copie o arquivo .war gerado pelo comando para o
        diretório dentro do container, no servidor. No nosso
        caso é o Apache-Tomcat.
        –   .../apache-tomcat-x.x.xx/webapps/
Grails Plugins
●   Instalando Plugins
    ●   grails install-plugin [URL/File]
    ●   grails install-plugin [name] [version]*
        – A versão é opcional
    ●   grails install-plugin
        http://foo.com/grails-bar-1.0.zip
    ●   grails install-plugin ../grails-bar-1.0.zip
    ●   grails install-plugin jsecurity
    ●   grails install-plugin jsecurity 0.1
Grails Plugins
●   http://www.grails.org/plugin/category/all
    ●   Listagem de plugins disponíveis;
O plugin RichUI
●   Esse plugin gera componentes gráficos para
    realçar as nossas visões;
    ●   http://www.grails.org/RichUI+Plugin
    ●   grails install-plugin .../grails-richui-0.8.zip
         –   Auto Complete;
         –   Calendários;
         –   Tabs “Guias”;
         –   Editor de texto;
         –   ...
O plugin RichUI
●   Adicione <resource:richTextEditor
    type="advanced" /> dentro da tag <head> nas
    views onde há fomulário com campos do tipo
    conteúdo;
●   Substitua a tag <input type='textArea'.../>
    do formulário para <richui:richTextEditor
    name="conteudo" value="$
    {fieldValue(bean:
    postInstance,field:'conteudo')}"/>
Plugins Interessantes
●   Spring Security Core;
●   Correios-br;
●   Searchable;
●   Commentable;
●   Mail;
●   Avatar;
●   Twitter
Referências
●   Getting Started with Grails Second Edition
    ●   Scott Davis e Jason Rudolph
●   Introduction_to_Groovy_and_Grails
    ●   Mohamed Seifeddine
●   Grails: do Groovy à Web
    ●   Artigo DevMedia - Henrique Lobo Weissmann
●   Em Busca do Grails
    ●   Fernando Anselmo
●   Site oficial do Grails
    ●   http://www.grails.org/Quick+Start
Referências
●   Criando um blog em cinco minutos com Grails
    ●   http://www.michelsilva.net/index.php?option=com_content&task=vie
●   Grails: um guia rápido e indireto
    ●   http://www.itexto.net/devkico/?page_id=220

Weitere ähnliche Inhalte

Was ist angesagt?

Aurora Serverless: Scalable, Cost-Effective Application Deployment (DAT336) -...
Aurora Serverless: Scalable, Cost-Effective Application Deployment (DAT336) -...Aurora Serverless: Scalable, Cost-Effective Application Deployment (DAT336) -...
Aurora Serverless: Scalable, Cost-Effective Application Deployment (DAT336) -...Amazon Web Services
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScriptBruno Catão
 
DOMinando JavaScript
DOMinando JavaScriptDOMinando JavaScript
DOMinando JavaScriptThiago Poiani
 
Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Rodrigo Kono
 
Exploring the power of Gradle in android studio - Basics & Beyond
Exploring the power of Gradle in android studio - Basics & BeyondExploring the power of Gradle in android studio - Basics & Beyond
Exploring the power of Gradle in android studio - Basics & BeyondKaushal Dhruw
 
Introdução básica ao JavaScript
Introdução básica ao JavaScriptIntrodução básica ao JavaScript
Introdução básica ao JavaScriptCarlos Eduardo Kadu
 
JBoss Drools - Pure Java Rule Engine
JBoss Drools - Pure Java Rule EngineJBoss Drools - Pure Java Rule Engine
JBoss Drools - Pure Java Rule EngineAnil Allewar
 
introduction to Vue.js 3
introduction to Vue.js 3 introduction to Vue.js 3
introduction to Vue.js 3 ArezooKmn
 
Grails Simple Login
Grails Simple LoginGrails Simple Login
Grails Simple Loginmoniguna
 
Prática de laboratório utilizando views, stored procedures e triggers
Prática de laboratório   utilizando views, stored procedures e triggersPrática de laboratório   utilizando views, stored procedures e triggers
Prática de laboratório utilizando views, stored procedures e triggersDaniel Maia
 
BigQuery walk through.pptx
BigQuery walk through.pptxBigQuery walk through.pptx
BigQuery walk through.pptxVikRam S
 
Introduction to Swagger
Introduction to SwaggerIntroduction to Swagger
Introduction to SwaggerKnoldus Inc.
 
Typescript in React: HOW & WHY?
Typescript in React: HOW & WHY?Typescript in React: HOW & WHY?
Typescript in React: HOW & WHY?Saulius Skeirys
 
Angular - Chapter 4 - Data and Event Handling
 Angular - Chapter 4 - Data and Event Handling Angular - Chapter 4 - Data and Event Handling
Angular - Chapter 4 - Data and Event HandlingWebStackAcademy
 
Cracking OCA and OCP Java 8 Exams
Cracking OCA and OCP Java 8 ExamsCracking OCA and OCP Java 8 Exams
Cracking OCA and OCP Java 8 ExamsGanesh Samarthyam
 

Was ist angesagt? (20)

Aurora Serverless: Scalable, Cost-Effective Application Deployment (DAT336) -...
Aurora Serverless: Scalable, Cost-Effective Application Deployment (DAT336) -...Aurora Serverless: Scalable, Cost-Effective Application Deployment (DAT336) -...
Aurora Serverless: Scalable, Cost-Effective Application Deployment (DAT336) -...
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
DOMinando JavaScript
DOMinando JavaScriptDOMinando JavaScript
DOMinando JavaScript
 
Drools expert-docs
Drools expert-docsDrools expert-docs
Drools expert-docs
 
Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)
 
Exploring the power of Gradle in android studio - Basics & Beyond
Exploring the power of Gradle in android studio - Basics & BeyondExploring the power of Gradle in android studio - Basics & Beyond
Exploring the power of Gradle in android studio - Basics & Beyond
 
Introdução básica ao JavaScript
Introdução básica ao JavaScriptIntrodução básica ao JavaScript
Introdução básica ao JavaScript
 
Clean code
Clean codeClean code
Clean code
 
Groovy Programming Language
Groovy Programming LanguageGroovy Programming Language
Groovy Programming Language
 
JBoss Drools - Pure Java Rule Engine
JBoss Drools - Pure Java Rule EngineJBoss Drools - Pure Java Rule Engine
JBoss Drools - Pure Java Rule Engine
 
introduction to Vue.js 3
introduction to Vue.js 3 introduction to Vue.js 3
introduction to Vue.js 3
 
Clean code slide
Clean code slideClean code slide
Clean code slide
 
Javascript aula 01 - visão geral
Javascript   aula 01 - visão geralJavascript   aula 01 - visão geral
Javascript aula 01 - visão geral
 
Grails Simple Login
Grails Simple LoginGrails Simple Login
Grails Simple Login
 
Prática de laboratório utilizando views, stored procedures e triggers
Prática de laboratório   utilizando views, stored procedures e triggersPrática de laboratório   utilizando views, stored procedures e triggers
Prática de laboratório utilizando views, stored procedures e triggers
 
BigQuery walk through.pptx
BigQuery walk through.pptxBigQuery walk through.pptx
BigQuery walk through.pptx
 
Introduction to Swagger
Introduction to SwaggerIntroduction to Swagger
Introduction to Swagger
 
Typescript in React: HOW & WHY?
Typescript in React: HOW & WHY?Typescript in React: HOW & WHY?
Typescript in React: HOW & WHY?
 
Angular - Chapter 4 - Data and Event Handling
 Angular - Chapter 4 - Data and Event Handling Angular - Chapter 4 - Data and Event Handling
Angular - Chapter 4 - Data and Event Handling
 
Cracking OCA and OCP Java 8 Exams
Cracking OCA and OCP Java 8 ExamsCracking OCA and OCP Java 8 Exams
Cracking OCA and OCP Java 8 Exams
 

Ähnlich wie Groovy & Grails para desenvolvimento ágil de aplicações Java

Overview de Grails: O Java em alta produtividade
Overview de Grails: O Java em alta produtividadeOverview de Grails: O Java em alta produtividade
Overview de Grails: O Java em alta produtividadeCleórbete Santos
 
Grails: O Java em Alta Produtividade
Grails: O Java em Alta ProdutividadeGrails: O Java em Alta Produtividade
Grails: O Java em Alta ProdutividadeCleórbete Santos
 
Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.Alex Guido
 
Produtividade na web_com_groovy_e_grails_pt2
Produtividade na web_com_groovy_e_grails_pt2Produtividade na web_com_groovy_e_grails_pt2
Produtividade na web_com_groovy_e_grails_pt2Lucas Aquiles
 
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...tdc-globalcode
 
Google App Engine e PHP
Google App Engine e PHPGoogle App Engine e PHP
Google App Engine e PHPLuiz Messias
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAThiago Cifani
 
Iniciando com Ruby on Rails - Luiz Fernando Pimenta
Iniciando com Ruby on Rails - Luiz Fernando PimentaIniciando com Ruby on Rails - Luiz Fernando Pimenta
Iniciando com Ruby on Rails - Luiz Fernando Pimentamichel adriano medeiros
 
Apresentação realidade aumentada para aplicações web e mobile
Apresentação   realidade aumentada para aplicações web e mobileApresentação   realidade aumentada para aplicações web e mobile
Apresentação realidade aumentada para aplicações web e mobileRWTH Aachen University
 
12 factor app. Melhor com Docker
12 factor app. Melhor com Docker12 factor app. Melhor com Docker
12 factor app. Melhor com DockerWellington Silva
 
Palestra Zend Framework na Campus Party 2011
Palestra Zend Framework na Campus Party 2011Palestra Zend Framework na Campus Party 2011
Palestra Zend Framework na Campus Party 2011Flávio Lisboa
 
Construção e provisionamento de ambientes de desenvolvimento virtualizados
Construção e provisionamento de ambientes  de desenvolvimento virtualizadosConstrução e provisionamento de ambientes  de desenvolvimento virtualizados
Construção e provisionamento de ambientes de desenvolvimento virtualizadosThiago Rodrigues
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com AngularElmano Cavalcanti
 
Nodejs justdigital
Nodejs justdigitalNodejs justdigital
Nodejs justdigitalJust Digital
 
Open4Education | MC122 - Introdução a ALM OpenSource
Open4Education | MC122 - Introdução a ALM OpenSourceOpen4Education | MC122 - Introdução a ALM OpenSource
Open4Education | MC122 - Introdução a ALM OpenSourcetdc-globalcode
 

Ähnlich wie Groovy & Grails para desenvolvimento ágil de aplicações Java (20)

Overview de Grails: O Java em alta produtividade
Overview de Grails: O Java em alta produtividadeOverview de Grails: O Java em alta produtividade
Overview de Grails: O Java em alta produtividade
 
Grails: O Java em Alta Produtividade
Grails: O Java em Alta ProdutividadeGrails: O Java em Alta Produtividade
Grails: O Java em Alta Produtividade
 
Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.
 
Grails
GrailsGrails
Grails
 
Produtividade na web_com_groovy_e_grails_pt2
Produtividade na web_com_groovy_e_grails_pt2Produtividade na web_com_groovy_e_grails_pt2
Produtividade na web_com_groovy_e_grails_pt2
 
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
 
Google App Engine e PHP
Google App Engine e PHPGoogle App Engine e PHP
Google App Engine e PHP
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 
Iniciando com Ruby on Rails - Luiz Fernando Pimenta
Iniciando com Ruby on Rails - Luiz Fernando PimentaIniciando com Ruby on Rails - Luiz Fernando Pimenta
Iniciando com Ruby on Rails - Luiz Fernando Pimenta
 
Google Web Toolkit
Google Web ToolkitGoogle Web Toolkit
Google Web Toolkit
 
Apresentação realidade aumentada para aplicações web e mobile
Apresentação   realidade aumentada para aplicações web e mobileApresentação   realidade aumentada para aplicações web e mobile
Apresentação realidade aumentada para aplicações web e mobile
 
12 factor app. Melhor com Docker
12 factor app. Melhor com Docker12 factor app. Melhor com Docker
12 factor app. Melhor com Docker
 
Palestra Zend Framework na Campus Party 2011
Palestra Zend Framework na Campus Party 2011Palestra Zend Framework na Campus Party 2011
Palestra Zend Framework na Campus Party 2011
 
Construção e provisionamento de ambientes de desenvolvimento virtualizados
Construção e provisionamento de ambientes  de desenvolvimento virtualizadosConstrução e provisionamento de ambientes  de desenvolvimento virtualizados
Construção e provisionamento de ambientes de desenvolvimento virtualizados
 
Django
DjangoDjango
Django
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com Angular
 
Nodejs justdigital
Nodejs justdigitalNodejs justdigital
Nodejs justdigital
 
Grails
GrailsGrails
Grails
 
Open4Education | MC122 - Introdução a ALM OpenSource
Open4Education | MC122 - Introdução a ALM OpenSourceOpen4Education | MC122 - Introdução a ALM OpenSource
Open4Education | MC122 - Introdução a ALM OpenSource
 
Django - Muito além do básico
Django - Muito além do básicoDjango - Muito além do básico
Django - Muito além do básico
 

Kürzlich hochgeladen

Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)
Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)
Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)Mary Alvarenga
 
D9 RECONHECER GENERO DISCURSIVO SPA.pptx
D9 RECONHECER GENERO DISCURSIVO SPA.pptxD9 RECONHECER GENERO DISCURSIVO SPA.pptx
D9 RECONHECER GENERO DISCURSIVO SPA.pptxRonys4
 
Bullying - Atividade com caça- palavras
Bullying   - Atividade com  caça- palavrasBullying   - Atividade com  caça- palavras
Bullying - Atividade com caça- palavrasMary Alvarenga
 
trabalho wanda rocha ditadura
trabalho wanda rocha ditaduratrabalho wanda rocha ditadura
trabalho wanda rocha ditaduraAdryan Luiz
 
A horta do Senhor Lobo que protege a sua horta.
A horta do Senhor Lobo que protege a sua horta.A horta do Senhor Lobo que protege a sua horta.
A horta do Senhor Lobo que protege a sua horta.silves15
 
Época Realista y la obra de Madame Bovary.
Época Realista y la obra de Madame Bovary.Época Realista y la obra de Madame Bovary.
Época Realista y la obra de Madame Bovary.keislayyovera123
 
Recurso Casa das Ciências: Sistemas de Partículas
Recurso Casa das Ciências: Sistemas de PartículasRecurso Casa das Ciências: Sistemas de Partículas
Recurso Casa das Ciências: Sistemas de PartículasCasa Ciências
 
Música Meu Abrigo - Texto e atividade
Música   Meu   Abrigo  -   Texto e atividadeMúsica   Meu   Abrigo  -   Texto e atividade
Música Meu Abrigo - Texto e atividadeMary Alvarenga
 
Habilidades Motoras Básicas e Específicas
Habilidades Motoras Básicas e EspecíficasHabilidades Motoras Básicas e Específicas
Habilidades Motoras Básicas e EspecíficasCassio Meira Jr.
 
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicas
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicasCenários de Aprendizagem - Estratégia para implementação de práticas pedagógicas
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicasRosalina Simão Nunes
 
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptxAD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptxkarinedarozabatista
 
Manual da CPSA_1_Agir com Autonomia para envio
Manual da CPSA_1_Agir com Autonomia para envioManual da CPSA_1_Agir com Autonomia para envio
Manual da CPSA_1_Agir com Autonomia para envioManuais Formação
 
Orações subordinadas substantivas (andamento).pptx
Orações subordinadas substantivas (andamento).pptxOrações subordinadas substantivas (andamento).pptx
Orações subordinadas substantivas (andamento).pptxKtiaOliveira68
 
02. Informática - Windows 10 apostila completa.pdf
02. Informática - Windows 10 apostila completa.pdf02. Informática - Windows 10 apostila completa.pdf
02. Informática - Windows 10 apostila completa.pdfJorge Andrade
 
Apresentação | Eleições Europeias 2024-2029
Apresentação | Eleições Europeias 2024-2029Apresentação | Eleições Europeias 2024-2029
Apresentação | Eleições Europeias 2024-2029Centro Jacques Delors
 
“Sobrou pra mim” - Conto de Ruth Rocha.pptx
“Sobrou pra mim” - Conto de Ruth Rocha.pptx“Sobrou pra mim” - Conto de Ruth Rocha.pptx
“Sobrou pra mim” - Conto de Ruth Rocha.pptxthaisamaral9365923
 
Slides 1 - O gênero textual entrevista.pptx
Slides 1 - O gênero textual entrevista.pptxSlides 1 - O gênero textual entrevista.pptx
Slides 1 - O gênero textual entrevista.pptxSilvana Silva
 
Programa de Intervenção com Habilidades Motoras
Programa de Intervenção com Habilidades MotorasPrograma de Intervenção com Habilidades Motoras
Programa de Intervenção com Habilidades MotorasCassio Meira Jr.
 

Kürzlich hochgeladen (20)

Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)
Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)
Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)
 
D9 RECONHECER GENERO DISCURSIVO SPA.pptx
D9 RECONHECER GENERO DISCURSIVO SPA.pptxD9 RECONHECER GENERO DISCURSIVO SPA.pptx
D9 RECONHECER GENERO DISCURSIVO SPA.pptx
 
CINEMATICA DE LOS MATERIALES Y PARTICULA
CINEMATICA DE LOS MATERIALES Y PARTICULACINEMATICA DE LOS MATERIALES Y PARTICULA
CINEMATICA DE LOS MATERIALES Y PARTICULA
 
Bullying - Atividade com caça- palavras
Bullying   - Atividade com  caça- palavrasBullying   - Atividade com  caça- palavras
Bullying - Atividade com caça- palavras
 
trabalho wanda rocha ditadura
trabalho wanda rocha ditaduratrabalho wanda rocha ditadura
trabalho wanda rocha ditadura
 
A horta do Senhor Lobo que protege a sua horta.
A horta do Senhor Lobo que protege a sua horta.A horta do Senhor Lobo que protege a sua horta.
A horta do Senhor Lobo que protege a sua horta.
 
Época Realista y la obra de Madame Bovary.
Época Realista y la obra de Madame Bovary.Época Realista y la obra de Madame Bovary.
Época Realista y la obra de Madame Bovary.
 
Bullying, sai pra lá
Bullying,  sai pra láBullying,  sai pra lá
Bullying, sai pra lá
 
Recurso Casa das Ciências: Sistemas de Partículas
Recurso Casa das Ciências: Sistemas de PartículasRecurso Casa das Ciências: Sistemas de Partículas
Recurso Casa das Ciências: Sistemas de Partículas
 
Música Meu Abrigo - Texto e atividade
Música   Meu   Abrigo  -   Texto e atividadeMúsica   Meu   Abrigo  -   Texto e atividade
Música Meu Abrigo - Texto e atividade
 
Habilidades Motoras Básicas e Específicas
Habilidades Motoras Básicas e EspecíficasHabilidades Motoras Básicas e Específicas
Habilidades Motoras Básicas e Específicas
 
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicas
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicasCenários de Aprendizagem - Estratégia para implementação de práticas pedagógicas
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicas
 
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptxAD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
 
Manual da CPSA_1_Agir com Autonomia para envio
Manual da CPSA_1_Agir com Autonomia para envioManual da CPSA_1_Agir com Autonomia para envio
Manual da CPSA_1_Agir com Autonomia para envio
 
Orações subordinadas substantivas (andamento).pptx
Orações subordinadas substantivas (andamento).pptxOrações subordinadas substantivas (andamento).pptx
Orações subordinadas substantivas (andamento).pptx
 
02. Informática - Windows 10 apostila completa.pdf
02. Informática - Windows 10 apostila completa.pdf02. Informática - Windows 10 apostila completa.pdf
02. Informática - Windows 10 apostila completa.pdf
 
Apresentação | Eleições Europeias 2024-2029
Apresentação | Eleições Europeias 2024-2029Apresentação | Eleições Europeias 2024-2029
Apresentação | Eleições Europeias 2024-2029
 
“Sobrou pra mim” - Conto de Ruth Rocha.pptx
“Sobrou pra mim” - Conto de Ruth Rocha.pptx“Sobrou pra mim” - Conto de Ruth Rocha.pptx
“Sobrou pra mim” - Conto de Ruth Rocha.pptx
 
Slides 1 - O gênero textual entrevista.pptx
Slides 1 - O gênero textual entrevista.pptxSlides 1 - O gênero textual entrevista.pptx
Slides 1 - O gênero textual entrevista.pptx
 
Programa de Intervenção com Habilidades Motoras
Programa de Intervenção com Habilidades MotorasPrograma de Intervenção com Habilidades Motoras
Programa de Intervenção com Habilidades Motoras
 

Groovy & Grails para desenvolvimento ágil de aplicações Java

  • 1. Groovy & Grails Desenvolvimento ágil para plataforma Java Luís Bruno P. Nascimento luisbrunu@gmail.com
  • 2. Enucomp 2010 ● Groovy e Grails – Parte II Introdução ao Grails
  • 3. Introdução ao Grails ● Java EE ● Java Enterprise Edition – Java Edição Empresarial – Plataforma de programação para servidores na linguagem Java. ● Alvo de várias críticas relacionadas à complexidade no desenvolvimento de aplicações web; – Muita configuração XML; – Muito trabalho repetitivo; – Fazer muito para criar pouco; ● Daí surge o Grails
  • 4. O que é Grails? ● Uma Web framework baseado em RoR para desenvolvimento de aplicações Java utilizando a linguagem Groovy. ● Framework de ALTA produtividade; ● Full Stack web framework; ● Programação por Convenção; ● Don’t Repeat Yourself (DRY); ● Lançamento versão 0.1, Março/2006; ● Ultima versão: 1.3.5
  • 5. Grails ● Framework de alta produtividade: ● Em questão de minutos você cria toda a estrutura de banco de dados, as telas HTML e CSS, tudo já funcionando. ● CRUD fácil – Com apenas alguns comandos, a framework gera toda a estrutura de um CRUD;
  • 6. Full Stack web Framework ● Após instalado, o Grails já vem com todos os componentes necessários para que possamos iniciar o trabalho; ● É completo, pois já vem com diversos componentes pré-configurados para o uso: – Spring; – Hibernate; – Apache; – HSQLDB; – E muitos outros;
  • 7. Convenção sobre configuração ● Programar seguindo convenções da framework; ● Essas convenções definem o padão de comportamento da framework; ● Principal motivação: programar fazendo configurações de arquivos XML; ● Se não quisermos configurar nada, basta seguir as convenções da framework; ● É dessa forma que o Grails pode ajudar na programação, dando mais praticidade no desenvolvimento e também mais agilidade.
  • 8. DRY ● DRY - Don't Repeat Yourself – Não se repita ● No desenvolvimento de aplicações web, boa parte do trabalho feito pelo desenvolvedor é repetitiva; ● Agora o framework passa a farzer essas tarefas repetitivas; ● Código mais enxuto;
  • 9. Instalando ● Faça o download da ultima versão do Grails: http://www.grails.org/Download ● Para instalar, basta descompactar o arquivo grails-1.3.5.zip em qualquer diretório; ● Definir as variáveis de ambiente e o PATH; ● Para testar, basta digitar grails no terminal: >>Welcome to Grails 1.3.5 - http://grails.org/ >>Licensed under Apache Standard License 2.0
  • 10. Ambientes para desenvolvimento ● Grails plugin para Eclipse ● www.grails.org/Eclipse+IDE+Integration ● Netbeans já vem com suporte total à Groovy e Grails; ● Os editores de texto em geral, já resolvem nosso problema; ● Gedit; ● JEdit ● Notpad++
  • 11. Grails Comandos >> grails help ● Lista todos os comandos que podemos executar na linha de comando em Grails: ● grails create-app ● grails generate-controller ● grails generate-views ● grails install-plugins ● ...
  • 12. Atualizando Grails ● Para atualizar devemos fazer o download da versão mais nova, descompactar e trocar as variáveis definidas. ● Dentro do projeto: ● >>grails upgrade – Esse comando atualizará o seu projeto para a utilização dos recursos da nova versão do grails;
  • 13. Projeto ● Livraria Virtual
  • 14. Criando a aplicação ● >>grails create-app livraria Welcome to Grails 1.3.4 - http://grails.org/ Licensed under Apache Standard License 2.0 Grails home is set to: /opt/Groovy/grails-1.3.4 Base Directory: /opt/Groovy/web Resolving dependencies... Dependencies resolved in 1653ms. Running script /opt/Groovy/grails-1.3.4/scripts/CreateApp_.groovy Environment set to development [mkdir] Created dir: /opt/Groovy/web/livraria/src [mkdir] Created dir: /opt/Groovy/web/livraria/src/java [mkdir] Created dir: /opt/Groovy/web/livraria/src/groovy [mkdir] Created dir: /opt/Groovy/web/livraria/grails-app [mkdir] Created dir: /opt/Groovy/web/livraria/grails-app/controllers [mkdir] Created dir: /opt/Groovy/web/livraria/grails-app/services [mkdir] Created dir: /opt/Groovy/web/livraria/grails-app/domain .......
  • 16. Diretórios da aplicação ● Grails-app é o diretório principal. É onde se encontra as classes modelos, os controllers, as views, traduções... ● conf – Possui arquivos de configuração da aplicação – config.groovy – várias configurações da aplicação como ambientes de execução; – DataSource.groovy – configurações da base de dados; – Bootstrap.groovy – habilita códigos a serem executados quando a aplicação é estartada; – URLMappings.groovy – alterar como as requisições são tratadas através de URLs.
  • 17. Diretórios da Aplicação ● I18n ● Recursos para internacionalização e mensagens de erro. – Traduções e/ou customização de mensagens ● taglib ● Tags criadas pelo usuário. – Tags usadas em páginas GSP
  • 18. Diretórios da aplicação ● controllers ● Diretórios onde ficam os controllers da aplicação; ● Tratam de requisições web; ● doimain ● Os modelos da plicação; ● Classes onde serão mapeados os objetos e propriedades do mundo OO para o mundo relacional (tabelas, colunas); – GORM – Grails Object Relational Mapping;
  • 19. Diretórios da aplicação ● views ● Arquivos GSP – Groovy Server Pages; – Páginas HTML que suportam código em Groovy; – Similar às JSP; ● As visões são responsáveis por mostrar o retorno da das requisições para o browser;
  • 20. Executando... >>cd livraria >>grails run-app Welcome to Grails 1.3.4 - http://grails.org/ Licensed under Apache Standard License 2.0 Grails home is set to: /opt/Groovy/grails-1.3.4 Base Directory: /opt/Groovy/web/livraria Resolving dependencies... Dependencies resolved in 1116ms. Running script /opt/Groovy/grails-1.3.4/scripts/RunApp.groovy Environment set to development [mkdir] Created dir: /opt/Groovy/web/livraria/target/classes [groovyc] Compiling 7 source files to /opt/Groovy/web/livraria/target/classes [copy] Copying 1 file to /opt/Groovy/web/livraria/target/classes [delete] Deleting directory /home/bruno/.grails/1.3.4/projects/livraria/tomcat Running Grails application.. Server running. Browse to http://localhost:8080/livraria
  • 22. Executando... ● Para remover o nome do projeto do fim da URL, como normalmente deve ser no modo de produção, você seta a propriedade app.nome em application.properties, o diretório raiz da nossa aplicação; ● app.nome=/ ● Para rodar a aplicação em outra porta: ● » grails run-app -Dserver.port=9090 ● Para parar a aplicação: ● Ctrl + C
  • 23. Ambientes de execução ● development(dev) ● Em modo de desenvolvimento; ● Padrão; ● production(prod) ● Em modo de produção; ● As alterações são salvas no banco de dados; ● » grails prod run-app ● test(test) ● Ambiente para testes
  • 24. MVC em Grails ● MVC é um padrão de projeto, para outros, uma arquitetura de software no qual a aplicação web é dividida em camadas para separar a lógica de negócio da apresentação dos dados; ● Model – Modelo → domains; ● View – Visão → views; ● Controller – Controlador → controllers;
  • 26. GORM ● GORM é um componente do Grails para implementar o ORM – Mapeamento Objeto Relacional; ● O GORM que cuida da parte do mapeamento das classes -domains- para se tornarem tabelas; ● As classes de domínio são tabelas; ● Os atributos os campos;
  • 27. Classes de domínio ● Classes de domínio são a força vital de uma aplicação grails. Elas definem as “coisas” que você está controlando. – As tabelas do banco de dados são criadas para as classes de domínio correspondente. ● » grails create-domain-class <Nome do Modelo> – Gerar uma classe de domínio em /grails-app/domain/; ● No contexto da nossa aplicação, os domínios existentes são: – Livro; – Categoria; – Autor; – Usuário;
  • 28. Classes de domínio ● » grails create-domain-class liv.enucomp.Livro – O Grails cria a classe de domínio Post.groovy. Abra-o em seu editor de texto. class Livro { static constraints = { } } – Adicione os atributos de acordo com o diagrama de classes. class Livro { String titulo String descricao Float valor int anoLancamento byte[] imagem ...
  • 29. Classes de domínio » grails create-domain-class liv.enucomp.Categoria » grails create-domain-class liv.enucomp.Autor » grails create-domain-class liv.enucomp.seg.Usuario ● Inserir os atributos de acordo com o diagrama de classes;
  • 30. Controllers ● Comando para criar um controller: » grails create-controller <Classe de domínio> ● » grails create-controller liv.enucomp.Livro ● Gera uma classe chamada LivroController.groovy; ● O controller, a partir do método index vazio, chama um arquivo chamado index.gsp; ● Podemos simular uma página dentro .gsp através do método render, ou chamar um outro arquivo; class LivroController { def index = { render 'Hello World' } ou def chama = {render(view:'teste.gsp') } }
  • 31. Scaffolding ● Estrutura de CRUD em MCV já conectada com banco de dados gerada pela mágica da meta- programação. ● Em grails, para tornar isso realidade, basta adicionar uma linha de código em seu controller: class LivroController { def scaffold = Livro } ● Agora rode novamente a aplicação;
  • 32. Scaffolding ● Faça o mesmo agora para as outras classes de domínio: » grails create-controller liv.enucomp.Livro » grails create-controller liv.enucomp.Categoria » grails create-controller liv.enucomp.Autor » grails create-controller liv.enucomp.seg.Usuario ● Adicione o código do scaffolding para todos os domínios, exceto para Usuario, pois vamos fazer de forma diferente; ● Restarte o servidor;
  • 35. Mudar a ordem dos campos ● Adicionar os campos na ordem específica dentro do bloco static constraints; class Livro { static constraints = { imagem() titulo() descricao() anoLancamento() valor() } String titulo String descricao Float valor int anoLancamento byte[] imagem
  • 36. Tratando as Imagens ● Controller em questão: def imagem = { def livro = Livro.get(params.id) byte[] imagem = livro.imagem response.outputStream << imagem } ● Visões: <img src="${createLink(controller:'livro', action:'imagem', id: livroInstance.id)}" width="80px" height="100px"/>
  • 37. Validações class Livro { static constraints = { imagem() titulo(blank:false) descricao(blank:false, maxSize:1000) anoLancamento(blank: false) valor() } … } ● Opções de validação em Grails:
  • 40. Validações ● Para alterar uma validação, edite o arquivo grails- app/i18n/messages_pt_BR.properties default.blank.message = Por favor, digite um valor para [{0}]. O campo não pode estar vazio. ● Mais sobre validações: http://grails.org/doc/latest/guide/7.%20Validation.html
  • 41. Traduzindo o Scaffold ● No mesmo arquivo adicione as seguintes linhas: default.home.label=Principal default.list.label=Listar {0} default.add.label=Adicionar {0} default.new.label=Cadastrar {0} default.create.label=Cadastrar {0} default.show.label=Exibir {0} default.edit.labe=Editar {0} default.button.create.label=Gravar default.button.edit.label=Editar default.button.update.label=Alterar default.button.delete.label=Excluir default.button.delete.confirm.message=Você tem certeza?
  • 42. Views ● Para obter as visões usamos o comando: » grails generate-view liv.enucomp.Livro – O comando irá gerar as visões para a classe Post ● Gerar para todos os domínios: » grails generate-all ● As visões geradas ficam dentro do diretório grails- app/views/liv/enucomp/
  • 43. Relacionamentos ● One-to-One ● belongsTo ● belongsTo ● One-to-Many ● hasMany ● belongsTo ● Many-to-Many ● hasMany ● hasMany
  • 44. Relacionamentos ● Um Livro tem uma Categoria; ● Uma Categoria pode ser de vários Livros ● O Livro pertence a um Autor ● Um Autor pode ter vários Livros
  • 45. Relacionamentos ● Livro.groovy ● static belongsTo = [categoria:Categoria, autor:Autor] ● Categoria.groovy ● static has_many = [livros:Livro] ● Autor.groovy ● static has_many = [livros:Livro]
  • 46. BootStrap.groovy ● Abra o arquivo grails-app/conf/BootStrap.groovy ● class BootStrap { def init = { servletContext -> ● } ● def destroy = {} ● } ● Dentro do bloco init, instancie as classes de domínio. ● Tudo que esta dentro do init será carregado no momento que a aplicação for iniciada.
  • 47. BootStrap.groovy import liv.enucomp.* class BootStrap { def init = { servletContext -> def fernando = new Autor( nome:'Fernando Anselmo', nascimento:new Date(), email:'autor@empresa.com', ) fernando.save() if(fernando.hasErrors()){ println fernando.errors } def destroy = { } }
  • 48. DataSource.groovy ● datasource – Configurações gerais do banco de dados; ● hibernate – configurações específicas do Hibernate, como performance... ● environments – Configurações específicas para cada ambiente de desenvolvimento.
  • 49. Alterar a Base de Dados ● Criar a base de dados; ● Copie o driver JDBC para o diretorio grails-app/lib; ● Ajustar as configurações em DataSource.groovy. ● Em nossa aplicação, vamos usar o banco de dados MySQL. ● O ideal é criar base de dados distintas para cada um dos ambientes(development, production, test), mas em nosso exemplo será criada apenas uma geral.
  • 50. Alterar a Base de Dados $ mysql -u root -p Enter password: ******** Welcome to the MySQL monitor. Commands end with ; or g. ... mysql> create database livraria_dev; ... mysql> grant all on livraria_dev.* to grails@localhost identified by 'server'; ... mysql> exit ● O penultimo comando está concedendo todos os privilégios(criar, apagar...) ao usuário grails que se loga através de localhost, cuja senha é server;
  • 51. Alterar a Base de Dados $ mysql --user=grails –p --database=livraria_dev Welcome to the MySQL monitor. Mysql> show tables; Empty set (0.00 sec) ● Próximo passo é copiar o driver MySQL para o diretório /livraria/lib – O driver pode ser baixado no site: http://dev.mysql.com/downloads/connector/j/ – Descompacte o arquivo .zip e copie o JAR mysql- connector-java-x.x.x-bin.jar – Agora é só ajustar as configurações no DataSource.groovy
  • 52. Alterar a Base de Dados dataSource { pooled = true driverClassName = "com.mysql.jdbc.Driver" username = "grails" password = "server" } environments { development { dataSource { dbCreate = "create-drop" //Vamos definir essa mesma url para todos os ambientes url = "jdbc:mysql://localhost:3306/livraria_dev?autoreconnect=true" } } … }
  • 53. Página inicial ● Criando uma página para listar os livros cadastrados; ● Crie um controller chamado Home; – Adicione o seguinte código: ● def home = { [livroList:Livro.list()]} ● Copie: – A imagem logo.jpg e cole em /web-app/imagens/; – O arquivo style.css para /web-app/css – O arquivo index.html para /grails_apps/views/layout com o nome de index.gsp
  • 54. Página inicial ● Abra o arquivo index.gsp e modifique a linha do css para: ● <link rel="stylesheet" href="${createLinkTo(dir:'css', file:'style.css')}" type="text/css" /> ● Na ultima linha do <head>, a dicione a tag <g:layoutHead/> ● Apague os textos do html e adicione a tag <g:layoutBody/>
  • 55. Página inicial ● Crie um controller chamado Home; ● Modifique para isso: class HomeController { def home = {                          [livroList:Livro.list()]   } }
  • 56. Página inicial ● Crie um arquivo home.gsp dentro de /views/home/ <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="layout" content="index" /> <title> Meu blogão </title> </head> <body> <g:each in="${postList}" status="i" var="post"> <div id="${ (i % 2) == 0 ? 'left' : 'right'}"> <h2>${post.titulo}</h2> <p align="justify"> ${post.conteudo}</p> <div id="notice"> <p>Coloque aqui uma chamada em destaque em seu blog</p> </div> </div> </g:each> </body>
  • 57. Templates ● Alterando as templates geradas por padrão no grails: – grails install-templates ● Arquivos gerados no diretório: – .../livraria/src/templates
  • 58. Autorização ● Um usuário eterno não poderá ter acesso às funcionalidades de administração do sistema, somente um usuário cadastrado poderá ter acesso a tais funções; ● Criar; ● Editar; ● Excluir; ● Listagem;
  • 59. Autorização ● Modificar o UsuarioController: def login = { if (params.cNome) return [cNome:params.cNome, aNome:params.aNome] redirect(url:resource(dir:'' )) } def logout = { session.usuario = null redirect(url:resource(dir:'' )) } def validate = { def usuario = Usuario.findByLogin(params.login) if (usuario && usuario.senha == params.senha) { session.usuario = usuario if (params.cNome) { redirect(controller:params.cNome, action:params.aNome) } redirect(url:resource(dir:'' )) } else { flash.message = "Usuário ou Senha inválidos." render(view:'home' ) } }
  • 60. Autorização ● Criar uma tagLib: ● grails create-tag-lib Protege class ProtegeTagLib { def loginLogout = { out << "<div>" if (session.usuario) { out << "<span style='float:left'>" out << "&nbsp;Bem Vindo <b>${session.usuario.nome}</b>." out << "</span><span style='float:right;margin-right:10px'>" out << "<a href='${createLink(controller:'usuario', action:'logout')}'>" out << "Logout </a></span>" } else { out << "<span style='float:right;margin-right:10px'>" out << "<a href='${createLink(controller:'usuario', action:'login')}'>" out << "Login </a></span>" } out << "</div><br/><br/>" } }
  • 61. Autorização ● Agora adicione a tag no arquivo app/views/layouts/main.gsp na segunte linha: <html> ... </div> <g:loginLogout /> <g:layoutBody /> ... </html>
  • 62. Autorização ● Criar um Filtro: ● Um filtro age em uma determinada ação ou em todas elas. E determina se é antes, depois de ter acontecido. No nosso caso, agiremos sobre todas e antes que elas acontecem. ● grails create-filters liv.enucomp.seg.Seguranca – Altere o conteudo do arquivo grails- app/conf/liv/.../SegurancaFilters.groovy
  • 63. Autorização ... def filters = { all(controller:'*', action:'*') { before = { if (!controllerName) return true def allowedActions = [ 'index' , 'login', 'logout' , 'validate', 'home', 'entrar'] if (!session.usuario && !allowedActions.contains(actionName)){ redirect(controller:'usuario' , action:'entrar.gsp' , params:['cNome': controllerName, 'aNome': actionName]) return false } } ...
  • 64. Autorização ● Agora iremos construirum formulário de login. Crie um arquivo chamado entrar.jsp e, grails-app/views/usuario/ com os seguintes códigos: <html> <head> <meta name="layout" content="main" /> <title>Login</title> </head> <body> <g:if test="${flash.message}" > <div class="message" >${flash.message}</div> </g:if> <h1 style="margin-left:20px;">Bem Vindo a Livraria Virtual</h1> <p style="margin-left:20px;width:80%">Para modificar os dados é necessário proceder o acesso ao sistema:</p> <br /> <g:form action="validate" > <input type="hidden" name="cNome" value="${cNome}" > <input type="hidden" name="aNome" value="${aNome}" > <table>
  • 65. cont. entrar.gsp <tr class="prop" > <td class="name" > <label for="login" >Usuário:</label> </td> <td class="value" > <input type="text" id="login" name="login" value="" > </td> </tr> <tr class="prop" > <td class="name" > <label for="senha" >Senha:</label> </td> <td class="value" > <input type="password" id="senha" name="senha" value="" > </td> </tr> <tr> <td></td> <td><input type="submit" value="Acessar" /></td> </tr> </table> </g:form> </body> </html>
  • 66. Grails Deployment ● Container ● É a parte do servidor destinado a alojar a tecnologia Java – Tomcat: Container Web para Servlet e JSP – Apache: Servidor web ● Deploy → Implantar ● Instalar a sua aplicação em um servidor de aplicações, mais especificamente, em um container.
  • 67. Grails Deployment ● grails war → gera um arquivo .war, o servidor retornará para o browser a aplicação rodando, já em modo de produção. >>grails war ● Copie o arquivo .war gerado pelo comando para o diretório dentro do container, no servidor. No nosso caso é o Apache-Tomcat. – .../apache-tomcat-x.x.xx/webapps/
  • 68. Grails Plugins ● Instalando Plugins ● grails install-plugin [URL/File] ● grails install-plugin [name] [version]* – A versão é opcional ● grails install-plugin http://foo.com/grails-bar-1.0.zip ● grails install-plugin ../grails-bar-1.0.zip ● grails install-plugin jsecurity ● grails install-plugin jsecurity 0.1
  • 69. Grails Plugins ● http://www.grails.org/plugin/category/all ● Listagem de plugins disponíveis;
  • 70. O plugin RichUI ● Esse plugin gera componentes gráficos para realçar as nossas visões; ● http://www.grails.org/RichUI+Plugin ● grails install-plugin .../grails-richui-0.8.zip – Auto Complete; – Calendários; – Tabs “Guias”; – Editor de texto; – ...
  • 71. O plugin RichUI ● Adicione <resource:richTextEditor type="advanced" /> dentro da tag <head> nas views onde há fomulário com campos do tipo conteúdo; ● Substitua a tag <input type='textArea'.../> do formulário para <richui:richTextEditor name="conteudo" value="$ {fieldValue(bean: postInstance,field:'conteudo')}"/>
  • 72. Plugins Interessantes ● Spring Security Core; ● Correios-br; ● Searchable; ● Commentable; ● Mail; ● Avatar; ● Twitter
  • 73. Referências ● Getting Started with Grails Second Edition ● Scott Davis e Jason Rudolph ● Introduction_to_Groovy_and_Grails ● Mohamed Seifeddine ● Grails: do Groovy à Web ● Artigo DevMedia - Henrique Lobo Weissmann ● Em Busca do Grails ● Fernando Anselmo ● Site oficial do Grails ● http://www.grails.org/Quick+Start
  • 74. Referências ● Criando um blog em cinco minutos com Grails ● http://www.michelsilva.net/index.php?option=com_content&task=vie ● Grails: um guia rápido e indireto ● http://www.itexto.net/devkico/?page_id=220