[email protected]
O que é Grails?
Grails é um framework open source para a
construção de aplicações Java/JEE. Ou seja,
aplicações “enterprise” que executam em um
Web Container ou Application Server.
Por que Grails?



Baseia-se em frameworks como Rails e
Django, sendo guiado pelas mesma práticas e
princípios, como CoC (convention over
configuration) e DRY (don't repeat yourself);
É full stack e construído sobre tecnologias
maduras como Groovy, ANT, Log4J, Sitemesh,
Spring Framework e Hibernate, entre outras;
É extensível via plugins;
Por que Grails?




Dispõe de ampla variedade de plugins (já
implementados e testados) para a realização
das mais diferentes tarefas;
É compatível com a especificação JEE;
Permite a migração incremental de outras
aplicações “legado”;
Dispõe de dynamic or static scaffolding para
operações CRUD (Create, Read, Update and
Delete);
Por que Grails?

Está licenciado sob a Apache License, Version
2.0.
Criando uma aplicação
grails create-app testapp
Iniciando a aplicação
cd testapp ; grails run-app
Acessando a aplicação
Diretórios mais importantes da
aplicação

grails-app - diretório base para os artefatos Grails

conf - arquivos de configuração

controllers - web controllers (C do MVC)

domain - classes de domínio

services - camada de serviço

views - .jsp, .gsp, .ftl (V do MVC)

lib - bibliotecas de suporte (.jar)

src - classes Groovy e Java de suporte para a aplicação

scripts - Gant scripts

test - testes unitários e integrados
Criando uma classe de domínio
grails create-domain-class Trip
Modificando a classe de domínio
Modificando a classe de domínio
Gerando um controller
grails create-controller Trip
Modificando o controller para usar
scaffolding dinâmico
Modificando o controller para usar
scaffolding dinâmico
Iniciando a aplicação novamente
grails run-app
Acessando a aplicação novamente
Acessando a aplicação novamente
Adicionando mais uma propriedade
à classe de domínio
F5/Refresh no browser
Adicionando mais uma action ao
controller
Acessando a nova action criada
http://localhost:8080/testapp/trip/myList
Navegando pela aplicação
Navegando pela aplicação
Navegando pela aplicação
Adicionando obrigatoriedade à
propridade name
Agora, ao tentar cadastrar Trip sem
name
Agora, ao tentar cadastrar Trip sem
name
Gerando o controller e as views
para utilização sem scaffolding
grails generate-all testapp.Trip
Iniciando a aplicação novamente
grails run-app
E acessando a aplicação
Entendendo o controller gerado
Se abrirmos o controller novamente, podemos
entender o que acontece quando a action “save”
é invocada (botão create da tela de cadastro de
Trip).
Entendendo o controller gerado
Entendendo o controller gerado


Uma nova instância de Trip é criada a partir de
um mapa chamado “params” (esse mapa
contém todos os parâmetros e respectivos
valores enviados na requisição);
Há uma tentativa de salvar essa Trip.

Se a Trip pôde ser salva, uma mensagem de
sucesso é exibida e o usuário é
redirecionado para a action “show”;

Se a Trip não pôde ser salva, o usuário é
encaminhado para a view “create”.
Entendendo o controller gerado
Ao encaminhar para a view create, o controler
indica que o model conterá um Map com um
elemento sob a chave 'tripInstance'. Se
observarmos essa view, saberemos como esse
elemento é acessado.
No caso, a view gerada é um gsp (Groovy
Server Page), mas poderíamos usar jsp, ftl
(FreeMarker template) ou qualquer outra forma
de view suportada pelo Spring MVC.
Entendendo a view gerada
Entendendo a view gerada
Na parte marcada do create.gsp, vemos que a
grails tag g:hasErrors é usada para verificar se
há algum erro associado à tripInstance. Se
houver, a grails tag g:renderErrors é usada para
exibir a lista de erros.
É isso que gera a mensagem quando não
preenchemos o valor para o campo name.
Entendendo o controller gerado
Entendendo a view gerada
Entendendo a classe de domínio
Voltando um pouco ao controller, vemos que ele
faz uso de métodos como Trip.save(), Trip.get()
e Trip.list(). Esses são métodos dinâmicos
adicionados pelo GORM (Grails' object relational
mapping), cuja implementação padrão é feita
sobre o Hibernate.
São esses métodos que irão, eventualmente,
inserir os dados no banco de dados, alterá-los
ou consultá-los. Outro método que vale destacar
é o DomainClass.find().
Instalando e usando um plugin
Uma vez que a recomendação é que todo
acesso a dados seja feito a partir de uma classe
de serviço (que conterá a lógica de negócio de
aplicação e também garantirá a
transacionalidade da ação), mas queremos
manter a aplicação simples, vamos instalar um
plugin que torna as “actions” dos controllers
transacionais: É o transactional-controller.
Instalando e usando um plugin
grails install-plugin transactional-controller
Instalando e usando um plugin
De acordo com a documentação do plugin,
precisamos indicar as “actions” que serão
transacionais. Vamos marcar a save e a update,
ainda que, nessa aplicação de exemplo, isso
não seja realmente necessário.
Instalando e usando um plugin
Iniciando a aplicação novamente
grails run-app
Acessando a aplicação e
navegando por ela
E removendo o plugin, no caso de
“imprevistos” ;-)
grails uninstall-plugin transactional-controller
Alterando configurações específicas
de um ambiente
Agora suponha que o banco de dados de
produção não seja do mesmo tipo que o de
desenvolvimento (no caso do nosso exemplo, o
hsqldb que acompanha o Grails) ou não seja
acessado da mesma forma. Para prepararmos
nossa aplicação para produção, poderíamos (por
exemplo), incluir o driver JDBC necessário no
diretório lib e modificar a seção “production” do
arquivo DataSource.groovy.
Alterando configurações específicas
de um ambiente
Gerando o pacote (.war) para a
implantação
Uma vez que a aplicação já esteja testada
(todos os testes automáticos e manuais tenham
sido executados com sucesso) e validada,
podemos gerar o .war para ser implantado em
produção
Gerando o pacote (.war) para a
implantação
grails war
Gerando o pacote (.war) para a
implantação
Fim
Obrigado.
[email protected]
Download

Arquivo