176
FJ-28 Desenvolvimento Ágil para a Web 2.0 com VRaptor, Hibernate e AJAX

Caelum Java Web Vraptor Hibernate Ajax Fj28 121217183631 Phpapp01

Embed Size (px)

Citation preview

  • 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