Download - Caelum Java Web Vraptor Hibernate Ajax Fj28
-
FJ-28Desenvolvimento gil para a
Web 2.0 com VRaptor, Hibernate e AJAX
-
A Caelum atua no mercado com consultoria, desenvolvimento e ensino em computao. Sua equipe participou do desenvolvimento de projetos em vrios clientes e, aps apresentar os cursos de vero de Java na Universidade de So Paulo, passou a oferecer treinamentos para o mercado. Toda a equipe tem uma forte presena na comunidade atravs de eventos, artigos em diversas revistas, participao em muitos projetos open source como o VRaptor e o Stella e atuao nos fruns e listas de discusso como o GUJ.
Com uma equipe de mais de 80 profissionais altamente qualificados e de destaque do mercado, oferece treinamentos em Java, Ruby on Rails e Scrum em suas trs unidades - So Paulo, Rio de Janeiro e Braslia. Mais de 8 mil alunos j buscaram qualificao nos treinamentos da Caelum tanto em nas unidades como nas prprias empresas com os cursos incompany.
O compromisso da Caelum oferecer um treinamento de qualidade, com material constantemente atualizado, uma metodologia de ensino cuidadosamente desenvolvida e instrutores capacitados tecnicamente e didaticamente. E oferecer ainda servios de consultoria gil, mentoring e desenvolvimento de projetos sob medida para empresas.
Comunidade
Nossa equipe escreve constantemente artigos no Blog da Caelum que j conta com 150 artigos sobre vrios assuntos de Java, Rails e computao em geral. Visite-nos e assine nosso RSS: blog.caelum.com.br
Acompanhe a Caelum no Twitter: twitter.com/caelum
O GUJ maior frum de Java em lngua portuguesa, com 700 mil posts e 70 mil usurios. As pessoas da Caelum participam ativamente, participe tambm: www.guj.com.br
Assine nossa Newsletter para receber notcias tcnicas de Java, Rails, Agile e Web, alm de novidades, eventos e artigos: www.caelum.com.br/newsletter
No site da Caelum h algumas de nossas Apostilas disponveis gratuitamente para download e alguns dos artigos de destaque que escrevemos: www.caelum.com.br/apostilas www.caelum.com.br/artigos
-
Conhea alguns de nossos cursos
FJ-11: Java e Orientao a objetos
FJ-26: Laboratrio Web com JSF2 e CDI
FJ-16: Laboratrio Java com Testes, XML e Design Patterns
FJ-19: Preparatrio para Certificao de Programador Java
FJ-21: Java para Desenvolvimento Web
FJ-31: Java EE avanado e Web Services
FJ-91: Arquitetura e Design de Projetos Java
RR-71:Desenvolvimento gil para Web 2.0 com Ruby on Rails
RR-75:Ruby e Rails avanados: lidando com problemas do dia a dia
Mais de 8000 alunos treinados; Reconhecida nacionalmente; Contedos atualizados para o mercado e para sua carreira; Aulas com metodologia e didtica cuidadosamente preparadas; Ativa participao nas comunidades Java, Rails e Scrum; Salas de aula bem equipadas; Instrutores qualificados e experientes; Apostilas disponveis no site.
Para mais informaes e outros cursos, visite: caelum.com.br/cursos
FJ-25: Persistncia com JPA2 e Hibernate
-
Sobre esta apostilaEsta apostila daCaelumvisa ensinar de umamaneira elegante, mostrando apenas o que necessrio e quando necessrio, no momento certo, poupando o leitor de assuntos que no costumam ser de seu interesse emdeterminadas fases do aprendizado.
A Caelum espera que voc aproveite esse material. Todos os comentrios, crticas e sugestes sero muitobem-vindos.
Essa apostila constantemente atualizada e disponibilizada no site da Caelum. Sempre consulte o site paranovas verses e, ao invs de anexar o PDF para enviar a um amigo, indique o site para que ele possa semprebaixar as ltimas verses. Voc pode conferir o cdigo de verso da apostila logo no nal do ndice.
Baixe sempre a verso mais nova em: www.caelum.com.br/apostilas
Esse material parte integrante do treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAXe distribudo gratuitamente exclusivamente pelo site da Caelum. Todos os direitos so reservados Caelum.A distribuio, cpia, revenda e utilizao para ministrar treinamentos so absolutamente vedadas. Para usocomercial deste material, por favor, consulte a Caelum previamente.
www.caelum.com.br
1
-
Sumrio
1 O curso 11.1 Objetivo do curso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Sobre o curso: Hibernate, VRaptor, JSP e AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.3 Onde posso aprender mais do VRaptor? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2 O sistema 32.1 A necessidade do cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.2 Partes do projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3 Novo projeto 53.1 Denindo as tecnologias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53.2 Montando o ambiente de desenvolvimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63.3 Exerccios: montando o ambiente de desenvolvimento . . . . . . . . . . . . . . . . . . . . . . . 73.4 Exerccios: congurando o deploy da aplicao . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4 Persistindo os dados com o Hibernate 154.1 A camada de persistncia do projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154.2 Sobre o Hibernate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164.3 Preparando o Hibernate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164.4 Congurando o Hibernate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174.5 Exerccios: Congurando o banco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5 Cadastrando Produtos 205.1 Modelando um produto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205.2 Anotando a classe Produto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215.3 Exerccios - Modelando o produto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235.4 Adicionando um produto no banco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255.6 Outras operaes com produto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265.7 Exercicios - outras operaes com produto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275.8 Discusso em sala - mais sobre o Hibernate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
6 Refatorando 316.1 Analisando o cdigo atual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316.2 Refactoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326.3 Aprendendo a refatorar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346.5 Comentrios so sempre necessrios? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386.6 Refatorando para criar os DAOs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386.7 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
i
-
6.8 Discusso em sala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
7 VRaptor 477.1 Sobre o VRaptor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477.2 Como instalar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477.3 Como congurar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477.4 Primeiro exemplo com o VRaptor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507.6 Redirecionando para uma view . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517.7 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517.8 Disponibilizando informaes para a view . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527.9 Disponibilizando colees para a view . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537.10 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
8 Criando o Controlador de Produtos 578.1 Listando produtos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578.2 Quais so minhas dependncias? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608.3 Injeo de Dependncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618.5 Cadastrando um produto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658.6 Criando o formulrio HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668.7 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678.8 Redirecionar para listagem depois de adicionar . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708.9 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728.10 Atualizando e removendo produtos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748.11 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778.12 Discusso em sala - VRaptor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
9 Refatorando os DAOs 819.1 Injeo de dependncias no DAO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819.2 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 839.3 Analisando o cdigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869.4 Escopos denidos pelo VRaptor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869.5 Fechando a sesso do Hibernate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 899.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
10 Validando formulrios 9310.1 Validator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9310.2 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9610.3 Para saber mais: Hibernate Validator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9910.4 Exerccios Opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
11 REST 102
ii
-
11.1 O que REST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10211.2 Caractersticas e vantagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10211.3 O tringulo do REST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10311.4 Mudando a URI da sua lgica: @Path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10411.5 Mudando o verbo HTTP dos seus mtodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10511.6 Refatorando o ProdutosController . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10711.7 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
12 AJAX e efeitos visuais 11212.1 O que AJAX? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11212.2 Um pouco de JQuery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11312.3 Validando formulrios com o JQuery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11412.4 Criando a busca de produtos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11512.5 Melhorando a busca: Autocomplete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11812.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12112.7 Para saber mais: Representation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
13 Criando o Carrinho de Compras 12713.1 O modelo do Carrinho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12713.2 Controlando o carrinho de compras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12813.3 Visualizando os itens do carrinho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13213.4 Removendo itens do carrinho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13513.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
14 Autenticao 14214.1 Criando Usurios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14214.2 Efetuando o login . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14614.3 Restringindo funcionalidades para usurios logados . . . . . . . . . . . . . . . . . . . . . . . . . 14914.4 Interceptor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
15 Apndice - Download e Upload 15415.1 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
16 Apndice - Integrando VRaptor e Spring 15816.1 Como fazer a integrao? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15816.2 Integrando o Transaction Manager do Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15816.3 Exerccios: Transaction Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
17 Apndice: Mudando a View Padro: Velocity 16417.1 Exerccios: Congurando o Velocity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16417.2 Exerccios: Mudando o Template Engine de uma nica lgica . . . . . . . . . . . . . . . . . . . 16517.3 Exerccios: Mudando o resultado de todas as lgicas para Velocity . . . . . . . . . . . . . . . . 166
ndice Remissivo 167
iii
-
Verso: 15.0.10
iv
-
Captulo 1
O curso
Dizem que os homens nunca se contentam e, quando se lhes d alguma coisa, pedem sempre um pouco mais.Dizem ainda que essa uma das melhores qualidades da espcie e que foi ela que tornou o homem superior
aos animais, que se contentam com o que tm. A prola, John Steibeck.
1.1 Objetivo do curso
Uma das grandes vantagens de utilizar a plataforma Java a quantidade de opes: so centenas de fra-meworks opensource de qualidade que podemos escolher para desenvolver um projeto. Mas qual deles es-colher?
Depois da escolha dos frameworks ainda temos um outro problema: fazer com que eles trabalhem juntosde maneira coesa. Para isso necessrio conhecer as boas prticas e tratar muito bem do ciclo de vida dosobjetos caros, como threads, conexes, sees e arquivos. Um erro no gerenciamento desses objetos podeser fatal para a performance e escalabilidade do seu sistema.
Nesse curso, alm de estudarmos frameworks para o desenvolvimento web, necessrio car atento paraa importncia de como vamos faz-los trabalhar junto. Essa costura pode ser aplicada em diversos outroscasos, mesmo com outros frameworks, e baseada essencialmente no bom isolamento de classes, usandoinverso de controle e injeo de dependncias, assunto que ser tratado recorrentemente durante o curso.
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
1.2 Sobre o curso: Hibernate, VRaptor, JSP e AJAX
Um dos frameworks que encontrado na grande maioria dos projetos atualmente o Hibernate, que serutilizado nesse curso para persistncia. Veremosmais do que o simples gerenciamento de estado e de queries,pois ser praticado como tratar de maneira correta a Session e a Transaction envolvida.
O VRaptor, iniciativa brasileira para Controller MVC, utilizado para facilitar o desenvolvimento web, evi-tando o contato com as classes pouco amigveis do javax.servlet, deixando o cdigo legvel e desacoplado,ideal para testes.
Java Server Pages utilizado como camada View, mostrando as principais tags e problemas enfrentados.Juntamente com o VRaptor, o framework javascript JQuery ser utilizado para nossas requisies AJAXconsumindo dados no formato JSON.
1.3 Onde posso aprender mais do VRaptor?
Voc pode encontrar uma vasta documentao em portugus no site do VRaptor: http://www.vraptor.com.br/
O frum do GUJ tambm uma excelente fonte de informao, e abriga o frum ocial do VRaptor: http://www.guj.com.br/
Captulo 1 - O curso - Sobre o curso: Hibernate, VRaptor, JSP e AJAX - Pgina 2
-
Captulo 2
O sistema
Veremos como ser o sistema que vamos desenvolver e as tecnologias que utilizaremos.
2.1 A necessidade do cliente
Nossa empresa foi contratada para desenvolver um sistema de compras online. O cliente quer que o sistemaseja acessado atravs da web, e deixou claro que devemos nos preocuparmuito com a facilidade de navegaoe a interao dos usurios com o sistema.
As seguintes funcionalidades foram solicitadas pelo cliente:
Cadastrar, atualizar, listar e remover produtos
Buscar produtos
Adicionar, remover e listar produtos do carrinho de compras
Cadastrar, atualizar, listar e remover usurios
Sistema de login
Efetuar a compra, devendo solicitar do cliente a forma de pagamento
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
Em um projeto real, esses requisitos seriam garimpados com o passar do tempo junto ao cliente, para de-senvolver o sistema de forma incremental e iterativa, utilizando mtodos geis como Scrum (curso PM-83)e prticas XP (curso PM-87).
2.2 Partes do projeto
Para facilitar o desenvolvimento, vamos separar em tarefas o que devemos fazer, que sero vistas a partir doprximo captulo.
1) Deciso de tecnologias
2) Montagem do ambiente de desenvolvimento
3) CRUD produto
4) Carrinho de compras
5) CRUD usurio
6) login
7) Compra de produto
Captulo 2 - O sistema - Partes do projeto - Pgina 4
-
Captulo 3
Novo projeto
No h uma verdade fundamental, apenas h erros fundamentais Bachelard , Gaston
Neste captulo, vamos denir as tecnologias do projeto e vamos criar e congurar nosso projeto inicial.
3.1 Definindo as tecnologias
Nosso projeto ser todo em Java e utilizar o VRaptor 3.x como framework Web. Para a persistncia, usare-mos o Hibernate com anotaes rodando sobre o MySQL, que pode ser mudado caso desejado.
Na parte de interao com os usurios, teremos bastante Ajax. Para facilitar o uso do Ajax, vamos utilizaruma biblioteca chamada JQuery, junto com alguns de seus plugins.
Como servidor, vamos usar o Apache Tomcat pela sua popularidade, mas podemos facilmente rodar a apli-cao no Jetty ou Glasssh.
Servidores e Java EE
Para uma discussomais detalhada sobre servidores de aplicao JavaEE e servlet containers, consulte os captulos iniciais da apostila docurso FJ-21.
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
Internet Explorer 6
Os CSSs, Javascripts e HTMLs usados no curso foram desenvolvidospara o Firefox 3.5+ sem se preocupar comcompatibilidade comoutrosbrowsers, ento algumas funcionalidades podem no funcionar emoutros browsers, principalmente no Internet Explorer 6.
Ao desenvolver um sistema voc deveria se preocupar coma compati-bilidade entre os browsers, e voc pode sabermais sobre isso no cursoWD-43 | DesenvolvimentoWeb comHTML, CSS e JavaScript.
Resumindo as tecnologias:
Java
Hibernate Core - JBoss
Hibernate Annotations - JBoss
VRaptor - Caelum
JSTL - Sun
Tomcat - Apache
MySQL - Sun
Ajax
JQuery - JQuery
3.2 Montando o ambiente de desenvolvimento
Para o ambiente de desenvolvimento, vamos utilizar o Eclipse com o pluginWTP. A verso que utilizaremosno curso ser a mais nova, a 3.6, que possui o codinome Helios.
Para utilizar o Eclipse, basta fazer o download, descompactar o zip baixado e depois execut-lo. Isso umagrande vantagem em relao a programas que exigem a instalao. O Eclipse a IDE lder de mercado.Formada por um consrcio liderado pela IBM, possui seu cdigo livre. Para fazer o download, acesse o sitedo Eclipse e baixe a distribuio "Eclipse IDE for Java EE Developers.
http://www.eclipse.org/downloads
Vamos tambm congurar o Tomcat para rodar nossa aplicao.
Captulo 3 - Novo projeto - Montando o ambiente de desenvolvimento - Pgina 6
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
3.3 Exerccios: montando o ambiente de desenvolvimento
1) Na Caelum, execute o Eclipse pelo cone que est em seu Desktop. Em casa, faa a instalao como citadoanteriormente.
2) Descompacte o arquivo apache-tomcat-X.X.X.zip em seu Desktop. O arquivo est na pasta Caelum/28em seu Desktop.
Em casa, voc pode fazer o download do Tomcat 6.x em: http://tomcat.apache.org/
3) No Eclipse, abra a view Servers. Para tal, voc pode ir emWindow e depois Show View e escolher a opoServers.
Uma outra maneira de fazer isso, e acessar qualquer tela ou menu, atravs da pragmtica tecla de atalhoCtrl+3. Depois digite servers.
4) Congure o Tomcat seguindo os passos abaixo:
Boto direito na view Servers
Escolha a opo New
Escolha a opo Server
5) Escolha Tomcat v6.0 Server, dentro da pasta Apache
Captulo 3 - Novo projeto - Exerccios: montando o ambiente de desenvolvimento - Pgina 7
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
6) Clique no boto Browse, e indique o local onde foi feito o unzip do Tomcat (a pasta do Tomcat no seuDesktop):
Captulo 3 - Novo projeto - Exerccios: montando o ambiente de desenvolvimento - Pgina 8
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
Clique em Finish.
7) Teste o servidor que acabamos de congurar. Na view Servers, selecione o Tomcat e clique no boto deiniciar:
8) Verique se o log est limpo e se nenhuma mensagem de erro foi impressa. muito importante, du-rante todo o curso, observar esse log para vericar se o servidor subiu sem erros e se tudo est rodandonormalmente.
9) Agora que o Tomcat est congurado, vamos par-lo um pouco para criar nosso projeto. Na view Servers,selecione o Tomcat e clique no boto de parar.
Captulo 3 - Novo projeto - Exerccios: montando o ambiente de desenvolvimento - Pgina 9
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
10) Caso voc esteja na Caelum siga essas instrues: V na pasta Caelum/28 e abra o arquivo goodbuy.zip.Extraia o contedo desse arquivo para o Desktop.
Se estiver fazendo em casa, voc pode baixar o zip do projeto em:
http://www.caelum.com.br/download/caelum-java-web-vraptor-hibernate-ajax-928-auxiliar.zip
11) Importe o projeto no eclipse seguindo os passos:
1) V em File
2) Escolha a opo Import
3) Escolha a opo General >> Import existing projects into workspace
4) Clique em Next
12) No Select root directory, selecione o Desktop e clique em Finish:
Captulo 3 - Novo projeto - Exerccios: montando o ambiente de desenvolvimento - Pgina 10
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
Este projeto j possui as conguraes bsicas do VRaptor e do Hibernate, para que no percamos muitotempo congurando. Mas essas conguraes usadas sero explicadas commais detalhe durante o curso.
13) O Eclipse perguntar se voc quer trocar de perspectiva. No ser necessrio, ento vamos escolher aopo No.
14) Caso voc no esteja na Caelum e precise criar o projeto de casa. Basta voc baixar do site do VRaptor ovraptor-blank-project, descompacta-lo e importa-lo. Depois disso, adicione, dentro da pasta WebContento contedo do zip goodbuy-auxiliares.zip, que contm cabealho, rodap, css e javascript bsicos queusaremos durante o projeto.
Vc tambm precisar dos JARs do Hibernate e driver MySQL, que ser explicado como baixa-los noprximo captulo.
Captulo 3 - Novo projeto - Exerccios: montando o ambiente de desenvolvimento - Pgina 11
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
Estrutura de pastas de um projetoWeb
Para entender a estrutura de pastas dos projetos Web em Java, con-sulte o captulo de servlets da apostila do curso FJ-21.
3.4 Exerccios: configurando o deploy da aplicao
1) Na aba de Servers, selecione o Tomcat que conguramos no exerccio anterior e siga os passos abaixo:
Clique com o boto direito
Selecione Add and Remove...
2) Passe o nosso projeto goodbuy para a direita, usando o boto Add All, e depois clique em Finish.
Captulo 3 - Novo projeto - Exerccios: congurando o deploy da aplicao - Pgina 12
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
3) O projeto car associado ao Tomcat, conforme a gura abaixo.
Pronto! Nosso projeto est preparado para ser executado no servidor.
4) Inicie o servidor clicando com o boto direito e selecionando Start. Abra o refox e digite na barra deendereos: http://localhost:8080/goodbuy.
Captulo 3 - Novo projeto - Exerccios: congurando o deploy da aplicao - Pgina 13
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
Captulo 3 - Novo projeto - Exerccios: congurando o deploy da aplicao - Pgina 14
-
Captulo 4
Persistindo os dados com o Hibernate
4.1 A camada de persistncia do projeto
Nossa primeira tarefa ser cadastrar, atualizar, listar e remover produtos do sistema. Para realiz-la, precisa-mos gravar as informaes dos produtos no banco de dados. Para esse curso, utilizaremos o banco de dadosMySQL, um banco de dados gratuito, de cdigo aberto, simples e muito utilizado por diversas empresas.
Para maiores informaes e para fazer o download, acesse a URL:
http://www.mysql.com/
Depois de instalado e congurado, oMySQL pode ser acessado com o usurio chamado root e a senha vazia(sem senha). Para testar, basta abrir o terminal e digitar o comando:
mysql -u root
Esse comando tenta fazer o login no mysql, informando o usurio root (-u root) e omitindo a senha, j queesse usurio no tem senha.
Para nos comunicarmos com o banco de dados, seja para uma consulta ou para algum tipo de alterao dedado, podemos usar a API que o Java SE disponibiliza, o JDBC. Um dos problemas do JDBC, quando usadodiretamente, conforme mostramos no curso FJ-21, que ele muito trabalhoso alm de que precisamosgerenciar muitos recursos importantes. Todas as informaes tm de ser passadas uma a uma.
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
Para evitar ter que car fazendo todas as chamadas ao JDBC e ganharmos tempo e produtividade, vamosutilizar um framework para a persistncia que j trazmuitas funcionalidades j implementadas. O frameworkque utilizaremos ser o Hibernate e ele ser o responsvel por fazer as chamadas API do JDBC.
Vale lembrar que, tudo que visto aqui no curso, aplicvel a outros frameworks de persistncia, como seriao caso de usar o iBatis ou ento o EclipseLink atravs de JPA. muito importante perceber como vamosintegrar todas as nossas ferramentas de maneira coesa e desacoplada.
4.2 Sobre oHibernate
O Hibernate um framework ORM - Object Relational Mapping. uma ferramenta que nos ajuda a per-sistir objetos Java em um banco de dados relacional. O trabalho do desenvolvedor denir como os objetossomapeados nas tabelas do banco e o Hibernate faz todo o acesso ao banco, gerando inclusive os comandosSQL necessrios.
O Hibernate um projeto opensource do grupo JBoss com muitos anos de histria e liderana no mercadoJava. Recentemente, boa parte das idias do Hibernate e outros frameworks ORM foram padronizadas emuma especio ocial do Java, a JPA - Java Persistence API. A JPA uma especicao do JCP e possuivrias implementaes (o Hibernate, o Oracle Toplink, EclipseLink, OpenJPA etc).
Mais sobreHibernate
Neste curso, veremosmuitos tpicos sobre Hibernate e como integr-lo em nosso projeto com VRaptor3. Para tpicos avanados e maisdetalhes, consulte o treinamento FJ-25:
http://www.caelum.com.br/curso/925
4.3 Preparando oHibernate
Para preparar o Hibernate, ser necessrio baixar dois ZIPs do site do Hibernate. Cada ZIP representa umprojeto diferente.
O primeiro ser o Hibernate Core, que se chama hibernate-distribution-XXX.zip. O segundo ZIP serdo projetoHibernate Annotations, j que queremos congurar nosso projeto com as anotaes da JPA. EsseZIP chama-se hibernate-annotations-XXX.zip. Faa os downloads diretamente em:
http://www.hibernate.org
Depois de fazer o download desses dois zips, basta descompact-los e utilizar os JARs que esto dentro decada projeto. No exerccio abaixo veremos quais JARs vamos precisar. A partir do Hibernate 3.5, esses jarstodos vem numa nica distribuio, a core.
Captulo 4 - Persistindo os dados com o Hibernate - Sobre o Hibernate - Pgina 16
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
Congurando o mecanismo de logging
OHibernate utiliza o SL4J - Simple Logging Facade for Java - para omecanismo de logging. Ele serve apenascomo uma fachada para vrios frameworks de logging, por exemplo o Log4J e o java.util.logging.
No nosso projeto utilizaremos o Log4J, ento precisamos baixar mais dois zips. O primeiro o Log4J, dogrupo Apache. O segundo o prprio SL4J, que contm o jar que faz o binding do SL4J com o Log4J.
Congurando o driver do MySQL
Apesar de toda facilidade que oHibernate nos trar, por baixo dos panos ele faz chamadas ao JDBC. Portanto,para que nossa aplicao se conecte no banco de dados, precisamos do driver do MySQL no classpath. Odriver a implementao JDBC que ser utilizada. Cada banco de dados possui a sua implementao, e eladeve ser baixada do site do prprio banco de dados. Faa o download domysql jdbc driver.
Mais sobre JDBC eDrivers
Para mais informaes sobre o JDBC e como funcionam os Drivers,consulte o captulo inicial da apostila do curso FJ-21.
4.4 Configurando oHibernate
Para congurar o Hibernate, podemos utilizar ou um arquivo .properties ou um arquivo XML.
O arquivo de properties mais simples, mais fcil de se criar, mas uma das desvantagens que ele noconsegue congurar tudo que queremos, por exemplo as entidades. As entidades tm que ser conguradasno cdigo, e as outras informaes no arquivo de properties.
J o XML, pormais que seja um poucomais difcil em relao ao properties, permite que toda a conguraoseja feita nele. Por isso faremos nossa congurao no XML. O arquivo XML que oHibernate procurar sero hibernate.cfg.xml e ele deve estar no classpath.
Para nosso caso, vamos seguir a conveno e criar o arquivo hibernate.cfg.xml na pasta src, dentro donosso projeto. O contedo do arquivo ser esse:
root
Captulo 4 - Persistindo os dados com o Hibernate - Congurando o Hibernate - Pgina 17
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
jdbc:mysql://localhost/fj28
com.mysql.jdbc.Driver
org.hibernate.dialect.MySQL5InnoDBDialect
update
truetrue
As conguraes que passamos nesse arquivo so parecidas quando queremos nos conectar a um bancode dados. Para conectar em um banco de dados, precisamos informar qual o usurio, a senha, algumasinformaes do banco, como host, porta, etc.
Um detalhe importante da nossa congurao o banco de dados que foi passado. Na conguraohibernate.connection.url foi passado o nome do database que utilizaremos. Para esse caso escolhemos odatabase fj28.
Abaixo segue a descrio de todas as conguraes que usamos.
hibernate.connection.username - usurio do banco de dados
hibernate.connection.password - senha do usurio
hibernate.connection.url - chamada de URL ou string de conexo, deve ser congurada de acordocom documentao do banco de dados
hibernate.connection.driver_class - driver que deve ser utilizado
hibernate.hbm2ddl.auto - como o hibernate vai se comportar em relao s tabelas do banco. Com ovalor update ele vai criar ou modicar tabelas sempre que necessrio.
hibernate.dialect - dialeto a ser utilizado para a comunicao com o banco de dados
show_sql - ag que indica se os SQLs gerados devem ser impressos
format_sql - ag que indica se os SQLs devem ser formatados
Existemmuitas outras conguraes possveis. Para maiores detalhes, acesse a documentao do Hibernate.
Captulo 4 - Persistindo os dados com o Hibernate - Congurando o Hibernate - Pgina 18
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
4.5 Exerccios: Configurando o banco
1) Todos os jars necessrios para usar o hibernate j esto no projeto base que usamos. Ohibernate.cfg.xml tambm j existe na pasta src. Caso voc esteja fazendo essa apostila em casa, baixeos JARs de acordo com as orientaes desse captulo e crie o hibernate.cfg.xml similarmente.
2) Conecte-se no banco de dados para vericar se o database fj28 existe. Se ele no existir, teremos quecri-lo. Primeiro, abra um terminal pelo cone no Desktop. Depois digite:
mysql -u root
Depois de conectado, vamos vericar os bancos de dados disponveis:
mysql> show databases;
Se o database fj28 aparecer, digite:
mysql> drop database fj28;
mysql> create database fj28;
Captulo 4 - Persistindo os dados com o Hibernate - Exerccios: Congurando o banco - Pgina 19
-
Captulo 5
Cadastrando Produtos
No captulo anterior, conguramos oHibernate para acessar o banco de dados. Neste captulo, nosso objetivo cadastrar produtos.
5.1 Modelando um produto
Agora que estamos com o ambiente congurado e com o banco de dados pronto, podemos partir para acodicao.
A primeira classe que faremos ser a classe Produto. Ela representar os produtos que sero cadastrados nosistema, ou seja, quando algum produto for colocado no sistema, ns criaremos uma instncia dessa classe.
Nossa classe Produto car assim:
public class Produto {
private String nome;
private String descricao;
private Double preco;
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
// getter e setters}
BigDecimal
Em aplicaes normais, no se deve usar doubles para representarnmeros reais (ex. dinheiro, porcentagem) por causa de problemasde arredondamento. Podemos usar o BigDecimal que tem uma pre-ciso xa, portanto os problemas de arredondamento so facilmentecontornveis. No usaremos BigDecimal pois ele um pouco maiscomplicado de usar:
double a, b, c, d;d = a+b/c;
com BigDecimal:
BigDecimal a, b, c, d;d = a.add(b.divide(c));
5.2 Anotando a classe Produto
A classe Produto , por enquanto, uma classe Java normal. Mas precisamos que instncias dessa classe sejampersistidas ou recuperadas do banco de dados.
Uma das maneiras de transformar essa classe Java normal em uma classe que pode ser persistida atravs deXML. O problema dessa abordagem a diculdade e o trabalho de se fazer isso com XML.
Outra maneira, que est sendo bem aceita pela comunidade o uso de anotaes para a congurao. Aoinvs de usar um arquivo XML para congurar, basta ir na prpria classe e anot-la. Uma das grandes van-tagens, alm da simplicidade, que as anotaes passam pelo processo de compilao normal, assim comoqualquer outro cdigo java. Ou seja, a classe com as anotaes deve compilar.
Para anotar a classe Produto, basta colocar na declarao da classe a anotao @Entity, do pacotejavax.persistence. Essa anotao pertence a especicao da Java Persistence API.
@Entitypublic class Produto {
private String nome;
private String descricao;
Captulo 5 - Cadastrando Produtos - Anotando a classe Produto - Pgina 21
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
private Double preco;
// getter e setters}
Quando anotamos uma classe com @Entity, devemos indicar qual ser o campo de chave primria. Para onosso caso, vamos criar um campo id para ser a chave primria da tabela.
Para indicar que o campo id ser a chave primria, utilizaremos a anotao @Id. Um detalhe importante que o nome da anotao no devido ao nome do atributo, ou seja, o atributo e a anotao tem o nome id,mas a anotao sempre ser @Id, j o atributo de chave primria pode ser qualquer nome.
Vrias vezes no queremos passar o valor do id porque o valor desse campo ser gerado no banco de dados.Podemos informar isso pro Hibernate atravs da anotao @GeneratedValue. Para o nosso caso, esse camposer do tipo auto_increment no banco de dados.
@Entitypublic class Produto {
@Id @GeneratedValueprivate Long id;
private String nome;
private String descricao;
private Double preco;
// getter e setters}
Pronto, agora nossa entidade est devidamente anotada. S temos que fazer mais uma coisa: avisar o Hi-bernate dessa entidade, isso porque ele no encontra a entidade automaticamente. Para informar isso aoHibernate, utilizaremos o arquivo de congurao dele, o hibernate.cfg.xml.
O contedo do arquivo car assim:
Repare que temos que utilizar o nome completo da classe, ou seja, o nome da classe mais o pacote.
Captulo 5 - Cadastrando Produtos - Anotando a classe Produto - Pgina 22
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
5.3 Exerccios - Modelando o produto
1) Crie a classe Produto dentro do pacote br.com.caelum.goodbuy.modelo.
public class Produto {
private Long id;
private String nome;
private String descricao;
private Double preco;
// getter e setters}
2) Anote a classe com as anotaes da JPA.
@Entitypublic class Produto {
@Id @GeneratedValueprivate Long id;
private String nome;
private String descricao;
private Double preco;
// getter e setters}
3) Congure essa entidade no Hibernate, alterando o arquivo hibernate.cfg.xml.
Captulo 5 - Cadastrando Produtos - Exerccios - Modelando o produto - Pgina 23
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
5.4 Adicionando um produto no banco
Para adicionar um produto no banco de dados, precisamos primeiro nos conectar no banco de dados.Quando usamos o JDBC, utilizamos a interface java.sql.Connection, que representa uma conexo como banco de dados.
Mas no nosso caso, que estamos usando o Hibernate, precisamos usar diretamente essa conexo do JDBC?No, deixaremos isso para o Hibernate. Temos que lembrar que sempre que quisermos fazer algo no bancode dados, utilizaremos o Hibernate.
Para nos comunicarmos com o banco de dados utilizando o Hibernate, precisamos pedir para o Hibernateum objeto que encapsule uma conexo, e com essa conexo, ele faa o que queremos. Esse objeto que preci-samos a Session, do pacote org.hibernate.
Esse objeto muito importante para ns porque ele quem vai encapsular todas as chamadas JDBC, facili-tando muito o mecanismo de acesso ao banco de dados.
Nosso primeiro passo para conseguir uma Session instanciar uma classe que representa acongurao do Hibernate, portanto iniciamos instanciando a classe do Hibernate cujo nome org.hibernate.cfg.AnnotationConfiguration.
// Cria uma configuraoAnnotationConfiguration configuration = new AnnotationConfiguration();
Depois de criar esse objeto, vamos chamar o mtodo responsvel por ler o arquivo hibernate.cfg.xml, oconfigure().
// L o hibernate.cfg.xmlconfiguration.configure();
Aps congurar, precisamos criar um objeto que cria as sesses, uma fbrica. Esse objeto umaSessionFactory, que pode ser obtida com:
SessionFactory factory = configuration.buildSessionFactory();
Com a SessionFactory em mos conseguimos criar uma uma Session. O cdigo completo ca:
1 public class TesteDeSessao {2 public static void main(String[] args) {3 AnnotationConfiguration configuration = new AnnotationConfiguration();
Captulo 5 - Cadastrando Produtos - Adicionando um produto no banco - Pgina 24
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
4 configuration.configure();5
6 SessionFactory factory = configuration.buildSessionFactory();7 Session session = factory.openSession();8 }9 }
Apartir desse objeto session, basta passarmos uma entidade que ele se encarregar de transformar domodeloorientado a objetos para o modelo relacional.
Produto produto = new Produto();produto.setNome("Prateleira");produto.setDescricao("Uma prateleira para colocar livros");produto.setPreco(35.90);
Transaction tx = session.beginTransaction();session.save(produto);tx.commit();
Note que utilizamos uma transao para salvar o produto. Essa transao do pacote org.hibernate, e ela necessria para que o insert seja efetivado.
5.5 Exerccios
1) Crie a seguinte classe, que adiciona produtos no banco.
1 package br.com.caelum.goodbuy.testes;2
3 import org.hibernate.Session;4 import org.hibernate.SessionFactory;5 import org.hibernate.Transaction;6 import org.hibernate.cfg.AnnotationConfiguration;7
8 public class AdicaoDeProduto {9 public static void main(String[] args) {10 AnnotationConfiguration configuration = new AnnotationConfiguration();11 configuration.configure();12
13 SessionFactory factory = configuration.buildSessionFactory();14 Session session = factory.openSession();15
16 Produto produto = new Produto();17 produto.setNome("Prateleira");18 produto.setDescricao("Uma prateleira para colocar livros");
Captulo 5 - Cadastrando Produtos - Exerccios - Pgina 25
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
19 produto.setPreco(35.90);20
21 Transaction tx = session.beginTransaction();22 session.save(produto);23 tx.commit();24 }25 }
2) Execute a classe que adiciona o produto. Repare no console o sql que foi gerado.
3) Acesse o banco de dados e verique se o produto foi inserido com sucesso.
4) (Opcional) Crie outros produtos no sistema.
5.6 Outras operaes com produto
Para adicionarmos um produto no banco de dados, utilizamos o mtodo save() da sesso. A sesso doHibernate possui tambm mtodos de atualizao, remoo e busca, e a utilizao desses mtodos bemparecida com o que zemos. Para alterar um produto, basta carregarmos esse produto, alterarmos e depoisatualizarmos.
1 public class AlteracaoDeProduto {2 public static void main(String[] args) {3 AnnotationConfiguration configuration = new AnnotationConfiguration();4 configuration.configure();
Captulo 5 - Cadastrando Produtos - Outras operaes com produto - Pgina 26
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
5
6 SessionFactory factory = configuration.buildSessionFactory();7 Session session = factory.openSession();8
9 // carrega o produto do banco de dados10 Produto produto = (Produto) session.load(Produto.class, 1L);11
12 Transaction tx = session.beginTransaction();13 produto.setPreco(42.50);14 session.update(produto);15 tx.commit();16 }17 }
E para remover um produto:
1 public class RemocaoDeProduto {2 public static void main(String[] args) {3 AnnotationConfiguration configuration = new AnnotationConfiguration();4 configuration.configure();5
6 SessionFactory factory = configuration.buildSessionFactory();7 Session session = factory.openSession();8
9 // carrega o produto do banco de dados10 Produto produto = (Produto) session.load(Produto.class, 1L);11
12 Transaction tx = session.beginTransaction();13 session.delete(produto);14 tx.commit();15 }16 }
5.7 Exercicios - outras operaes com produto
1) Crie a classe de alterao do produto.
1 package br.com.caelum.goodbuy.testes;2
3 public class AlteracaoDeProduto {4 public static void main(String[] args) {5 AnnotationConfiguration configuration = new AnnotationConfiguration();6 configuration.configure();7
Captulo 5 - Cadastrando Produtos - Exercicios - outras operaes com produto - Pgina 27
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
8 SessionFactory factory = configuration.buildSessionFactory();9 Session session = factory.openSession();10
11 // carrega o produto do banco de dados12 Produto produto = (Produto) session.load(Produto.class, 1L);13
14 Transaction tx = session.beginTransaction();15 produto.setPreco(42.50);16 session.update(produto);17 tx.commit();18 }19 }
2) Execute a classe que altera o produto. Repare no console o sql que foi gerado.
3) Acesse o banco de dados e verique se o produto foi alterado com sucesso.
4) Crie a classe de remoo do produto.
Captulo 5 - Cadastrando Produtos - Exercicios - outras operaes com produto - Pgina 28
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
1 package br.com.caelum.goodbuy.testes;2
3 public class RemocaoDeProduto {4 public static void main(String[] args) {5 AnnotationConfiguration configuration = new AnnotationConfiguration();6 configuration.configure();7
8 SessionFactory factory = configuration.buildSessionFactory();9 Session session = factory.openSession();10
11 // carrega o produto do banco de dados12 Produto produto = (Produto) session.load(Produto.class, 1L);13
14 Transaction tx = session.beginTransaction();15 session.delete(produto);16 tx.commit();17 }18 }
5) Execute a classe que remove o produto. Repare no console o sql que foi gerado.
6) Acesse o banco de dados e verique se o produto foi alterado com sucesso.
Captulo 5 - Cadastrando Produtos - Exercicios - outras operaes com produto - Pgina 29
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
5.8 Discusso em sala -mais sobre oHibernate
Por que utilizamos o Long e no o long para o campo id
Eu sempre z com que minhas entidades implementassem Serializable. mesmo necessrio?
Vale mesmo a pena utilizar o Hibernate? No vou perder performance?
Captulo 5 - Cadastrando Produtos - Discusso em sala - mais sobre o Hibernate - Pgina 30
-
Captulo 6
Refatorando
6.1 Analisando o cdigo atual
Se olharmos para o nosso projeto agora, temos a seguinte situao:
Tabela de produtos est no banco de dados
Hibernate congurado
Classes de testes para lidar com produtos
Mas ser que com o que temos agora podemos cadastrar produtos, conforme o cliente pediu?
Repare na ltima parte da pergunta, que muito importante. Se entregarmos o que temos agora para ocliente, ele dir que isso intil e nosso sistema no tem nada ainda.
O que faltou, que muito importante, integrar a parte visual (web) com as regras de negcios.
Mas repare que o jeito que esto nossas classes que lidam com um produto no banco de dados. Todo nossocdigo est em classes de testes, dentro do mtodo main(). Se deixarmos dessa maneira caria muito difcilde utilizar esse cdigo.
Ento o que precisamos fazer melhorar nosso cdigo, para que possamos utilizar o que foi escrito dentrodo main(), e tambm para melhorar a manuteno e a legibilidade.
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
6.2 Refactoring
Uma prtica bastante comum e difundida nomeio da Orientao a Objetos a chamada Refatorao (Refac-toring). Refatorar umprograma melhorar seu cdigo sem alterar sua funcionalidade. A ideia da refatoraono corrigir bugs, por exemplo, mas melhorar a estrutura de seu cdigo, deix-lo mais OO, mais legvel.
H diversos tipos de refatoraes. Renomear uma varivel para um nome mais claro um exemplo simples.Quebrar um mtodo grande em vrios mtodos menores um outro exemplo um pouco mais complicado.
Vrias IDEs de Java possuem suporte refatoraes comuns. O Eclipse possui timas opes automticasque utilizaremos nesse curso.
O livro mais famoso sobre refatoraes foi escrito por Martin Fowler e chama-se Refactoring - Improving theDesign of existing code. um catlogo com dezenas de tcnicas de refatorao e instrues de como e quandoexecut-las.
6.3 Aprendendo a refatorar
Vamos abrir novamente a classe de insero de produtos.
package br.com.caelum.goodbuy.testes;
// import's
public class AdicaoDeProduto {
public static void main(String[] args) {AnnotationConfiguration configuration = new AnnotationConfiguration();configuration.configure();
SessionFactory factory = configuration.buildSessionFactory();Session session = factory.openSession();
Produto produto = new Produto();produto.setNome("Prateleira");produto.setDescricao("Uma prateleira para colocar livros");produto.setPreco(35.90);
Transaction tx = session.beginTransaction();session.save(produto);tx.commit();
}}
Captulo 6 - Refatorando - Refactoring - Pgina 32
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
Olhando para o mtodo main, podemos divid-lo em trs partes. Uma parte a aquisio de uma Session,outra a criao do produto, e a outra adio do produto no banco de dados. Combase nessa diviso, vamospedir para o Eclipse nos ajudar a refatorar, para fazer essa diviso de uma maneira segura e automtica.
Apenas para car claro essa diviso, veja o cdigo novamente, agora com os comentrios mostrando ondecomea cada parte.
1 package br.com.caelum.goodbuy.testes;2
3 // import's4
5 public class AdicaoDeProduto {6
7 public static void main(String[] args) {8 // Aquisio da sesso9 AnnotationConfiguration configuration = new AnnotationConfiguration();10 configuration.configure();11
12 SessionFactory factory = configuration.buildSessionFactory();13 Session session = factory.openSession();14
15 // Criao do produto16 Produto produto = new Produto();17 produto.setNome("Prateleira");18 produto.setDescricao("Uma prateleira para colocar livros");19 produto.setPreco(35.90);20
21 // Adio do produto no banco de dados22 Transaction tx = session.beginTransaction();23 session.save(produto);24 tx.commit();25 }26 }
Selecionando apenas a parte da aquisio da sesso, vamos utilizar as teclas de atalho do Eclipse para criarummtodo com essas instrues. As teclas de atalho so Alt + Shift + M, que representa a opo ExtractMethod.
Apertando essas teclas, o Eclipse mostrar uma tela perguntado o nome domtodo que ser criado. O nomedesse mtodo ser getSession().
Colocando o nome do mtodo e apertando OK, o mtodo ser criado e a parte do cdigo que usa essasinstrues j muda automaticamente, fazendo a chamada ao mtodo recm-criado.
Captulo 6 - Refatorando - Aprendendo a refatorar - Pgina 33
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
6.4 Exerccios
1) Altere a classe AdicaoDeProduto, que est no pacote br.com.caelum.goodbuy.testes, colocando os co-mentrios para deixar claro a diviso das partes.
1 package br.com.caelum.goodbuy.testes;2
3 // import's4
5 public class AdicaoDeProduto {6
7 public static void main(String[] args) {8 // Aquisio da sesso9 AnnotationConfiguration configuration = new AnnotationConfiguration();10 configuration.configure();11
12 SessionFactory factory = configuration.buildSessionFactory();13 Session session = factory.openSession();14
15 // Criao do produto16 Produto produto = new Produto();17 produto.setNome("Prateleira");18 produto.setDescricao("Uma prateleira para colocar livros");19 produto.setPreco(35.90);20
21 // Adio do produto no banco de dados22 Transaction tx = session.beginTransaction();23 session.save(produto);24 tx.commit();25 }26 }
2) Selecione as linhas que fazem a aquisio da sesso, conforme a gura abaixo:
Captulo 6 - Refatorando - Exerccios - Pgina 34
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
3) Comas linhas selecionadas, pressione as teclas Alt + Shift + M (ExtractMethod), para criar ummtodocom essas linhas. Aps pressionar essas teclas, aparecer a seguinte tela:
4) A tela que est sendo mostrada est esperando por um nome de mtodo. Digite getSession como nomedo mtodo e pressione OK.
Captulo 6 - Refatorando - Exerccios - Pgina 35
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
5) Note como o Eclipse mudou seu cdigo, criando o mtodo getSession e fazendo a chamada a este m-todo. A classe deve estar assim:
public class AdicaoDeProduto {
public static void main(String[] args) {// Aquisio da sessoSession session = getSession();
// Criao do produtoProduto produto = new Produto();produto.setNome("Prateleira");produto.setDescricao("Uma prateleira para colocar livros");produto.setPreco(35.90);
// Adio do produto no banco de dadosTransaction tx = session.beginTransaction();session.save(produto);tx.commit();
}
private static Session getSession() {AnnotationConfiguration configuration = new AnnotationConfiguration();configuration.configure();
SessionFactory factory = configuration.buildSessionFactory();Session session = factory.openSession();return session;
Captulo 6 - Refatorando - Exerccios - Pgina 36
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
}}
6) Faa o mesmo para as linhas de criao de produto e adio de produto no banco de dados. No nal,caremos com 3mtodos, um chamado getSession, que j foi feito, outro chamado criaProduto e outrochamado gravaProduto. Lembre-se de utilizar as teclas de atalho que vimos nesse exerccio.
7) Para conferncia, caremos com a classe da seguinte forma:
1 package br.com.caelum.goodbuy.testes;2
3 // import's4
5 public class AdicaoDeProduto {6
7 public static void main(String[] args) {8 // Aquisio da sesso9 Session session = getSession();10
11 // Criao do produto12 Produto produto = criaProduto();13
14 // Adio do produto no banco de dados15 gravaProduto(session, produto);16 }17
18 private static void gravaProduto(Session session, Produto produto) {19 Transaction tx = session.beginTransaction();20 session.save(produto);21 tx.commit();22 }23
24 private static Produto criaProduto() {25 Produto produto = new Produto();26 produto.setNome("Prateleira");27 produto.setDescricao("Uma prateleira para colocar livros");28 produto.setPreco(35.90);29 return produto;30 }31
32 private static Session getSession() {33 AnnotationConfiguration configuration = new AnnotationConfiguration();34 configuration.configure();35
36 SessionFactory factory = configuration.buildSessionFactory();37 Session session = factory.openSession();
Captulo 6 - Refatorando - Exerccios - Pgina 37
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
38 return session;39 }40 }
6.5 Comentrios so sempre necessrios?
Note que o que zmos foi quebrar ummtodo grande em vrios mtodo pequenos. Pode parecer intil essetipo de alterao, j que no mudamos nada no cdigo, s a forma como est organizado.
Mas repare que omtodo main coumuitomais legvel, intuitivo. Basta dar uma olhada rpida que podemosentender o que ele faz.
Mas agora que o mtodo main foi quebrado em mtodos menores, ser que precisamos mesmo de co-mentrios? Olhe novamente para o cdigo, e veja que os nomes dos nossos mtodos j dizem muito o quequeremos, ento nem precisamos mais de comentrios.
J que no precisamos mais dos comentrios, vamos retir-los do nosso cdigo:
public class AdicaoDeProduto {
public static void main(String[] args) {Session session = getSession();
Produto produto = criaProduto();
gravaProduto(session, produto);}// outros mtodos
}
6.6 Refatorando para criar osDAOs
Olhandonovamente para a classe de adio de produtos, podemos notar que ainda no podemos reaproveitaro cdigo de criao de sesso do Hibernate em outras classes. O mesmo acontece com a classe de remoode usurios.
Podemos ento criar uma classe que vai ser responsvel pela obteno de Sessions, para que possamos us-lasempre que precisarmos de uma. Vamos dar a essa classe o nome de CriadorDeSession, e mover o mtodogetSession() para ela.
Damesma forma, podemos juntar as operaes de adicionar, remover, atualizar produtos em uma classe, queser responsvel por acessar os produtos no banco de dados. E a essa classe vamos dar o nome de ProdutoDao.
Captulo 6 - Refatorando - Comentrios so sempre necessrios? - Pgina 38
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
6.7 Exerccios
1) Crie uma classe chamada CriadorDeSession no pacote br.com.caelum.goodbuy.infra. Essa classe sera responsvel por criar uma Session.
2) Selecione o mtodo getSession da classe AdicaoDeProduto.
3) Com as linhas selecionadas, pressione as teclas Alt + Shift + V (Move Method), para criar ummtodocom essas linhas. Aps pressionar essas teclas, aparecer a seguinte tela:
Captulo 6 - Refatorando - Exerccios - Pgina 39
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
4) A tela que est sendo mostrada est esperando pela classe que car com esse mtodo. Pressione o botoBrowse..., e busque pela classe CriadorDeSession, conforme a imagem abaixo:
5) Aps encontrar a classe CriadorDeSession, pressione o boto OK para escolher essa classe, depois OKnovamente para conrmar a mudana do mtodo para essa classe.
6) Aparecer uma tela avisando que a visibilidade do mtodo getSession ser alterada public. Conrmeessa alterao pressionando o boto Continue.
Captulo 6 - Refatorando - Exerccios - Pgina 40
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
7) Repare como cou a classe aps essa alterao:
public class AdicaoDeProduto {
public static void main(String[] args) {Session session = CriadorDeSession.getSession();
Produto produto = criaProduto();
gravaProduto(session, produto);}
private static void gravaProduto(Session session, Produto produto) {Transaction tx = session.beginTransaction();session.save(produto);tx.commit();
}
private static Produto criaProduto() {Produto produto = new Produto();produto.setNome("Prateleira");produto.setDescricao("Uma prateleira para colocar livros");
Captulo 6 - Refatorando - Exerccios - Pgina 41
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
produto.setPreco(35.90);return produto;
}}
8) Crie uma classe chamada ProdutoDao no pacote br.com.caelum.goodbuy.dao. Essa classe ser a respon-svel por encapsular as chamadas ao Hibernate.
9) Mova o mtodo gravaProduto para a classe ProdutoDao. Utilize as teclas de atalho que vimos nesseexerccio.
10) Repare como cou a classe aps essa alterao:
public class AdicaoDeProduto {
public static void main(String[] args) {Session session = CriadorDeSession.getSession();
Produto produto = criaProduto();
ProdutoDao.gravaProduto(session, produto);}
private static Produto criaProduto() {Produto produto = new Produto();produto.setNome("Prateleira");produto.setDescricao("Uma prateleira para colocar livros");produto.setPreco(35.90);return produto;
}}
11) Vamos refatorar agora a classe ProdutoDao, que est no momento assim:
public class ProdutoDao {
public static void gravaProduto(Session session, Produto produto) {Transaction tx = session.beginTransaction();session.save(produto);tx.commit();
}
}
Primeiro vamos tirar o static do mtodo gravaProduto.
public class ProdutoDao {
Captulo 6 - Refatorando - Exerccios - Pgina 42
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
public void gravaProduto(Session session, Produto produto) {Transaction tx = session.beginTransaction();session.save(produto);tx.commit();
}
}
12) A classe AdicaoDeProduto agora no compila. Vamos trocar o acesso esttico por acesso a uma instnciado dao:
public class AdicaoDeProduto {
public static void main(String[] args) {Session session = CriadorDeSession.getSession();
Produto produto = criaProduto();
new ProdutoDao().gravaProduto(session, produto);}
//...}
13) O mtodo gravaProduto recebe uma Session. Mas o ProdutoDao deveria ser responsvel pelo acesso adados, ento ela mesma deve ser responsvel por criar a session. Mude isso no ProdutoDao:
public class ProdutoDao {
public void gravaProduto(Produto produto) {Session session = CriadorDeSession.getSession();Transaction tx = session.beginTransaction();session.save(produto);tx.commit();
}
}
Mude tambm a classe AdicaoDeProduto:
public class AdicaoDeProduto {
public static void main(String[] args) {
Produto produto = criaProduto();
new ProdutoDao().gravaProduto(produto);}
Captulo 6 - Refatorando - Exerccios - Pgina 43
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
//...}
14) Por ltimo, no precisamos criar uma Session dentro do mtodo gravaProduto, vamos fazer isso dentrodo construtor da classe, e colocar a Session como atributo:
public class ProdutoDao {
private final Session session;
public ProdutoDao() {this.session = CriadorDeSession.getSession();
}
public void gravaProduto(Produto produto) {Transaction tx = session.beginTransaction();session.save(produto);tx.commit();
}
}
15) Agora a chamada do mtodo gravaProduto est correta, porm repare como est um pouco redun-dante:
new ProdutoDao().gravaProduto(produto);
Seria melhor se fosse assim:
new ProdutoDao().salva(produto);
Vamos fazer essa mudana de nome de mtodo utilizando o Eclipse. Pressione as teclas Alt + Shift +R (rename) mtodo da classe ProdutoDao, e o Eclipse pedir o novo nome para o mtodo.
Captulo 6 - Refatorando - Exerccios - Pgina 44
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
Digite salva como novo nome do mtodo.
16) (Opcional) Refatore as outras classes de teste, AlteracaoDeProduto e RemocaoDeProduto, para utilizar oProdutoDao.
Captulo 6 - Refatorando - Exerccios - Pgina 45
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
6.8 Discusso em sala
Ouvi falar do padro Repository. Ainda preciso dos daos?
O eclipse ajuda no refactoring?
Captulo 6 - Refatorando - Discusso em sala - Pgina 46
-
Captulo 7
VRaptor
7.1 Sobre o VRaptor
VRaptor 3 um framework MVC para web focado no desenvolvimento gil.
Atravs da inverso de controle e injeo de depndencias, ele diminui drasticamente o tempo de trabalhoque seria perdido com o cdigo repetitivo: validaes, converses, direcionamentos, ajax e lookups.
7.2 Como instalar
Para utilizar o VRaptor, basta fazer o download da ltima verso do VRaptor, e depois fazer o unzip.
Aps fazer o unzip, abra a pasta que foi criada e copie os jars que esto em lib/mandatory para a pastaWEB-INF/lib do seu projeto, alm do vraptor-3.X.X.jar. Tambm necessrio escolher um container deinjeo de dependncias (falaremos sobre eles mais pra frente no curso), entre o Spring, Google Guice ouPico container, adicionando todos os jars da pasta lib/containers/.
7.3 Como configurar
Uma das grandes vantagens do VRaptor que ele usa muitas convenes, ou seja, ao invs de termos quecongurar tudo, como por exemplo no Struts, no precisamos congurar quase nada.
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
Seguindo as convenes que o VRaptor usa, podemos criar apenas nossas lgicas (cdigo java) sem precisarescrever xmls ou properties.
A nica congurao que precisamos fazer congurar o controlador do VRaptor. Essa congurao feitadentro do arquivo web.xml, o arquivo de congurao da aplicao.
vraptorbr.com.caelum.vraptor.VRaptor
vraptor/*FORWARDREQUEST
Essas conguraes j foram feitas no projeto base.
Servlet 3.0
Se voc estiver usando um Servlet Container que implementa a Ser-vlet 3.0 voc nem precisa da congurao do ltro no web.xml. Bastacolocar o jar doVRaptor na pastaWEB-INF/lib e ele ser conguradoautomaticamente.
7.4 Primeiro exemplo com o VRaptor
Vamos criar nosso primeiro exemplo utilizando o VRaptor. Esse primeiro exemplo ser bem simples, paraentendermos o funcionamento do VRaptor. Veremos mais adiante exemplos mais complexos e mais elabo-rados.
Nosso primeiro exemplo ser composto de uma classe, que representar as regras de negcio, e uma pginade resultado.
Vamos comear pela regra de negcio, um mtodo dentro de uma classe java simples.
1 package br.com.caelum.goodbuy;2
Captulo 7 - VRaptor - Primeiro exemplo com o VRaptor - Pgina 48
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
3 public class Mundo {4
5 public void boasVindas() {6 System.out.println("ol mundo!");7 }8
9 }
Repare que essa classe no herda nem implementa nenhuma interface. Essa classe um exemplo de umPOJO. Isso muito importante porque a classe est bem simples, bem legvel.
Agora como fazer para chamar essa lgica? Queremos cham-la assim pelo browser:
http://localhost:8080/goodbuy/mundo/boasVindas
Para chamar essa lgica, temos que anotar nossa classe que contm a regra de negcio, para indicar para ocontrolador do VRaptor que essa classe deve ser controlada por ele.
A anotao que utilizaremos para indicar isso a @Resource.
Nossa classe car assim:
1 package br.com.caelum.goodbuy;2
3 import br.com.caelum.vraptor.Resource;4
5 @Resource6 public class Mundo {7
8 public void boasVindas() {9 System.out.println("ol mundo!");10 }11
12 }
OVRaptor vai usar uma conveno para chamar o nosso mtodo: para executar o mtodo boasVindas() daclasse Mundo, posso chamar no browser a URI /mundo/boasVindas a partir da nossa aplicao, ou seja, a URIhttp://localhost:8080/goodbuy/mundo/boasVindas.
1 package br.com.caelum.goodbuy;2
3 import br.com.caelum.vraptor.Resource;4
5 @Resource6 public class Mundo {
Captulo 7 - VRaptor - Primeiro exemplo com o VRaptor - Pgina 49
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
7
8 public void boasVindas() {9 System.out.println("ol mundo!");10 }11
12 }
7.5 Exerccios
1) Crie a classe Mundo no pacote br.com.caelum.goodbuy.
1 package br.com.caelum.goodbuy;2
3 public class Mundo {4
5 public void boasVindas() {6 System.out.println("ol mundo!");7 }8
9 }
2) Anote a classe Mundo com @Resource.
3) Abra um browser, por exemplo o Firefox, e digite a seguinte url: http://localhost:8080/goodbuy/mundo/boasVindas
4) Ao acessar essa url, mostrada uma pgina com erro 404 (pgina no encontrada). Isso ocorreu porqueainda no criamos a pgina de resultado. Ela ser criada na prxima seo. O importante vericar o logda aplicao, na view Console do Eclipse, e ver que a mensagem apareceu.
5) (Opcional) Crie outromtodo, parecido com o que zemos, e acesse pelo browser. Se quiser, esse mtodopode ser em outra classe.
Captulo 7 - VRaptor - Exerccios - Pgina 50
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
7.6 Redirecionando para uma view
Nosso ltimo exemplo executava a lgica que tnhamos criado, mas a pgina de resultado no tinha sidofeita, e recebamos o erro 404.
Vamos fazer a pgina de resultado, para que depois de executada a lgica, essa pgina seja chamada. Esse o contedo da pgina:
Ol Mundo!
Conforme foi dito anteriormente, o VRaptor prefere convenes do que conguraes. A conveno deredirecionamento de pginas aps a lgica a seguinte:
/WEB-INF/jsp/{nomeDoResource}/{lgica}.jsp
Para nosso caso, temos a seguinte situao:
{nomeDoResource} = Mundo
{lgica} = boasVindas()
O VRaptor vai fazer algumas modicaes nesses valores. A primeira letra do nome do resource, que parans o nome da classe, ser passado para minsculo. O resto do nome continuar igual. J o nome da lgicacontinuar igual, mas sem os parnteses. Ento o VRaptor vai considerar os seguintes valores:
{nomeDoResource} = mundo
{lgica} = boasVindas
E a pgina que ele buscar ser a seguinte:
/WEB-INF/jsp/mundo/boasVindas.jsp
7.7 Exerccios
1) Crie uma pasta chamada jsp dentro da pasta WEB-INF. Cuidado, o nome da pasta deve ser com letrasminsculas.
2) Crie uma pasta chamada mundo dentro da pasta WEB-INF/jsp. Cuidado, o nome da pasta deve ser comletras minsculas.
3) Crie um jsp chamado boasVindas.jsp dentro da pasta WEB-INF/jsp/mundo. Seu projeto deve car assim:
Captulo 7 - VRaptor - Redirecionando para uma view - Pgina 51
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
4) Abra o arquivo boasVindas.jsp que acabamos de criar e digite o seguinte contedo:
Ol Mundo!
5) Vamos testar nossas alteraes. Inicie o Tomcat na view Servers, depois abra um browser e digite a se-guinte url: http://localhost:8080/goodbuy/mundo/boasVindas
6) Verique se o console mostra a mensagem ol mundo!, e verique se o browser exibe a mensagem OlMundo.
7.8 Disponibilizando informaes para a view
Nosso exemplo at agora s executa algo no servidor e depois a view chamada.
Captulo 7 - VRaptor - Disponibilizando informaes para a view - Pgina 52
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
Mas para muitos casos precisamos que a lgica carregue informaes do banco de dados e depois a viewexiba essas informaes.
No VRaptor 3 foi criada uma caracterstica muito intuitiva de se mandar informaes para a view. Quandoummtodo invocado, por exemplo nosso mtodo boasVindas(), podemos fazer com que ele retorne algo,e esse retorno ser enviado para a view automaticamente.
As verses anteriores usavam atributos junto com anotaes ou getters. O problema dessa abordagem quea classe cava muito poluda com atributos, getters ou anotaes.
Vamos alterar nosso mtodo para enviar informaes para a view:
1 package br.com.caelum.goodbuy;2
3 @Resource4 public class Mundo {5
6 public String boasVindas() {7 return "ol mundo!";8 }9
10 }
Agora o mtodo boasVindas() no imprime nada, apenas retorna uma string. Aps a execuo desse m-todo, essa string j estar disponvel na view.
muito importante perceber a legibilidade desse mtodo. uma classe java normal, e um mtodo queretorna uma string.
Para que a view possa imprimir esse valor, vamos utilizar Expression Language no nosso jsp. Nosso jsp carassim:
Mensagem vinda da lgica:${string}
Como utilizamos o retorno domtodo para disponibilizar informaes para a view, no temos como dar umnome signicativo para utilizar depois.
O VRaptor usa a conveno de buscar o tipo do retorno, nesse nosso caso uma String, e disponibilizar para aview comomesmonome, apenas passando a primeira letra paraminsculo. Por essemotivo que foi utilizadoa expression language ${string}.
7.9 Disponibilizando colees para a view
Podemos utilizar amesmamaneira que zemos com Strings para disponibilizar colees para a view. Utiliza-mos muito as colees do pacote java.util, seja pela facilidade no uso ou pela integrao com frameworks
Captulo 7 - VRaptor - Disponibilizando colees para a view - Pgina 53
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
como o Hibernate.
Se nossa lgica criasse uma coleo com informaes que vieram do banco de dados, poderamos retornaressa coleo, assim como zemos anteriormente. O cdigo caria assim:
1 package br.com.caelum.goodbuy;2
3 @Resource4 public class Mundo {5
6 public String boasVindas() {7 return "ol mundo!";8 }9
10 public List paises() {11 List result = new ArrayList();12 result.add("Brasil");13 result.add("Portugal");14 result.add("Japo");15 result.add("Canad");16 result.add("Paraguai");17 return result;18 }19
20 }
Na nossa view, podemos imprimir os valores dessa coleo da seguinte forma:
Pases vindos da lgica:${stringList}
Note que agora o valor passado na expression language foi ${stringList}. O VRaptor identica que devol-vemos uma lista, e essa lista genrica, informando que o tipo de informao dentro da lista ser String.
Para listas, o VRaptor vai adotar a seguinte conveno:
{tipoDaLista}List
Nosso exemplo era de uma lista de String, ou seja, List, que virou ${stringList}.
7.10 Exerccios
1) Altere o mtodo boasVindas() da classe Mundo para retornar uma String.
Captulo 7 - VRaptor - Exerccios - Pgina 54
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
1 package br.com.caelum.goodbuy;2
3 @Resource4 public class Mundo {5
6 public String boasVindas() {7 return "ol mundo!";8 }9
10 }
2) Altere o jsp boasVindas.jsp, que est dentro da pasta WEB-INF/jsp/mundo.
Mensagem vinda da lgica:${string}
3) Teste a lgica que acabamos de criar, acessando a seguinte url: http://localhost:8080/goodbuy/mundo/boasVindas Sua pgina deve exibir o seguinte resultado:
4) Crie ummtodo chamado paises() na classe Mundo. Esse mtodo deve retornar uma lista de Strings. Seucdigo car assim:
public List paises() {List result = new ArrayList();result.add("Brasil");result.add("Portugal");result.add("Japo");result.add("Canad");result.add("Paraguai");return result;
}
5) Crie um jsp em WEB-INF/jsp/mundo chamado paises.jsp. O contedo deve ser esse:
Pases vindos da lgica:${stringList}
Captulo 7 - VRaptor - Exerccios - Pgina 55
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
6) Teste a lgica que acabamos de criar, acessando a seguinte url:
http://localhost:8080/goodbuy/mundo/paises
Sua pgina deve exibir o seguinte resultado:
7) (Opcional) Crie outro mtodo que mande alguma informao para a view. Dessa vez, tente retornar umvalor inteiro ou um valor decimal.
8) (Opcional) Crie outro mtodo que retorne um Produto, com algumas informaes preenchidas. Tenteimprimir essas informaes no jsp.
9) (Opcional) Na view que exibe os pases, itere sobre a coleo e mostre cada pas em uma linha. Dica: useo JSTL, tag c:forEach.
10) (Opcional) Um mtodo s pode retornar uma informao. Mas como faramos para disponibilizar paraa view mais de uma informao?
Captulo 7 - VRaptor - Exerccios - Pgina 56
-
Captulo 8
Criando o Controlador de Produtos
8.1 Listando produtos
Relembrando o que temos no nosso projeto, criamos o dao de produto para encapsular as chamadas aoHibernate, e vimos como se usa o VRaptor 3, recebendo e disponibilizando valores da view. Precisamosagora integrar essas duas partes, para que possamos fazer o cadastro do produto pelo browser.
Vamos comear criando nossa classe que far a lgica de negcios. O nome da classe poderia ser qualquernome vlido, mas usaremos uma conveno do VRaptor: utilizar o suxo Controller.
Vimos que o nome da classe utilizado pelo VRaptor para registrar esse componente, para que quandozermos uma chamada do browser, essa classe seja encontrada e algummtodo seja invocado. Mas utilizandoo nome ProdutosController, o VRaptor vai mapear essa classe para apenas /produtos, removendo o suxoController que faz parte da conveno.
Dentro dessa classe, teremos ummtodo para listar todos os produto. Essemtodo ser invocado peloVRap-tor e o produto em questo ser passado com os dados j populados atravs dos dados do formulrio.
Primeiro, vamos listar todos os produtos existentes no banco de dados. Para isso, vamos usar o mtodocreateCriteria de Session que cria uma Criteria. Atravs de um Criteria, temos acesso a diversas ope-raes no banco de dados; uma delas listar tudo com o mtodo list().
Nosso mtodo listaTudo() no ProdutoDao ca assim:
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
public class ProdutoDao {//...
public List listaTudo() {return this.session.createCriteria(Produto.class).list();
}}
Com essa listagem pronta, podemos us-la no ProdutosController, e criar uma lgica que lista produtos.Coloque a classe no pacote br.com.caelum.goodbuy.controller:
package br.com.caelum.goodbuy.controller;
public class ProdutosController {
public List lista() {ProdutoDao dao = new ProdutoDao();return dao.listaTudo();
}
}
Olhando para esse mtodo, que no incio tnhamos denido para ser nossa regra de negcio, ser que temosapenas isso? Ser que apenas listamos os produtos?
Na verdade esse mtodo est fazendo mais tarefas do que deveria. Ele possui algumas responsabilidadesextras, por exemplo criar o ProdutoDao. A nica parte que a regra de negcio para esse caso a chamadaao dao.listaTudo(). O resto apenas infraestrutura para permitir executar essa tarefa.
Avaliando esse problema, podemos perceber que estamos buscando recursos, nesse caso um dao, e portantonos preocupando demasiadamente com os mesmos. Se buscar um recurso ruim, seja pela complexidadeou diculdade no acesso, e tambm por no fazer parte da regra de negcio, que tal se ao invs de cri-lo,recebssemos o mesmo?
1 package br.com.caelum.goodbuy.controller;2
3 // import's4
5 @Resource6 public class ProdutosController {7
8 private ProdutoDao dao;9
10 public ProdutosController(ProdutoDao dao) {11 this.dao = dao;12 }
Captulo 8 - Criando o Controlador de Produtos - Listando produtos - Pgina 58
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
13
14 public List lista() {15 return dao.listaTudo();16 }17
18 }
Repare como seria mais simples nosso mtodo que executa a regra de negcio, e tambm como o mtodos executa a parte que realmente lhe interessa. A busca dos recursos necessrios para a execuo de nessalgica de negcios - nesse caso a criao do dao - no interessa pra essa classe.
Um ponto muito importante que temos que notar que para que essa classe funcione corretamente, preci-samos de uma instncia de ProdutoDao. Se no tivermos essa instncia, impossvel executar nossa regra denegcios, pois no existe construtor que no receba um ProdutoDao.
Como vimos antes, essa lgica redireciona para a jsp /WEB-INF/jsp/produtos/lista.jsp, e como retorna-mos uma lista de produtos, existe uma varivel chamada ${produtoList} disponvel no jsp.
Para podermosmostrar a listagemde um jeitomais fcil, vamos usar uma taglib da JSTL chamada c:forEach,que capaz de iterar sobre uma lista passada.
Usando essa taglib, vamos criar uma tabela com todos os produtos do sistema:
NomeDescrioPreo
${produto.nome }${produto.descricao }${produto.preco }
Captulo 8 - Criando o Controlador de Produtos - Listando produtos - Pgina 59
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
8.2 Quais so minhas dependncias?
Tudo que um objeto necessita para permitir a execuo de seusmtodos, isto , tudo o que ele depende, podeser passado para o mesmo atravs de mtodos (como os setters, por exemplo), ou do construtor.
Na nossa abordagem, utilizamos o construtor da classe ProdutosController para receber nossas dependn-cias e, com isso, ganhamos a garantia de que, se tenho um objeto do tipo ProdutosController na minhamo, posso invocar o mtodo adiciona pois o atributo dao teve seu valor atribudo durante a construo doobjeto.
Ao adicionar o construtor customizado, perdemos o construtor padro, e no podemos mais instanciar essaclasse assim:
ProdutosController controller = new ProdutosController();
Essa caracterstica de, com um objeto em mos, saber que seus mtodos podem ser invocados sem ne-cessidade de nenhuma dependncia externa extra, parte do que foi chamado de Good Citizen: http://docs.codehaus.org/display/PICO/Good+Citizen
Em um objeto todas as dependncias devem ser passadas durante o processo de construo evitando assimum possvel estado incosistente.
Como poderia ento criar o meu ProdutosController?
1 ProdutoDao dao = new ProdutoDao();2 ProdutosController controller = new ProdutosController(dao);
Repare que logo aps a segunda linha ser executada, tenho a conana de que o objeto referenciado pelavarivel controller est preparado para ter seus mtodos invocados.
Dessa maneira injetamos todas as nossas dependncias durante a instanciao do controlador, um trabalhomanual que car extremamente repetitivo e propcio a erro a medida que aumenta o nmero de dependn-cias de nossa classe.
8.3 Injeo deDependncias
Sendo assim, ca muito mais fcil se zermos uso de uma API que execute todo o processo de injeo auto-maticamente.
No nosso caso, quem vai instanciar essa classe? Ns ou o VRaptor? Essa classe ser instanciada pelo VRap-tor. Mas se o VRaptor zer isso, como ele descobrir sobre interligaes entre as dependncias?
Uma vez que precisamos da classe ProdutoDao como dependncia nossa, precisamos noticar o frameworkque o mesmo se encarregar de gerenciar as instncias de ProdutoDao, isto , nesse caso especco, ele criaruma instncia e utilizar como argumento para o construtor. Para fazer isso, basta anotarmos essa classe com@Component.
Captulo 8 - Criando o Controlador de Produtos - Quais so minhas dependncias? - Pgina 60
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
package br.com.caelum.goodbuy.dao;
// import's
import br.com.caelum.vraptor.ioc.Component;
@Componentpublic class ProdutoDao {//...}
Agora a classe ProdutoDao tambm ser controlada pelo VRaptor. Dessa forma, quando o VRaptor for ins-tanciar a classe ProdutosController, ele vericar que ela depende de um ProdutoDao, e criar uma instnciada mesma.
O que acabamos de fazer foi criar uma maneira de passar as dependncias para onde for necessrio, ouseja, um mecanismo de injetar as dependncias. Por esse motivo, esse conceito chamado de Injeo deDependncias.
OVRaptor est fortemente baseado nesse conceito, uma vez que at elemesmoutiliza omesmopara conectarseus componentes internos. O conceito bsico por trs de Dependency Injection (DI) que voc no devebuscar aquilo que deseja acessar, mas tais necessidades devem ser fornecidas para voc.
Isso se traduz, por exemplo, na passagem de componentes atravs do construtor de seus controladores. Ima-gine que seu controlador de clientes necessita acessar um dao. Sendo assim, especique claramente essanecessidade.
Testando sua aplicao
Ao usarmos injeo de dependncias, ganhamos uma caractersticamuito boa na nossa aplicao: a testabilidade. Se recebemos nos-sas dependncias no construtor, conseguimos passar implementaesfalsas ou controladas e, assim, testar unitariamente nossas classes.
Voc pode encontrar um contedomais aprofundado sobre testes noscursos FJ-16 - Laboratrio Java comTestes, XML eDesign Patternse PM-87 - Prticas geis de desenvolvimento de soware.
8.4 Exerccios
1) Abra a classe ProdutoDao e adicione o mtodo para listar todos os produtos:
public class ProdutoDao {//...
Captulo 8 - Criando o Controlador de Produtos - Exerccios - Pgina 61
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
public List listaTudo() {return this.session.createCriteria(Produto.class).list();
}}
2) Crie a classe ProdutosController no pacote br.com.caelum.goodbuy.controller. Crie tambm o m-todo lista, que retorna uma List.
3) Anote a classe com a anotao @Resource.
1 package br.com.caelum.goodbuy.controller;2
3 // import's4
5 import br.com.caelum.vraptor.Resource;6
7 @Resource8 public class ProdutosController {9
10 public List lista() {11 }12
13 }
4) Crie o construtor que recebe uma instncia de ProdutoDao, e guarde essa instncia em um atributo.
1 package br.com.caelum.goodbuy.controller;2
3 // import's4 import br.com.caelum.vraptor.Resource;5
6 @Resource7 public class ProdutosController {8
9 private final ProdutoDao dao;10
11 public ProdutosController(ProdutoDao dao) {12 this.dao = dao;13 }14
15 public List lista() {16 }17
18 }
5) No mtodo lista, faa a chamada ao mtodo listaTudo do dao.
1 package br.com.caelum.goodbuy.controller;
Captulo 8 - Criando o Controlador de Produtos - Exerccios - Pgina 62
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
2
3 // import's4
5 import br.com.caelum.vraptor.Resource;6
7 @Resource8 public class ProdutosController {9
10 private final ProdutoDao dao;11
12 public ProdutosController(ProdutoDao dao) {13 this.dao = dao;14 }15
16 public List lista() {17 return dao.listaTudo();18 }19
20
21 }
6) Na pasta WEB-INF/jsp, crie a pasta produtos.
7) Crie o arquivo lista.jsp na pasta /WEB-INF/jsp/produtos.
NomeDescrioPreo
${produto.nome }${produto.descricao }${produto.preco }
8) Acesse a URI que executa o mtodo lista: http://localhost:8080/goodbuy/produtos/lista.
Captulo 8 - Criando o Controlador de Produtos - Exerccios - Pgina 63
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
9) Deu uma exception! A informao mais importante dela est no nal da Stacktrace:
...Caused by: org.springframework.beans.factory
.NoSuchBeanDefinitionException:No unique bean of type
[br.com.caelum.goodbuy.dao.ProdutoDao] is defined:Unsatisfied dependency of type
[class br.com.caelum.goodbuy.dao.ProdutoDao]:expected at least 1 matching bean
at org.springframework.beans.factory.support....
Ou seja, o Spring -- que usado peloVRaptor para gerenciar dependncias--no conhece o ProdutoDao.Precisamos indicar para o VRaptor que ele tem que registrar o ProdutoDao no Spring, com a anotao@Component.
10) Anote a classe ProdutoDao com @Component, para indicar que essa classe uma dependncia e pode serinstanciada pelo VRaptor sempre que necessrio.
package br.com.caelum.goodbuy.dao;
// import'simport br.com.caelum.vraptor.ioc.Component;
@Componentpublic class ProdutoDao {
//...}
11) Se acessarmos de novo a URI que executa o mtodo lista: http://localhost:8080/goodbuy/produtos/lista ve-remos a listagem de produtos:
Captulo 8 - Criando o Controlador de Produtos - Exerccios - Pgina 64
-
Material do Treinamento Desenv. gil para Web 2.0 com VRaptor, Hibernate e AJAX
12) Abra o arquivo header.jspf e procure a div com id="menu". Adicione um link ao menu, para acessar alistagem de produtos:
Lista Produtos
8.5 Cadastrando um produto
Para cadastrar um produto, bastar passarmos esse produto para o mtodo salva da classe ProdutoDao. Va-mos criar ento um mtodo no ProdutoController para adicionar produtos:
1 package br.com.caelum.goodbuy.controller;2
3 // import's4
5 @Resource6 public class ProdutosController {7
8 public void adiciona(Produto produto) {9 ProdutoDao dao = new ProdutoDao();10 dao.salva(produto);11 }12
13 }
Captulo 8 - Criando o Controlador de Produtos - Cadastrando um produ