SlideShare uma empresa Scribd logo
1 de 38
Baixar para ler offline
DESENVOLVIMENTO	
  WEB	
  COM	
  	
  


GRAILS                    	
  


Ricardo	
  Wendell	
  
rickwendell@gmail.com	
  
OBJETIVO	
  


    Apresentar	
  as	
  principais	
  
  caracterís4cas	
  e	
  componentes	
  
             do	
  Grails	
  
                   	
  
O	
  QUE	
  É	
  O	
  GRAILS?	
  
Um	
  framework	
  web	
  para	
  a	
  JVM	
  
	
  
Foco	
  em	
  produIvidade!	
  
     	
  Linguagem	
  dinâmica	
  –	
  Groovy	
  
     	
  Conven&on	
  over	
  Configura&on	
  
         Ferramentas	
  que	
  promovem	
  agilidade	
  
FERRAMENTAS	
  QUE	
  AJUDAM…	
  

DSLs	
  	
  
Geradores	
  de	
  código	
  
Resolução	
  de	
  dependências	
  
Configurações	
  mul4-­‐ambientes	
  
POR	
  DEBAIXO…	
  
Spring	
  Framework	
  
Spring	
  MVC	
  
Hibernate	
  
SiteMesh	
  
Servlet	
  API	
  
COMPONENTES	
  DO	
  GRAILS	
  
Scripts	
  de	
  criação	
  
Model-­‐View-­‐Controller	
  (MVC)	
  
Grails	
  Object	
  Rela4onal	
  Mapping	
  (GORM)	
  
Services	
  
Resolução	
  de	
  dependências	
  e	
  configurações	
  
Plugins	
  
	
  
SCRIPTS	
  DE	
  CRIAÇÃO	
  
Geram	
  várias	
  partes	
  da	
  aplicação	
  
  	
  create-­‐app:	
  cria	
  uma	
  aplicação	
  
  	
  create-­‐domain-­‐class:	
  cria	
  uma	
  nova	
  classe	
  de	
  
      domínio	
  
  	
  generate-­‐all:	
  gera	
  o	
  controller	
  e	
  views	
  associadas	
  
      para	
  uma	
  classe	
  de	
  domínio	
  
  	
  run-­‐app:	
  executa	
  a	
  aplicação	
  no	
  Tomcat	
  
      	
  
ESTRUTURA	
  DA	
  APLICAÇÃO	
  



            Pastas	
               PerspecIva	
  Grails	
  (STS)	
  
OBJETOS	
  DE	
  DOMÍNIO	
  (MODELO)	
  
Objetos	
  são	
  automaIcamente	
  mapeados	
  para	
  
     tabelas	
  no	
  banco	
  
	
  
Configurações	
  adicionais	
  com	
  DSL	
  
   Relacionamentos	
  entre	
  objetos	
  
   Validações	
  
EXEMPLO	
  
 class Livro{
    String titulo
     String autor
     String descricao

     Date dataRevisao


     static hasMany = [comentarios: Comentario]

     static constraints = {
         titulo nullable: false, blank: false, size: 1..1024

         autor nullable: false, blank: false, size: 2..255
         descricao nullable:true, blank: true, maxSize: 1000000
         dataRevisao nullable: true
     }
 }
GORM	
  
Camada	
  padrão	
  de	
  persistência	
  
Funcionalidades	
  para	
  leitura,	
  listagem,	
  
  ordenação,	
  contagem,	
  persistência	
  e	
  remoção	
  
Definição	
  de	
  relacionamentos	
  entre	
  objetos	
  
Métodos	
  de	
  busca	
  dinâmicos	
  
Consultas	
  com	
  Criteria,	
  HQL	
  ou	
  SQL	
  
Suporte	
  a	
  paginação	
  
VALIDAÇÕES	
  DAS	
  CLASSES	
  DE	
  DOMÍNIO	
  
Os	
  métodos	
  save()	
  e	
  validate()	
  da	
  classe	
  de	
  
     domínio	
  disparam	
  as	
  validações	
  
	
  
Cada	
  objeto	
  contém	
  uma	
  coleção	
  de	
  erros	
  de	
  
     validação	
  
	
  
17	
  validações	
  prontas	
  
	
  
Muitas	
  das	
  restrições	
  influenciam	
  a	
  geração	
  das	
  
     tabelas	
  para	
  as	
  classes	
  de	
  domínio	
  
VALIDAÇÕES	
  




hip://grails.org/doc/latest/ref/Constraints/Usage.html	
  
RELACIONAMENTOS:	
  UM-­‐PARA-­‐UM	
  
Declarado	
  com	
  um	
  atributo	
  do	
  4po	
  da	
  classe	
  
     referenciada	
  
	
  
Bi-­‐direcional:	
  cada	
  classe	
  possui	
  um	
  atributo	
  do	
  
     outro	
  4po	
  
	
  
En4dade	
  forte	
  e	
  cascading	
  são	
  declarados	
  com	
  a	
  
     propriedade	
  belongsTo	
  
RELACIONAMENTOS:	
  UM-­‐PARA-­‐UM	
  
class	
  Face	
  {	
  
      	
  Nariz	
  nariz	
  
}	
  
	
  
class	
  Nariz	
  {	
  
      	
  sta4c	
  belongsTo	
  =	
  [face:	
  Face]	
  
}	
  
RELACIONAMENTOS:	
  UM-­‐PARA-­‐MUITOS	
  
Relacionamentos	
  um-­‐para-­‐muitos	
  usa	
  a	
  
     propriedade	
  hasMany	
  	
  
	
  
A	
  propriedade	
  belongsTo	
  também	
  pode	
  ser	
  
     usada	
  nesse	
  cenário	
  para	
  a	
  definição	
  de	
  
     relacionamento	
  bi-­‐direcional	
  
RELACIONAMENTOS:	
  UM-­‐PARA-­‐MUITOS	
  
class	
  Autor	
  {	
  
	
  	
  	
  	
  String	
  nome	
  
           	
  sta4c	
  hasMany	
  =	
  [	
  livros	
  :	
  Livro	
  ]	
  
}	
  
class	
  Livro	
  {	
  
           	
  String	
  4tulo	
  
}	
  
RELACIONAMENTOS:	
  MUITOS-­‐PARA-­‐MUITOS	
  
Declarado	
  ao	
  adicionar	
  a	
  propriedade	
  hasMany	
  
     a	
  cada	
  classe	
  do	
  relacionamento	
  
	
  
Uma	
  das	
  classes	
  deve	
  declarar	
  a	
  propriedade	
  
     belongsTo	
  para	
  definir	
  a	
  en4dade	
  forte	
  
RELACIONAMENTOS:	
  MUITOS-­‐PARA-­‐MUITOS	
  
class	
  Book	
  {	
  
	
  	
  	
  sta4c	
  belongsTo	
  =	
  Author	
  
	
  	
  	
  sta4c	
  hasMany	
  =	
  [authors:Author]	
  
	
  	
  	
  String	
  4tle	
  
}	
  
	
  
class	
  Author	
  {	
  
	
  	
  	
  sta4c	
  hasMany	
  =	
  [books:Book]	
  
	
  	
  	
  String	
  name	
  
}	
  
MÉTODOS	
  DE	
  BUSCA	
  DINÂMICOS	
  
Groovy	
  suporta	
  interceptação	
  de	
  chamadas	
  a	
  métodos	
  
	
  
Grails	
  injeta	
  vários	
  métodos	
  em	
  todos	
  os	
  objetos	
  de	
  
     domínio	
  em	
  tempo	
  de	
  execução	
  
       get(id), getAll([id, id, id, …]), list(),
       listOrderBy*()

       findBy*(), findAllBy*(),	
  count(), countBy*()

       save(),	
  delete(), validate(), hasErrors

       withTransaction, withCriteria
	
  
EXEMPLOS	
  
Listagems	
  
    def	
  livros=	
  Livro.list()	
  
    livros	
  =	
  Livro.list(sort:”4tulo",	
  order:"asc")	
  
	
  
Busca	
  por	
  Id	
  
    def	
  livros	
  =	
  Livro.get(23)	
  
    livros	
  =	
  Livro.getAll(23,	
  93,	
  81)	
  
COMPOSIÇÃO	
  DE	
  MÉTODOS	
  
Os	
  métodos	
  countBy*()	
  e	
  findBy*()	
  podem	
  ser	
  
         criados	
  usando	
  nomes	
  de	
  atributos	
  da	
  classe	
  de	
  
         domínio	
  além	
  dos	
  seguintes	
  comparadores:	
  
     	
  Equal,	
  NotEqual,	
  LessThan,	
  LessThanEquals,	
  
         GreaterThan,	
  GreaterThanEquals,	
  Like,	
  like	
  (case	
  
         insensi:ve),	
  InList,	
  Between,	
  IsNull,	
  IsNotNull	
  
	
  
Funciona	
  para	
  até	
  dois	
  atributos	
  com	
  
         comparadores	
  opcionais	
  e	
  operadores	
  lógicos	
  
	
  
COMPOSIÇÃO	
  DE	
  MÉTODOS	
  
def	
  livro	
  =	
  Livro.findByTitulo(“Harry	
  Poier”)	
  
livro	
  =	
  Livro.findByTituloLike("Harry	
  Pot%")	
  
	
  
livro	
  =	
  Livro.findByDataRevisaoBetween(	
  inicio,	
  	
  fim)	
  
	
  
livro	
  =	
  Livro.findByDataLancamentoGreaterThan(	
  algumaData	
  )	
  
	
  
livro	
  =	
  Livro.findByTituloLikeOrDataRevisaoLessThan(	
  "%Java%",	
  
     algumaData	
  )	
  
BUSCAS	
  COM	
  CRITERIA	
  
DSL	
  para	
  uso	
  de	
  Hibernate	
  Criteria:	
  
	
  
def	
  c	
  =	
  Conta.createCriteria()	
  
def	
  results	
  =	
  c	
  {	
  
      	
  like(”cliente",	
  "Fred%")	
  
      	
  and	
  {	
  
      	
        	
  between(”saldo",	
  500,	
  1000)	
  
      	
        	
  eq(”filial",	
  "London")	
  
      	
  }	
  
      	
  maxResults(10)	
  
      	
  order(”nome",	
  "desc")	
  
}	
  
BUSCAS	
  COM	
  HQL	
  
Definidas	
  com	
  os	
  métodos	
  find,	
  findAll	
  
	
  
def	
  results	
  =	
  Livro.findAll(	
  
     	
  "from	
  Livro	
  as	
  l	
  where	
  l.4tulo	
  like	
  ’Harry%'")	
  
CONTROLLERS	
  
Gerencia	
  os	
  requests	
  da	
  aplicação	
  web	
  e	
  criam	
  
         ou	
  preparam	
  os	
  responses	
  
	
  
Classes	
  com	
  o	
  nome	
  terminando	
  em	
  Controller	
  
	
  
Script	
  de	
  geração:	
  	
  
     	
  grails	
  create-­‐controller	
  livro	
  
	
  
	
  
ESTRUTURA	
  BÁSICA	
  
class	
  LivroController	
  {	
  
	
  	
  	
  	
  def	
  list()	
  {	
  
	
  
	
  	
  	
  	
  	
  	
  	
  	
  //	
  definir	
  lógica	
  do	
  controller	
  
	
  	
  	
  	
  	
  	
  	
  	
  //	
  criar	
  modelo	
  de	
  dados	
  de	
  resposta	
  
	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  model	
  
	
  	
  	
  	
  }	
  
}	
  
CONTROLLERS	
  GERADOS	
  COM	
  SCAFFOLDING	
  
Métodos	
  gerados	
  automa4camente:	
  
       index	
  –	
  displays	
  list	
  of	
  all	
  domain	
  objects	
  
       list	
  –	
  displays	
  list	
  of	
  all	
  domain	
  objects	
  
       show	
  –	
  shows	
  details	
  of	
  the	
  domain	
  object	
  
       delete	
  –	
  deletes	
  the	
  domain	
  object	
  
       edit	
  –	
  opens	
  page	
  for	
  edi4ng	
  of	
  domain	
  object	
  
       update	
  –	
  updates	
  changes	
  made	
  to	
  domain	
  object	
  
       create	
  –	
  opens	
  page	
  for	
  domain	
  object	
  crea4on	
  
       save	
  –	
  saves	
  the	
  domain	
  object	
  
	
  
RETORNO	
  DOS	
  CONTROLLERS	
  
1.	
  Retorna	
  um	
  mapa	
  de	
  dados	
  ou	
  nada.	
  Em	
  seguida	
  
         redireciona	
  o	
  fluxo	
  para	
  uma	
  view	
  com	
  o	
  mesmo	
  
         nome	
  da	
  ac4on	
  (método)	
  
	
  
2.	
  Redireciona	
  para	
  outra	
  ação	
  ou	
  URL	
  
	
  
3.	
  Renderiza	
  o	
  resultado	
  diretamente,	
  podendo	
  ser	
  
         uma	
  view,	
  template,	
  JSON,	
  XML	
  ou	
  binário	
  
     	
  Possui	
  conversores	
  JSON	
  and	
  XML	
  na4vos	
  
URLMAPPINGS.GROOVY	
  
DSL	
  para	
  customização	
  dos	
  mapeamentos	
  de	
  URIs	
  
         para	
  views	
  ou	
  ações	
  de	
  Controllers	
  
	
  
Pode	
  ser	
  usada	
  para	
  a	
  definição	
  de	
  URIs	
  de	
  
         webservices	
  REST	
  
	
  
Status	
  code	
  de	
  erros	
  também	
  podem	
  ser	
  mapeados	
  	
  
     	
  404,	
  500,	
  etc.	
  
VIEWS	
  
Cada	
  controller	
  possuirá	
  uma	
  pasta	
  correspondente	
  
         dentro	
  de	
  grails-­‐app/views	
  
     	
  Ex.:	
  grails-­‐app/views/paciente	
  
	
  
As	
  views	
  são	
  definidas	
  em	
  GSPs	
  
	
  
Convenção:	
  ‘redirecione	
  para	
  a	
  GSP	
  com	
  o	
  mesmo	
  
         nome	
  da	
  ação	
  do	
  controller	
  (customizável)’	
  
GROOVY	
  SERVER	
  PAGES	
  (GSPS)	
  
Renderizam	
  as	
  views	
  
	
  
Grails	
  provê	
  cerca	
  de	
  50	
  tags	
  para	
  uso	
  em	
  GSPs	
  
	
  
Lógicas,	
  loops,	
  criação	
  de	
  links,	
  forms,	
  campos	
  de	
  form	
  
	
  
Tags	
  para	
  gerenciamento	
  de	
  Javascript	
  e	
  outros	
  recursos	
  
	
  
TagLibraries	
  podem	
  ser	
  criadas	
  facilmente	
  
LAYOUTS	
  COM	
  SITEMESH	
  
SERVICES	
  
Suporte	
  automáIco	
  a	
  transações	
  
     	
  sta4c	
  transac4onal	
  =	
  true	
  |	
  false	
  
	
  
AutomaIcamente	
  gerenciados	
  pelo	
  Spring	
  
         Services	
  podem	
  ser	
  injetados	
  em	
  controllers,	
  
         outros	
  services	
  e	
  classes	
  de	
  domínio	
  
EXTENDENDO	
  O	
  GRAILS	
  COM	
  PLUGINS	
  
A	
  maioria	
  das	
  principais	
  partes	
  do	
  Grails	
  são	
  na	
  
     verdade	
  implementadas	
  como	
  plugins 	
  	
  
	
  
Busque	
  em	
  h^p://grails.org/plugins	
  
TESTES	
  

Grails	
  cria	
  esqueletos	
  para	
  testes	
  unitários	
  
	
  
Várias	
  subclasses	
  de	
  GroovyTestCase	
  para	
  testar	
  
         componentes	
  do	
  Grails	
  
	
  
Suporte	
  a	
  mocks	
  
     	
  mockDomain,	
  mockForConstraintsTest,	
  
         mockController,	
  mockTagLib,	
  mockLogging	
  
	
  
Testes	
  de	
  integação	
  suportados	
  com	
  configuração	
  de	
  
         ambiente	
  de	
  testes	
  separada	
  para	
  o	
  banco	
  
PERGUNTAS?	
  

Mais conteúdo relacionado

Mais procurados

A Classe StringBuilder em Java
A Classe StringBuilder em JavaA Classe StringBuilder em Java
A Classe StringBuilder em JavaDevmedia
 
Da Argila Ao Forte - Como desenvolver uma loja virtual
Da Argila Ao Forte - Como desenvolver uma loja virtualDa Argila Ao Forte - Como desenvolver uma loja virtual
Da Argila Ao Forte - Como desenvolver uma loja virtualMichael Castillo Granados
 
Desenvolvimento em .Net - nHibernate
Desenvolvimento em .Net - nHibernateDesenvolvimento em .Net - nHibernate
Desenvolvimento em .Net - nHibernateVitor Silva
 
PHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object CalisthenicsPHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object CalisthenicsGuilherme Blanco
 
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7iMasters
 
Javascript para CSharpers - Append B - jQuery
Javascript para CSharpers - Append B - jQueryJavascript para CSharpers - Append B - jQuery
Javascript para CSharpers - Append B - jQueryWesley Lemos
 
JavaScript - Objectos e Arrays
JavaScript - Objectos e ArraysJavaScript - Objectos e Arrays
JavaScript - Objectos e ArraysValter Cinquenta
 
jQuery na Prática - Cauê Fajoli
jQuery na Prática - Cauê FajolijQuery na Prática - Cauê Fajoli
jQuery na Prática - Cauê FajoliCaue Fajoli
 
Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesObject Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesOtávio Calaça Xavier
 

Mais procurados (15)

jQuery Simplificando o JavaScript
jQuery Simplificando o JavaScriptjQuery Simplificando o JavaScript
jQuery Simplificando o JavaScript
 
A Classe StringBuilder em Java
A Classe StringBuilder em JavaA Classe StringBuilder em Java
A Classe StringBuilder em Java
 
Da Argila Ao Forte - Como desenvolver uma loja virtual
Da Argila Ao Forte - Como desenvolver uma loja virtualDa Argila Ao Forte - Como desenvolver uma loja virtual
Da Argila Ao Forte - Como desenvolver uma loja virtual
 
jQuery na Prática!
jQuery na Prática!jQuery na Prática!
jQuery na Prática!
 
Bd sql (1)
Bd sql (1)Bd sql (1)
Bd sql (1)
 
Desenvolvimento em .Net - nHibernate
Desenvolvimento em .Net - nHibernateDesenvolvimento em .Net - nHibernate
Desenvolvimento em .Net - nHibernate
 
PHP ao Extremo
PHP ao ExtremoPHP ao Extremo
PHP ao Extremo
 
PHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object CalisthenicsPHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object Calisthenics
 
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7
 
Javascript para CSharpers - Append B - jQuery
Javascript para CSharpers - Append B - jQueryJavascript para CSharpers - Append B - jQuery
Javascript para CSharpers - Append B - jQuery
 
JavaScript - Objectos e Arrays
JavaScript - Objectos e ArraysJavaScript - Objectos e Arrays
JavaScript - Objectos e Arrays
 
Objective-C
Objective-CObjective-C
Objective-C
 
jQuery na Prática - Cauê Fajoli
jQuery na Prática - Cauê FajolijQuery na Prática - Cauê Fajoli
jQuery na Prática - Cauê Fajoli
 
Migrando para o PHP 5
Migrando para o PHP 5Migrando para o PHP 5
Migrando para o PHP 5
 
Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesObject Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simples
 

Destaque

Introdução a Grails: Um framework veloz e poderoso
Introdução a Grails: Um framework veloz e poderosoIntrodução a Grails: Um framework veloz e poderoso
Introdução a Grails: Um framework veloz e poderosoBruno Lopes
 
Oficina groovy grails - infoway
Oficina  groovy grails - infowayOficina  groovy grails - infoway
Oficina groovy grails - infowayLucas Aquiles
 
Grails, o que isso quer dizer?
Grails, o que isso quer dizer?Grails, o que isso quer dizer?
Grails, o que isso quer dizer?Gilliard Cordeiro
 
Grails Simple Login
Grails Simple LoginGrails Simple Login
Grails Simple Loginmoniguna
 

Destaque (6)

Grails 101
Grails 101Grails 101
Grails 101
 
Introdução a Grails: Um framework veloz e poderoso
Introdução a Grails: Um framework veloz e poderosoIntrodução a Grails: Um framework veloz e poderoso
Introdução a Grails: Um framework veloz e poderoso
 
Oficina groovy grails - infoway
Oficina  groovy grails - infowayOficina  groovy grails - infoway
Oficina groovy grails - infoway
 
Grails, o que isso quer dizer?
Grails, o que isso quer dizer?Grails, o que isso quer dizer?
Grails, o que isso quer dizer?
 
Curso de Grails
Curso de GrailsCurso de Grails
Curso de Grails
 
Grails Simple Login
Grails Simple LoginGrails Simple Login
Grails Simple Login
 

Semelhante a Grails (20)

Groovy grails
Groovy grailsGroovy grails
Groovy grails
 
Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3
 
Oficial
OficialOficial
Oficial
 
Grails parte 1 - introdução
Grails   parte 1 - introduçãoGrails   parte 1 - introdução
Grails parte 1 - introdução
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Grails
GrailsGrails
Grails
 
Conhecendo Ror
Conhecendo RorConhecendo Ror
Conhecendo Ror
 
Curso de Ruby on Rails - Aula 01
Curso de Ruby on Rails - Aula 01Curso de Ruby on Rails - Aula 01
Curso de Ruby on Rails - Aula 01
 
Workshop MongoDB
Workshop MongoDBWorkshop MongoDB
Workshop MongoDB
 
Introdução ao ASP.NET 3.5 - Campus Party Brasil 2009
Introdução ao ASP.NET 3.5 - Campus Party Brasil 2009Introdução ao ASP.NET 3.5 - Campus Party Brasil 2009
Introdução ao ASP.NET 3.5 - Campus Party Brasil 2009
 
Ruby & Rails
Ruby & RailsRuby & Rails
Ruby & Rails
 
J query
J queryJ query
J query
 
Curso mongo db com php
Curso mongo db com phpCurso mongo db com php
Curso mongo db com php
 
Hibernate conceitos
Hibernate conceitosHibernate conceitos
Hibernate conceitos
 
JavaScript Model-View no Frontend
JavaScript Model-View no FrontendJavaScript Model-View no Frontend
JavaScript Model-View no Frontend
 
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
 
Minicurso Ruby on Rails Dextra
Minicurso Ruby on Rails DextraMinicurso Ruby on Rails Dextra
Minicurso Ruby on Rails Dextra
 
Apresentação sobre MVVMC
Apresentação sobre MVVMCApresentação sobre MVVMC
Apresentação sobre MVVMC
 
MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
 
Aula1
Aula1Aula1
Aula1
 

Grails

  • 1. DESENVOLVIMENTO  WEB  COM     GRAILS   Ricardo  Wendell   rickwendell@gmail.com  
  • 2. OBJETIVO   Apresentar  as  principais   caracterís4cas  e  componentes   do  Grails    
  • 3. O  QUE  É  O  GRAILS?   Um  framework  web  para  a  JVM     Foco  em  produIvidade!    Linguagem  dinâmica  –  Groovy    Conven&on  over  Configura&on   Ferramentas  que  promovem  agilidade  
  • 4. FERRAMENTAS  QUE  AJUDAM…   DSLs     Geradores  de  código   Resolução  de  dependências   Configurações  mul4-­‐ambientes  
  • 5. POR  DEBAIXO…   Spring  Framework   Spring  MVC   Hibernate   SiteMesh   Servlet  API  
  • 6. COMPONENTES  DO  GRAILS   Scripts  de  criação   Model-­‐View-­‐Controller  (MVC)   Grails  Object  Rela4onal  Mapping  (GORM)   Services   Resolução  de  dependências  e  configurações   Plugins    
  • 7. SCRIPTS  DE  CRIAÇÃO   Geram  várias  partes  da  aplicação    create-­‐app:  cria  uma  aplicação    create-­‐domain-­‐class:  cria  uma  nova  classe  de   domínio    generate-­‐all:  gera  o  controller  e  views  associadas   para  uma  classe  de  domínio    run-­‐app:  executa  a  aplicação  no  Tomcat    
  • 8. ESTRUTURA  DA  APLICAÇÃO   Pastas   PerspecIva  Grails  (STS)  
  • 9. OBJETOS  DE  DOMÍNIO  (MODELO)   Objetos  são  automaIcamente  mapeados  para   tabelas  no  banco     Configurações  adicionais  com  DSL   Relacionamentos  entre  objetos   Validações  
  • 10. EXEMPLO   class Livro{ String titulo String autor String descricao Date dataRevisao static hasMany = [comentarios: Comentario] static constraints = { titulo nullable: false, blank: false, size: 1..1024 autor nullable: false, blank: false, size: 2..255 descricao nullable:true, blank: true, maxSize: 1000000 dataRevisao nullable: true } }
  • 11. GORM   Camada  padrão  de  persistência   Funcionalidades  para  leitura,  listagem,   ordenação,  contagem,  persistência  e  remoção   Definição  de  relacionamentos  entre  objetos   Métodos  de  busca  dinâmicos   Consultas  com  Criteria,  HQL  ou  SQL   Suporte  a  paginação  
  • 12. VALIDAÇÕES  DAS  CLASSES  DE  DOMÍNIO   Os  métodos  save()  e  validate()  da  classe  de   domínio  disparam  as  validações     Cada  objeto  contém  uma  coleção  de  erros  de   validação     17  validações  prontas     Muitas  das  restrições  influenciam  a  geração  das   tabelas  para  as  classes  de  domínio  
  • 14. RELACIONAMENTOS:  UM-­‐PARA-­‐UM   Declarado  com  um  atributo  do  4po  da  classe   referenciada     Bi-­‐direcional:  cada  classe  possui  um  atributo  do   outro  4po     En4dade  forte  e  cascading  são  declarados  com  a   propriedade  belongsTo  
  • 15. RELACIONAMENTOS:  UM-­‐PARA-­‐UM   class  Face  {    Nariz  nariz   }     class  Nariz  {    sta4c  belongsTo  =  [face:  Face]   }  
  • 16. RELACIONAMENTOS:  UM-­‐PARA-­‐MUITOS   Relacionamentos  um-­‐para-­‐muitos  usa  a   propriedade  hasMany       A  propriedade  belongsTo  também  pode  ser   usada  nesse  cenário  para  a  definição  de   relacionamento  bi-­‐direcional  
  • 17. RELACIONAMENTOS:  UM-­‐PARA-­‐MUITOS   class  Autor  {          String  nome    sta4c  hasMany  =  [  livros  :  Livro  ]   }   class  Livro  {    String  4tulo   }  
  • 18. RELACIONAMENTOS:  MUITOS-­‐PARA-­‐MUITOS   Declarado  ao  adicionar  a  propriedade  hasMany   a  cada  classe  do  relacionamento     Uma  das  classes  deve  declarar  a  propriedade   belongsTo  para  definir  a  en4dade  forte  
  • 19. RELACIONAMENTOS:  MUITOS-­‐PARA-­‐MUITOS   class  Book  {        sta4c  belongsTo  =  Author        sta4c  hasMany  =  [authors:Author]        String  4tle   }     class  Author  {        sta4c  hasMany  =  [books:Book]        String  name   }  
  • 20. MÉTODOS  DE  BUSCA  DINÂMICOS   Groovy  suporta  interceptação  de  chamadas  a  métodos     Grails  injeta  vários  métodos  em  todos  os  objetos  de   domínio  em  tempo  de  execução   get(id), getAll([id, id, id, …]), list(), listOrderBy*() findBy*(), findAllBy*(),  count(), countBy*() save(),  delete(), validate(), hasErrors withTransaction, withCriteria  
  • 21. EXEMPLOS   Listagems   def  livros=  Livro.list()   livros  =  Livro.list(sort:”4tulo",  order:"asc")     Busca  por  Id   def  livros  =  Livro.get(23)   livros  =  Livro.getAll(23,  93,  81)  
  • 22. COMPOSIÇÃO  DE  MÉTODOS   Os  métodos  countBy*()  e  findBy*()  podem  ser   criados  usando  nomes  de  atributos  da  classe  de   domínio  além  dos  seguintes  comparadores:    Equal,  NotEqual,  LessThan,  LessThanEquals,   GreaterThan,  GreaterThanEquals,  Like,  like  (case   insensi:ve),  InList,  Between,  IsNull,  IsNotNull     Funciona  para  até  dois  atributos  com   comparadores  opcionais  e  operadores  lógicos    
  • 23. COMPOSIÇÃO  DE  MÉTODOS   def  livro  =  Livro.findByTitulo(“Harry  Poier”)   livro  =  Livro.findByTituloLike("Harry  Pot%")     livro  =  Livro.findByDataRevisaoBetween(  inicio,    fim)     livro  =  Livro.findByDataLancamentoGreaterThan(  algumaData  )     livro  =  Livro.findByTituloLikeOrDataRevisaoLessThan(  "%Java%",   algumaData  )  
  • 24. BUSCAS  COM  CRITERIA   DSL  para  uso  de  Hibernate  Criteria:     def  c  =  Conta.createCriteria()   def  results  =  c  {    like(”cliente",  "Fred%")    and  {      between(”saldo",  500,  1000)      eq(”filial",  "London")    }    maxResults(10)    order(”nome",  "desc")   }  
  • 25. BUSCAS  COM  HQL   Definidas  com  os  métodos  find,  findAll     def  results  =  Livro.findAll(    "from  Livro  as  l  where  l.4tulo  like  ’Harry%'")  
  • 26. CONTROLLERS   Gerencia  os  requests  da  aplicação  web  e  criam   ou  preparam  os  responses     Classes  com  o  nome  terminando  em  Controller     Script  de  geração:      grails  create-­‐controller  livro      
  • 27. ESTRUTURA  BÁSICA   class  LivroController  {          def  list()  {                    //  definir  lógica  do  controller                  //  criar  modelo  de  dados  de  resposta                    return  model          }   }  
  • 28. CONTROLLERS  GERADOS  COM  SCAFFOLDING   Métodos  gerados  automa4camente:   index  –  displays  list  of  all  domain  objects   list  –  displays  list  of  all  domain  objects   show  –  shows  details  of  the  domain  object   delete  –  deletes  the  domain  object   edit  –  opens  page  for  edi4ng  of  domain  object   update  –  updates  changes  made  to  domain  object   create  –  opens  page  for  domain  object  crea4on   save  –  saves  the  domain  object    
  • 29. RETORNO  DOS  CONTROLLERS   1.  Retorna  um  mapa  de  dados  ou  nada.  Em  seguida   redireciona  o  fluxo  para  uma  view  com  o  mesmo   nome  da  ac4on  (método)     2.  Redireciona  para  outra  ação  ou  URL     3.  Renderiza  o  resultado  diretamente,  podendo  ser   uma  view,  template,  JSON,  XML  ou  binário    Possui  conversores  JSON  and  XML  na4vos  
  • 30. URLMAPPINGS.GROOVY   DSL  para  customização  dos  mapeamentos  de  URIs   para  views  ou  ações  de  Controllers     Pode  ser  usada  para  a  definição  de  URIs  de   webservices  REST     Status  code  de  erros  também  podem  ser  mapeados      404,  500,  etc.  
  • 31. VIEWS   Cada  controller  possuirá  uma  pasta  correspondente   dentro  de  grails-­‐app/views    Ex.:  grails-­‐app/views/paciente     As  views  são  definidas  em  GSPs     Convenção:  ‘redirecione  para  a  GSP  com  o  mesmo   nome  da  ação  do  controller  (customizável)’  
  • 32. GROOVY  SERVER  PAGES  (GSPS)   Renderizam  as  views     Grails  provê  cerca  de  50  tags  para  uso  em  GSPs     Lógicas,  loops,  criação  de  links,  forms,  campos  de  form     Tags  para  gerenciamento  de  Javascript  e  outros  recursos     TagLibraries  podem  ser  criadas  facilmente  
  • 34. SERVICES   Suporte  automáIco  a  transações    sta4c  transac4onal  =  true  |  false     AutomaIcamente  gerenciados  pelo  Spring   Services  podem  ser  injetados  em  controllers,   outros  services  e  classes  de  domínio  
  • 35. EXTENDENDO  O  GRAILS  COM  PLUGINS   A  maioria  das  principais  partes  do  Grails  são  na   verdade  implementadas  como  plugins       Busque  em  h^p://grails.org/plugins  
  • 36. TESTES   Grails  cria  esqueletos  para  testes  unitários     Várias  subclasses  de  GroovyTestCase  para  testar   componentes  do  Grails     Suporte  a  mocks    mockDomain,  mockForConstraintsTest,   mockController,  mockTagLib,  mockLogging     Testes  de  integação  suportados  com  configuração  de   ambiente  de  testes  separada  para  o  banco  
  • 37.