daniel@techdm
DESCRIPTION
[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?. - PowerPoint PPT PresentationTRANSCRIPT
![Page 2: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/2.jpg)
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.
![Page 3: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/3.jpg)
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;
![Page 4: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/4.jpg)
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);
![Page 5: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/5.jpg)
Por que Grails?
Está licenciado sob a Apache License, Version 2.0.
![Page 6: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/6.jpg)
Criando uma aplicaçãograils create-app testapp
![Page 7: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/7.jpg)
Iniciando a aplicaçãocd testapp ; grails run-app
![Page 8: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/8.jpg)
Acessando a aplicação
![Page 9: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/9.jpg)
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
![Page 10: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/10.jpg)
Criando uma classe de domíniograils create-domain-class Trip
![Page 11: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/11.jpg)
Modificando a classe de domínio
![Page 12: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/12.jpg)
Modificando a classe de domínio
![Page 13: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/13.jpg)
Gerando um controller
grails create-controller Trip
![Page 14: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/14.jpg)
Modificando o controller para usar scaffolding dinâmico
![Page 15: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/15.jpg)
Modificando o controller para usar scaffolding dinâmico
![Page 16: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/16.jpg)
Iniciando a aplicação novamentegrails run-app
![Page 17: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/17.jpg)
Acessando a aplicação novamente
![Page 18: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/18.jpg)
Acessando a aplicação novamente
![Page 19: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/19.jpg)
Adicionando mais uma propriedade à classe de domínio
![Page 20: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/20.jpg)
F5/Refresh no browser
![Page 21: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/21.jpg)
Adicionando mais uma action ao controller
![Page 22: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/22.jpg)
Acessando a nova action criadahttp://localhost:8080/testapp/trip/myList
![Page 23: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/23.jpg)
Navegando pela aplicação
![Page 24: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/24.jpg)
Navegando pela aplicação
![Page 25: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/25.jpg)
Navegando pela aplicação
![Page 26: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/26.jpg)
Adicionando obrigatoriedade à propridade name
![Page 27: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/27.jpg)
Agora, ao tentar cadastrar Trip sem name
![Page 28: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/28.jpg)
Agora, ao tentar cadastrar Trip sem name
![Page 29: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/29.jpg)
Gerando o controller e as views para utilização sem scaffolding
grails generate-all testapp.Trip
![Page 30: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/30.jpg)
Iniciando a aplicação novamentegrails run-app
![Page 31: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/31.jpg)
E acessando a aplicação
![Page 32: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/32.jpg)
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).
![Page 33: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/33.jpg)
Entendendo o controller gerado
![Page 34: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/34.jpg)
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”.
![Page 35: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/35.jpg)
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.
![Page 36: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/36.jpg)
Entendendo a view gerada
![Page 37: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/37.jpg)
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.
![Page 38: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/38.jpg)
Entendendo o controller gerado
![Page 39: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/39.jpg)
Entendendo a view gerada
![Page 40: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/40.jpg)
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().
![Page 41: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/41.jpg)
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.
![Page 42: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/42.jpg)
Instalando e usando um plugingrails install-plugin transactional-controller
![Page 43: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/43.jpg)
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.
![Page 44: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/44.jpg)
Instalando e usando um plugin
![Page 45: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/45.jpg)
Iniciando a aplicação novamentegrails run-app
![Page 46: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/46.jpg)
Acessando a aplicação e navegando por ela
![Page 47: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/47.jpg)
E removendo o plugin, no caso de “imprevistos” ;-)
grails uninstall-plugin transactional-controller
![Page 48: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/48.jpg)
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.
![Page 49: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/49.jpg)
Alterando configurações específicas de um ambiente
![Page 50: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/50.jpg)
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
![Page 51: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/51.jpg)
Gerando o pacote (.war) para a implantaçãograils war
![Page 52: daniel@techdm](https://reader035.vdocuments.us/reader035/viewer/2022070404/56813ad0550346895da2f63d/html5/thumbnails/52.jpg)
Gerando o pacote (.war) para a implantação