Produtividade na web com Groovy e Grails
Quem somos? Lucas Aquiles / @lucas_aquiles ADS / IFPI [email_address] lucasaquiles.com.br/blog Fco Marcos / @fcomarcosroch...
O Grails <ul><li>Inspiração </li><ul><li>Convenção ao invés de configuração
Ruby on Rails, Django, TurboGears </li></ul><li>Construído sobre gigantes </li><ul><li>Java/ JEE
Spring Framework
Hiberante </li></ul><li>Reduz a complexidade
Produtividade </li></ul>
O Grails <ul><li>GORM </li><ul><li>Baseado no Hiberante </li></ul><li>Camada de visão </li><ul><li>GSP (Groovy Server Pages)
TagLib dinâmicas e SiteMesh </li></ul><li>Camada de controle: </li><ul><li>Baseado no Spring MVC / Spring Web Flow </li></...
 
Grails - Instalação e Configuração <ul><li>http://www.grails.org/Downloads </li><ul><li>Descompacte o arquivo e configure ...
“Hello Grails” </li><ul><li>grails create-app helloword
grais create-controller HelloWord
grails- app/controllers/helloword/HelloWordController.groovy
def helloword = { render “meu 123487 hello word!” } </li></ul></ul></ul>
Comandos - Grails <ul><li>Comandos básicos </li><ul><li>grails  create-app  AppDemo
grails  create-domain-class  br.edu.ifpi.MinhaClass
grails  create-controller  br.edu.ifpi.MinhaClass
grails  create-service  br.edu.ifpi.MinhaClass
grails  generate-all  // gera as views os controlleres
grails  schema-export  // expora o esquema de tabelas
grails  console  // abre o console do groovy
grails  clean  // limpa aterações
grails  run-app  // roda a aplicação </li></ul></ul>
Grails - Estrutura Arquivos de configuração: DataSource.groovy Config.groovy Bootstrap.groovy internacionalização web.xml ...
DataSource - Grails <ul><li>DataSource - Arquivo de configuração de banco de dados
Configurado por padrão com o HSQLDB </li><ul><li>Um banco de dados leve, usado para testes </li></ul><li>Possui três ambie...
DataSource - Grails
MVC - Grails <ul><li>M odelo – Tudo que será usado como Entidade ficá aqui. </li><ul><li>grails-app/domain/
grails create-domain-class
Separar a lógica de negócio do modelo
Cada classe de domínio corresponde à uma tabela do banco de dados relacional </li></ul></ul>
MVC - Grails <ul><li>C ontroller: Toda regra de negócio fica no controller. </li><ul><li>grails-app/controller
grails create-controller
action:  São clousures que irão receber as requisições e fazer alguma coisa </li><ul><li>def actionQueFazAlgumaCoisa = {  ...
MVC - Grails <ul><li>Controller </li><ul><li>params:  é um map (hash) de parâmetros de uma requisição </li><ul><li>def  ac...
MVC - Grails <ul><li>Controller </li><ul><li>render:  renderiza uma resposta
Upcoming SlideShare
Loading in...5
×

Produtividade na web_com_groovy_e_grails_pt2

881

Published on

Slides da apresentação s

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
881
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
34
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Produtividade na web_com_groovy_e_grails_pt2

  1. 1. Produtividade na web com Groovy e Grails
  2. 2. Quem somos? Lucas Aquiles / @lucas_aquiles ADS / IFPI [email_address] lucasaquiles.com.br/blog Fco Marcos / @fcomarcosrocha ADS / IFPI Colaborador LAPESI fmarcosrocha@gmail.com
  3. 3. O Grails <ul><li>Inspiração </li><ul><li>Convenção ao invés de configuração
  4. 4. Ruby on Rails, Django, TurboGears </li></ul><li>Construído sobre gigantes </li><ul><li>Java/ JEE
  5. 5. Spring Framework
  6. 6. Hiberante </li></ul><li>Reduz a complexidade
  7. 7. Produtividade </li></ul>
  8. 8. O Grails <ul><li>GORM </li><ul><li>Baseado no Hiberante </li></ul><li>Camada de visão </li><ul><li>GSP (Groovy Server Pages)
  9. 9. TagLib dinâmicas e SiteMesh </li></ul><li>Camada de controle: </li><ul><li>Baseado no Spring MVC / Spring Web Flow </li></ul><li>Dependency Injection (DI) </li><ul><li>Spring Container </li></ul><li>Internacionalização (i18n) </li></ul>
  10. 11. Grails - Instalação e Configuração <ul><li>http://www.grails.org/Downloads </li><ul><li>Descompacte o arquivo e configure o GRAILS_HOME
  11. 12. “Hello Grails” </li><ul><li>grails create-app helloword
  12. 13. grais create-controller HelloWord
  13. 14. grails- app/controllers/helloword/HelloWordController.groovy
  14. 15. def helloword = { render “meu 123487 hello word!” } </li></ul></ul></ul>
  15. 16. Comandos - Grails <ul><li>Comandos básicos </li><ul><li>grails create-app AppDemo
  16. 17. grails create-domain-class br.edu.ifpi.MinhaClass
  17. 18. grails create-controller br.edu.ifpi.MinhaClass
  18. 19. grails create-service br.edu.ifpi.MinhaClass
  19. 20. grails generate-all // gera as views os controlleres
  20. 21. grails schema-export // expora o esquema de tabelas
  21. 22. grails console // abre o console do groovy
  22. 23. grails clean // limpa aterações
  23. 24. grails run-app // roda a aplicação </li></ul></ul>
  24. 25. Grails - Estrutura Arquivos de configuração: DataSource.groovy Config.groovy Bootstrap.groovy internacionalização web.xml Libs adicionais: ex mysql-connector.jar
  25. 26. DataSource - Grails <ul><li>DataSource - Arquivo de configuração de banco de dados
  26. 27. Configurado por padrão com o HSQLDB </li><ul><li>Um banco de dados leve, usado para testes </li></ul><li>Possui três ambientes de trabalho </li><ul><li>Test, Production e Development </li></ul></ul>
  27. 28. DataSource - Grails
  28. 29. MVC - Grails <ul><li>M odelo – Tudo que será usado como Entidade ficá aqui. </li><ul><li>grails-app/domain/
  29. 30. grails create-domain-class
  30. 31. Separar a lógica de negócio do modelo
  31. 32. Cada classe de domínio corresponde à uma tabela do banco de dados relacional </li></ul></ul>
  32. 33. MVC - Grails <ul><li>C ontroller: Toda regra de negócio fica no controller. </li><ul><li>grails-app/controller
  33. 34. grails create-controller
  34. 35. action: São clousures que irão receber as requisições e fazer alguma coisa </li><ul><li>def actionQueFazAlgumaCoisa = { render “o/” } </li></ul></ul></ul>
  35. 36. MVC - Grails <ul><li>Controller </li><ul><li>params: é um map (hash) de parâmetros de uma requisição </li><ul><li>def actionQuePegaOParamsEExibe = { </li><ul><li>render “parametros: ${params}” </li></ul><li>} </li></ul><li>flash: map temporário que armazena objetos da seção, o hash é limpo a cada nova requisição </li><ul><li>def actionQueMostraOFlashMessage = { </li><ul><li>flash.message = “${params}” </li></ul><li>} </li></ul></ul></ul>
  36. 37. MVC - Grails <ul><li>Controller </li><ul><li>render: renderiza uma resposta
  37. 38. redirect: redireciona uma ação usando HTTP redirect </li><ul><li>def actionQueRedireciontaPraOutraAction = { </li><ul><li>redirect(controller:meuController, action:”outraAction”) </li></ul><li>} </li></ul></ul></ul>
  38. 39. MVC – Grails <ul><li>Controller </li><ul><li>scaffolding </li><ul><li>cria a estrura de CRUD para aquele modelo
  39. 40. def scaffolding = MinhaClasseDeDominio </li></ul></ul></ul>
  40. 41. MVC - Grails <ul><li>Views </li><ul><li>crails create-view </li><ul><li>grails-app/views/<domain>/
  41. 42. <% %> ou <%= %> </li></ul><li>Utilizam a GSP taglib </li><ul><li>Evita misturar código de programação com linguagem de marcação
  42. 43. Semelhando ao JSP </li><ul><li>def show = { [book:Book.get(params.id)]}
  43. 44. <%= book.title %> </li></ul></ul></ul></ul>
  44. 45. MVC - Grails <ul><li>Views </li><ul><li>Loops </li><ul><li><g:each in=”${livros}”> </li><ul><li><p>Título: ${it.titulo}</p> </li></ul><li></g:each>
  45. 46. <g:each in=”${livros}” var=”livro”> </li><ul><li><p>Título: ${livro.titulo}</p> </li></ul><li></g:each> </li></ul></ul></ul>
  46. 47. MVC - Grails <ul><li>Views </li><ul><li>Condições </li><ul><li><g:if test=”${nome == 'tr00'}”> </li><ul><li>Hello, ${tr00} </li></ul><li></g:if>
  47. 48. <g:else> </li><ul><li>--- faz alguma coisa </li></ul><li></g:else>
  48. 49. <g:elseif test=”2 % 2 == 0”> </li><ul><li>– faz outra coisa </li></ul><li></g:elseif> </li></ul></ul></ul>
  49. 50. Service - Grails <ul><li>Services </li><ul><li>grails create-service
  50. 51. grails-app/services/
  51. 52. Centraliza a regra de negócio
  52. 53. Compartilha a mesma regra com classes de domínio que possuam essa lógica
  53. 54. Injetado automaticamente no controller pelo Spring </li></ul></ul>
  54. 55. Service - Grails <ul><li>Services </li><ul><li>Transactions
  55. 56. transactional = true </li><ul><li>Essencial para manter a integridade do banco de dados via ACID; </li><ul><li>Atomicidade – A terefa foi completa ou não
  56. 57. Consistência - o banco de dados deve permanecer consistente antes e depois de uma operação
  57. 58. Isolação – uma transação está isolada das outras operações
  58. 59. Durabilidade – desde que a transação esteja feita, isso garante que a transação não possa ser desfeita </li></ul></ul></ul></ul>
  59. 60. Scaffolding - Grails <ul><li>Scaffolding </li><ul><li>Permite criar rapidamente interfaces de CRUD para classes de domínio que estejam definidas
  60. 61. Ótimo para prototipação </li></ul></ul>
  61. 62. Scaffolding - Grails <ul><li>Scaffolding dinâmico: </li><ul><li>def scaffolding = MyDomainClass </li></ul><li>Scaffolding estático </li><ul><li>grails genreate-views: gera as views para uma classe de domínio específica
  62. 63. grails generate-controller : cria o controlador para uma classe de domínio específica
  63. 64. grails generate-all : cria os controlers + views
  64. 65. ex: grails generate-all br.edu.ifpi.beans.Aluno </li></ul></ul>
  65. 66. MVC - Grails <ul><li>GORM </li><ul><li>Hibernate por baixo dos panos
  66. 67. Permite fazer o mapeamento objeto / relacional do modelo orientado a objetos com o banco de dados relacional
  67. 68. Cada classe de domínio representa uma tabela do banco de dados
  68. 69. Uma instância representa uma linha da tabela
  69. 70. Cada atributo da classe representa uma coluna da tabela </li></ul></ul>
  70. 71. MVC - Grails <ul><li>Enquanto isso no hibernate ... </li><ul><li>Criar uma classe, anotar a classe com a implementação do JPA, mapea a classe no arquivo de configuração, cria uma fabrica de sessões, cria um Dao, e por fim instancia um objeto da classe e persiste. </li></ul></ul>
  71. 72. TUDO ISSO?
  72. 73. GORM - Grails <ul><li>Com o GORM do grails </li><ul><li>grails create-domain-class Usuario
  73. 74. grails console
  74. 75. def usuario = new User(login:”tr00”,password:”tr00”)
  75. 76. usuario.save()
  76. 77. Não precisa extender de ninguém, não precisa de annotations.
  77. 78. grande semelhança com o ActiveRecord </li></ul></ul>
  78. 79. GORM - Grails <ul><li>Métodos do GORM </li><ul><li>save()
  79. 80. list()
  80. 81. delete()
  81. 82. get(Object o) </li></ul><li>Buscadores dinâmicos </li></ul>
  82. 83. GORM - Grails <ul><li>Buscadores dinâmicos </li><ul><li>FindBy* </li><ul><li>Usuario.findByUsernameAndPassword(“mock”,”mocklogin”) </li></ul><li>FindAllBy* </li><ul><li>Usuario.findAllByGroup(Group.get(1)) </li></ul><li>FindWhere, findAllWhere </li><ul><li>Usuario.findWhere([ &quot;username&quot;: &quot;mock&quot;, login: &quot;mocklogin&quot;]) </li></ul></ul><li>HQL – Hibernate Query Language </li><ul><li>User.find(“from User where login = :login and senha = :senha”, [“mock”,”mocklogin”])
  83. 84. Parâmetros: </li><ul><li>max, sort , order </li></ul></ul></ul>
  84. 85. ORM - Grails <ul><li>Comparadores </li><ul><li>Between </li><ul><li>User.findByDateCreatedBetween(today-10, today) </li></ul><li>Like </li><ul><li>User.findByBioLike('%tr00%') </li></ul><li>NotEqual </li><ul><li>Album.findByTitleNotEqual('titulo de teste') </li></ul><li>IsNull </li><ul><li>User.findByGroupIsNull() </li></ul><li>IsNotNull </li><ul><li>User.findByGroupIsNotNull() </li></ul></ul></ul>
  85. 86. GORM - Grails <ul><li>Usando Criteria do Hibernate
  86. 87. Uma das mais poderosos de de busca </li><ul><li>get : retorna uma instancia da query
  87. 88. list : retorna uma lista de instancias
  88. 89. count : retorna um total de resultados como um inteiro da query
  89. 90. def c = DomainClass.createCriteria()
  90. 91. def result = c.list{ eq('nome','tr00' } </li></ul></ul>
  91. 92. GORM - Grails <ul><li>Relacionamentos </li><ul><li>Permite 4 tipos de relacionamentos </li><ul><li>One-to-one, One-to-Many, Many-to-One e Many-to-Many </li></ul><li>OneToMany </li><ul><li>Player hasOne club </li></ul><li>HasMany
  92. 93. - club hasMany players </li><ul><li>Métodos dinâmicos
  93. 94. Club.addToPlayers(new Player())
  94. 95. Club.removeFromPlayers(Player.get(1L)) </li></ul><li>BelongsTo </li><ul><li>Player belongsTo clube </li></ul></ul></ul>
  95. 96. i18n - Grails <ul><li>Internacionalização i18N </li><ul><li>grails-app/i18n/
  96. 97. Permite exibir mensagens no idioma de preferência do usuário
  97. 98. Os arquivos .properties </li></ul></ul>
  98. 99. Testes - Grails <ul><li>Testes </li><ul><li>Sempre que uma um controller, service ou classe domínio é criada, é criada uma classe de teste de integração correspondente
  99. 100. Usa o Junit e o Canoo por baixo dos panos
  100. 101. Permite fazer: </li><ul><li>Testes unitários
  101. 102. Testes de integração
  102. 103. Testes funcionais </li></ul><li>A aplicação vai trabalhar como esperado
  103. 104. A classe de testes extendem de GroovyTestCase
  104. 105. Permite o uso de assert*, setUp e tearDown </li></ul></ul>
  105. 106. Tests - Grails <ul><li>Testes </li><ul><li>Teste de Integração != teste Unitário
  106. 107. Testes unitários no grails são criados com o comando: </li><ul><li>grails create-unit-test
  107. 108. tests/unit/ </li></ul><li>nos testes unitários os métodos dinâmicos como save, findBy* não estão disponíveis
  108. 109. O grails faz isso pra ajudar você a diferenciar testes unitários e de integração
  109. 110. testes unitários se preucupam em testar apenas uma parte do código e não o problema como um todo </li></ul></ul>
  110. 111. Testes - Grails <ul>mas como testar sem os métodos dinâmicos? </ul>
  111. 112. Testes - Grails <ul><li>Testes </li><ul><li>Aí entram em cena o MockFor* e o StubFor*
  112. 113. http://groovy.codehaus.org/Groovy+Mocks </li></ul></ul>
  113. 114. Aplicação de exemplo - Grails <ul><li>Querist </li><ul><li>Aplicação de perguntas e respostas onde um usuário envia perguntas e outros usuários enviam as respostas.
  114. 115. Uma resposta pode receber votos, a resposta mais votada é tída como a mais confiável </li></ul><li>Regras: </li><ul><li>Um usuário tem muitas perguntas e mutias respostas
  115. 116. Uma pergunta tem um usuário ( quem perguntou ) e várias respostas
  116. 117. Uma resposta pertence a uma pergunta e possui vários usuários ( quem respondu ) </li></ul></ul>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×