Breve introdução Uma breve introdução Rápido Dinâmico Robusto Simplicidade e Poder Linguagem dinâmica Arquitetura Mapeamento Objeto Relacional Convenção DRY YAGNI KISS Groovy MVC Hibernate Sobre configuração Dont Repeat Yourself Youaintgonnaneedit KeepIt Simple, Stupid 1
Não apenas um framework Um ambiente full-stack Plataforma Groovy Eco-sistema Java Servidor web Banco de dados Crud em 5 minutos! Criação de projeto e Crud em 5 minutos Uma aplicação Uma classe para o Crud Nome do projeto: jctunes 2
Tempo!!! Ufa... Instalando e testando Um gostinho de Grails Exige Java 5.0 ou superior Download Grails: http://grails.org/download Descompacte Cria uma variável de ambiente GRAILS_HOME Adicione GRAILS_HOME\bin ao seu PATH Valide a instalação grails Use 'grails help' for more info or Criando a primeira aplicação: 6 passos Executar o comando para criar a aplicação grails create-app jctunes Navegar até o diretório da nova aplicação cd jctunes Criar nosso primeiro controlador grails create-controller loja Escrever algum código no melhor estilo hello... Escrever o código de teste e executar os testes grails test-app Executar a aplicação grails run-app 3
grails create-app jctunes cd jctunes grails create-controller Loja grails create-controller Loja Criação de 2 classes Loja Controller.groovy No diretório controllers/jctunes Classe de teste 4
Exibindo uma mensagem Para todo controlador, por default Grails cria uma ação chamada index package jctunes class LojaController { def index = { package jctunes render 1 dos métodos implícitos class LojaController { def index = { render "Seja benvindo a Loja jctunes!" Por convenção tenta renderizar uma view chamada grails-app/views/loja/index.gsp Testes de integração Para todo o ambiente desenvolvido incluindo a base de dados Geralmente, mais lentos Aplicação deve possuir alguma completude Testando o código com Grails Testes unitários Rápidos Fazem uso de mocks e stubs Escrevendo o código de testes package jctunes import grails.test.* class LojaControllerTests extends ControllerUnitTestCase { protected void setup() { super.setup() protected void teardown() { super.teardown() void testpaginaprincipal() { controller.index() assertequals "Seja benvindo a Loja jctunes!", controller.response.contentasstring grails test-app 5
target/test-reports Testando o Código grails run-app grails run-app Porta em Conflito??? Iniciando Grails CRUD, Scaffolding e Domínio 6
Scaffolding Classes de Domínio Permite gerar rapidamente interfaces de CRUD para classes de domínio Facilita o entendimento de como a Visão e o Controle interagem no Grails Lógica do negócio São persistidas Classes de Domínio Mapeadas automaticamente para tabelas de banco de dados Hibernate Localização grails-app\domain\nomedoprojeto Criação grails create-domain-class grails create-domain-class Musica grails create-domain-class Musica class Musica { static constraints = { 7
Again... grails create-domain-class Musica class Musica { String titulo String artista Integer duracao Date lancamento static constraints = { Scaffolding Dinâmicos Lógica do controle e visões são geradas em tempo de execução Estáticos Criação de templates grails create-controller jctunes.musica class MusicaController { Habilitando o Scaffolding dinâmico class MusicaController { def index = { def scaffold = Musica 8
Vamos testar... Relacionamentos com classes Nova classe 1 para 1 1 para muitos Muitos para 1 Muitos para muitos... * 1 Como definir uma relação 1 para muitos? static hasmany = [musicas: Musica] 9
Classe Album static hasmany = [musica: Musica] Esta relação é unidirecional class Album { String titulo Para torná-la bidirecional inclua uma referência de Album na classe Musica static hasmany = [musica: Musica] static constraints = { Altere a classe Musica para tornar a relação bi-direcional class Musica {... Album album... class AlbumController { AlbumController Geração do código das visões e dos controles Scaffolding estático def scaffold = Album Pode ajudar na familiarização com o Grails e como o todo trabalha junto Ponto de partida para adicionar para casos de uso que precisam de uma lógica além CRUD 10
Scaffolding estático 3 targets básicos grails generate-views Gera as visões para uma classe de domínio específico grails generate-controller Gera o controle para uma classe de domínio específico grails generate-allall Gera ambos controle e visões associados Como o controle já existe Grails fará 2 perguntas ele pergunta se você deseja sobrescrever a classe AlbumController e sua classe de teste -> responda Y (yes) Milhares de linhas? 10 camadas??? DAO Controle Classe de Negócio TO POJO Vamos examinar o código gerado 11
Vamos examinar o código gerado Repita o processo para a classe Música Gere o controlador de Musica novamente grails generate-controller jctunes.musica Gere as visões novamente grails generate-views jctunes.musica Dúvidas??? Obrigado! 12