Criando um Aplicativo para a web com Java EE 7 Criando um Aplicativo para a web com Java EE 7 http://profissionaisjava.com Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 2 Criando um Aplicativo para a web com Java EE 7 INDICE Introdução............................................................................................................................................4 MÓDULO 1 - Instalando e Configurando o Java no Windows .............................................................5 Realizando o download e instalando o Java no Windows...............................................................5 Configurando as variáveis de ambiente do Java............................................................................10 Configurando a variável JAVA_HOME........................................................................................11 Configurando a variável CLASSPATH..........................................................................................14 Testando o processo de configuração das variáveis de ambiente ............................................15 MÓDULO 2 - Criando e Configurando Um Ambiente de Desenvolvimento Web Com Java .............17 Criando, entendo e executando o ambiente de desenvolvimento ...............................................17 Criando uma aplicação Java para Web com Maven ......................................................................23 Componentes da estrutura de uma aplicação Java para web.......................................................27 Configurando o projeto para utilizar JSF.......................................................................................30 Adicionando dependências do JSF no projeto Java para web.......................................................33 MÓDULO 3 - Fazendo Com Que o Mundo Orientado a Objetos se Comunique com o Mundo Relacional - Banco de Dados..............................................................................................................34 Criando a base de dados................................................................................................................38 Adicionando as Dependências do Hibernate e do PostgresSQL....................................................41 Criando o arquivo hibernate.cfg.xml .............................................................................................43 Criando a Classe Livros Para Persitência de Dados........................................................................46 Criando o DAO da aplicação...........................................................................................................52 MÓDULO IV - Criado Uma Aplicação Simples de CRUD com JAVA Web ...........................................57 Managed Beans..............................................................................................................................57 Arquivos de Configuração faces-config.xml e web.xml .................................................................59 Páginas web do projeto .................................................................................................................60 Instalando o Tomcat e Executando a Aplicação ............................................................................64 CONCLUINDO .....................................................................................................................................69 Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 3 Introdução Este ebook tem o propósito de trazer, de forma resumida, os principais componentes que norteiam a construção de um aplicativo java para web. O primeiro módulo traz o processo de instalação, configuração e teste de uma pequena aplicação em java. No segundo módulo, vamos configurar o ambiente para o desenvolvimento web com java. Instalaremos uma ferramenta (IDE) de geração e manipulação de código, criaremos e entenderemos a estrutura de uma aplicação web para java, etc. No terceiro módulo começaremos a trabalhar com base de dados em java. Para isso instalaremos um banco de dados relacional e realizaremos o processo de mapeamento objeto relacional, o qual une o mundo relacional (tabelas) com o mundo orientado a objetos (classes). No quarto módulo, realizaremos o começo de nossa aplicação web, com a tecnologia de desenvolvimento em java conhecida como Java Server Faces (JSF) . Por fim, realizaremos uma introdução a biblioteca Primefaces, que tem a função de expandir as funcionalidades do JSF, adicionando vários recursos visuais a aplicação, bem como a utilização de Ajax e instalaremos um servidor web para testar nossa aplicação java web. Por fim, teremos uma aplicação web simples montada, utilizando recursos de crud básico, como consultas, inserções, alterações e exclusões. Bons estudos. Criando um Aplicativo para a web com Java EE 7 MÓDULO 1 - Instalando e Configurando o Java no Windows Realizando o download e instalando o Java no Windows Caso você não tenha a JDK/JRE instalado em seu computador é necessário que faça o download e instalação do mesmo. Para isso é necessário ir até o site da oracle no seguinte endereço: http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads1880260.html?ssSourceSiteId=otnpt Iremos trabalhar com o JDK 7, o qual já vem com JRE presente em seu pacote de instalação Figura 1 - Relação de Pacotes de Instalação da JDK do Java Foquei no ambiente Windows para download e instalação do Java, pois é o sistema operacional que estou utilizando neste computador onde estou criando este ebook. Caso você possua outro sistema operacional como Linux ou MacOS, o processo de instalação é feito de forma diferenciada. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 5 Criando um Aplicativo para a web com Java EE 7 Posteriormente, no blog http://profissionaisjava.com, farei uma postagem especifica para a instalação do Java nos sistemas operacionais citados anteriormente e mandarei por e-mail o link dos posts. Então, vou manter o foco de instalação e configuração do Java no ambiente Windows. Voltando a figura 1, escolhi a versão de x64, para windows 64 bits, que faz referência ao arquivo jdk-7u71-windows-x64.exe. Caso seu sistema operacional seja de 32 bits, escolha a versão referente a x86, ou seja, para plataformas de 32 bits. Clique sobre o arquivo citado anteriormente e você poderá ser levado ao mirror para baixar o arquivo ou o processo de download será feito de forma automática. Após concluir o processo de download, vá até o arquivo e execute-o dando um duplo clique sobre o mesmo, para que o processo de instalação seja iniciado. A seguinte tela poderá ser exibida: Figura 2 - Tela de Controle de Conta de Usuário do Windows Neste passo, o UAC (Controle de Contas de Usuário), poderá pedir a você que dê permissões ao aplicativo de instalação do JDK para que possa alterar as configurações no sistema. Clique sobre o botão Sim. Após, você será remetido para primeira tela de instalação do JDK. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 6 Criando um Aplicativo para a web com Java EE 7 Figura 3 - Tela de Bem Vindo do Programação de Instalação do JDK do Java Clique sobre o botão Next para ser remetido para a próxima tela. Figura 4 - Tela que Demonstra as Ferramentas do JDK 7 Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 7 Criando um Aplicativo para a web com Java EE 7 Aqui estão os pacotes de ferramentas que fazem parte do Kit de Desenvolvimento do Java 7. Não modifique nada. Todos serão instalados em nosso computador conforme os padrões de instalação já definidos no instalador. Clique sobre o botão Next para continuar. O instalador processará alguns dados e logo mostrará o path (caminho) aonde a JRE será instalada. Observe: Figura 5 - Instalador do JDK exibindo o Path de Instalação da JRE Clique sobre o botão Next para continuar e para que o processo de instalação dos arquivos seja executado e posteriormente finalizado conforme mostra a figura a seguir: Figura 6 - Processo de Instalação em Processamento e Conclusão Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 8 Criando um Aplicativo para a web com Java EE 7 Clique sobre o botão Close para finalizar o processo de instalação. Neste ponto, já estamos com o JDK e a JRE instalados em nosso computador. Você pode observar isso, indo até C:\Program Files\Java. Figura 7 - Pastas criadas pelo Instalador do JDK Para testar se o processo de instalação ocorreu de forma correta, basta abrir janela de comando (prompt de comando) do Windows e digitar a seguinte instrução: java -version Caso o processo de instalação tenha sido feito de forma correta, a versão do java será exposta, conforme demonstra a figura a seguir: Figura 8 - Prompt de Comando - Visualizando a Versã77o Instalada do Java Partindo do pressuposto que tudo está correto até aqui, nosso próximo passo é configurar as variáveis de ambiente do Java. Isso será visto a seguir. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 9 Criando um Aplicativo para a web com Java EE 7 Configurando as variáveis de ambiente do Java O propósito de configurar as variáveis de ambiente do Java é para garantir que o acesso as pastas de instalação, tanto do JDK, como do JRE, estejam acessíveis a outros programas que necessitem do java para sua execução. Embora todo o processo de instalação no ambiente Windows ocorra via assistentes (wizards) e o JDK e a JRE estejam disponíveis na lista de programas em nosso computador, existem programas Java, como o Tomcat, por exemplo, que ignora tal processo de instalação e simplesmente procura a instalação do Java através de variáveis de ambiente. Variáveis de ambiente nada mais são que apontadores, identificados através de aliases (apelidos), que indicam ou dão acesso a determinadas funcionalidades/aplicativos instalados em nosso computador. Uma variável de ambiente muito conhecida e padrão no ambiente Windows é o Path, a qual indica, monta, informa ao sistema operacional, quais aplicativos deverão estar disponíveis em qualquer "lugar" aonde estejamos em nosso computador. No caso para o JDK/JRE iremos fazer a configuração de duas variáveis: 1. JAVA_HOME: indica para o sistema operacional e aplicativos que necessitam do Java para execução aonde está o JRE ou JDK instalado. Neste caso em especifico, apontaremos para a pasta do JDK. Observe: Figura 9 - Pasta do JDK 1.7 Utilizada Como Caminho Para a Variável JAVA_HOME 2. CLASSPATH: responsável por indicar o caminho das bibliotecas (jars) que serão utilizadas em nossos projetos. Podemos indicar algumas de inicio e, com o tempo, conforme exista necessidade, podemos ir adicionado. Para iniciar, geralmente apontamos para alguns jars, que estão presentes na pasta lib do JRE. Observe: Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 1 Criando um Aplicativo para a web com Java EE 7 Figura 10 - Pasta Lib do JRE e suas bibliotecas (jars) Configurando a variável JAVA_HOME Para começar, vamos configurar a variável JAVA_HOME. Para isso, vá até o Painel de Controle, clique Sistema e Segurança, após em Sistema e por último em Configurações avançadas do sistema. A seguinte caixa de dialogo será exposta: Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 1 Criando um Aplicativo para a web com Java EE 7 Figura 11 - Caixa de Diálogo Propriedades do Sistema Nesta caixa de diálogo, podemos realizar varias configurações referentes ao nosso sistema operacional. O que nos interessa aqui, é focar no que é relacionado as variáveis de ambiente. Então clique sobre o botão Variáveis de Ambiente, para que uma nova caixa de diálogo seja exposta. Figura 12 - Caixa de Diálogo Para Criar e Editar as Variáveis de Ambiente A caixa de diálogo Variáveis de ambiente é exposta. Aqui realizaremos a configuração das variáveis de ambiente do Java citadas anteriormente mas, neste momento, gostaria de salientar Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 1 Criando um Aplicativo para a web com Java EE 7 um grande detalhe, ou seja, observe que esta caixa de diálogo possui duas áreas de configuração: Variáveis de ambiente para o usuário XXX (Jean - eu no caso) e Variáveis do sistema. Ignore totalmente o que está relacionado as variáveis de usuário pois, o que for configurado aqui, servem apenas para o usuário "logado". Por exemplo, neste caso o usuário Jean está logado no computador. No momento que o usuário João acessar o computador, as variáveis configuradas anteriormente não estarão configuradas para ele pois. Então, foque no que é relacionado as variáveis de sistema, ou seja, o que você configurar, criar aqui, estará disponível para qualquer usuário. O primeiro passo é criar a variável JAVA_HOME e configura-la. Para isso clique no botão Novo, no grupo Variáveis do sistema. Entre com os dados conforme exibido na figura a seguir: Figura 13 - Criando e Configurando a Variável JAVA_HOME Em Nome da variável, digite JAVA_HOME em letras MAIÚSCULAS. Em Valor da variável, entre com o path (caminho) de instalação do JDK instalado em seu computador. Para finalizar, clique sobre o botão OK. A variável JAVA_HOME será adiciona a lista de variáveis do sistema mas, para finalizar o procedimento de criação e configuração, devemos disponibiliza-la para todo o sistema operacional. Para isso, o Windows possui a variável Path, que mantém adicionada a ela as demais variáveis de sistema criadas, bem como caminhos (configurações de folders/pastas) especificados de forma manual, sem ter outra variável de ambiente criada. Procure na lista de variáveis de sistema pela variável Path e clique sobre o botão Editar. A seguinte caixa de diálogo será exibida: Figura 14- Configurando a Variável de Sistema Path Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 1 Criando um Aplicativo para a web com Java EE 7 Em Nome da variável NÃO FAÇA NADA. Em Valor da variável, vá até o final do conteúdo da caixa e digite: ;%JAVA_HOME%\bin. Clique sobre o botão OK para concluir. Pronto. A variável JAVA_HOME está configurada. O valor digitado ;%JAVA_HOME%\bin, será explicado logo a seguir. Configurando a variável CLASSPATH Poderíamos deixar para configurar esta variável posteriormente, visto que a inclusão de bibliotecas Java (.jars) em nível de sistema serve apenas para quando determinado programa, que precisa do Java e consequentemente de tal biblioteca, verifique se a mesma está disponível (configurada) para acesso. Mas, vamos realizar de forma completa todo o processo de configuração de variáveis de ambiente para o Java. Da mesma forma que você criou e configurou a variável JAVA_HOME anteriormente, faça o mesmo procedimento para a variável CLASSPATH, conforme demonstra a figura: Figura 15 - Criando e Configurando a Variável CLASSPATH Em Nome da variável digite CLASSPATH. Em Valor da variável, o conteúdo não ficou totalmente visivel conforme demonstra a figura. Então, digite: .;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\jconsole.jar onde: • %JAVA_HOME% significa a mesma coisa que C:\Program Files\Java\jdk1.7.0_71, caminho configurado para a variável JAVA_HOME anteriormente. Os percentuais (%) são convenções para o sistema operacional Windows e devem OBRIGATORIAMENTE serem utilizados, pois indicam que o apontador se refere a uma variável já pré-configurada. • \lib corresponde a pasta lib presente abaixo de C:\Program Files\Java\jdk1.7.0_71. Logo, \bin (configurado no tópico anterior), também corresponde a um folder, o qual contém o compilador Java, conhecido como javac e que será visto logo a seguir. • tools.jar e jconsole.jar são bibliotecas java disponíveis no folder \lib. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 1 Criando um Aplicativo para a web com Java EE 7 Concluindo, juntando tudo o que descrito teríamos o seguinte: • C:\Program Files\Java\jdk1.7.0_71\lib\tools.jar. • C:\Program Files\Java\jdk1.7.0_71\lib\ jconsole.jar. Figura 16 - Path e Listagem de .Jars Configurados na Variável CLASSPATH Desta forma, as bibliotecas tools.jar e jconsole.jar estão disponíveis para qualquer aplicativo Java que precise delas. Devo salientar que a variável CLASSPATH é configurada conforme existe a necessidade de adicionar bibliotecas e deixa-las disponíveis para qualquer programa Java. O que foi configurado anteriormente é apenas um exemplo e serve apenas para salientar o processo de configuração. Testando o processo de configuração das variáveis de ambiente Gosto de testar tudo o que faço e nosso procedimento agora será verificar se nosso processo de configuração foi feito de forma correta. Para isso, abra a tela de de prompt de comando de comando do Windows e digite a seguinte instrução: javac Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 1 Criando um Aplicativo para a web com Java EE 7 Figura 17 - Testando o Processo de Configuração das Variáveis de Ambiente Isso correspondente ao compilador do Java, ou seja, javac é responsável por compilar um programa Java tornando-o com capacidade de execução em determinada plataforma de ambiente operacional sendo, neste caso, o Windows. Mas o objetivo aqui não é discutir a capacidade de compilação javac e sim testar o processo de configuração de variáveis de ambiente do Java. Então, caso você tenha as mesmas mensagens exibidas na figura acima, isso garante que o processo de configuração obteve sucesso. Mas porque garante? Garante pelo simples fato de que o compilador javac, não esta configurado de forma natural quando instalamos o JDK/JRE em nosso computador. Este compilador está apenas na pasta bin do JDK ou JRE e não esta disponível seu acesso de forma direta no processo de instalação convencional. Então, quando atribuímos a variável de sistema Path o valor ;%JAVA_HOME%\bin, estamos garantindo que tanto o compilador javac, assim como os demais utilitários que estão abaixo de \bin estejam disponíveis. Concluímos aqui o processo de configuração das variáveis de ambiente do Java. Nosso próximo passo é montar um ambiente de desenvolvimento para Java aonde, retornaremos, com certeza, a vários conceitos estudados até aqui. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 1 Criando um Aplicativo para a web com Java EE 7 MÓDULO 2 - Criando e Configurando Um Ambiente de Desenvolvimento Web Com Java Criando, entendo e executando o ambiente de desenvolvimento Para criar a aplicação Java Web deste ebook utilizaremos a ferramenta Eclipse. O Eclipse é caracterizado como uma IDE, ou seja, uma ferramenta que tem o propósito de auxiliar o desenvolvedor de software, aumentando sua produtividade na produção de suas aplicações. Ele não é utilizado apenas para desenvolvimento de software Java, mas também para outras linguagens como C++ e PHP. Vamos iniciar. Para realizar download do Eclipse IDE vá até site http://www.eclipse.org/. Vá até se sessão downloads, e escolha a versão Eclipse IDE for Java EE Developers. Figura 18 - Eclipse Configurado Para Desenvolvimento Web em Java Não esqueça de escolher a versão para 32 ou 64 bits de acordo com seu Windows. No meu caso em particular é versão de 64 bits. Você será direcionado para a sessão de mirrors para download. Escolha o primeiro link e salve o arquivo compactado em uma pasta de fácil acesso. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 1 Criando um Aplicativo para a web com Java EE 7 Figura 19 - Mirror Presente no Brasil Para Download do Eclipse Tenho por premissa salvar na área de trabalho para fins didáticos, mas você pode salvar no folder/pasta que quiser, desde que essa pasta tenha permissão de leitura e escrita. Após o término do download, descompacte o arquivo em uma pasta com o nome de Eclipse. Acesse a pasta e visualize seu conteúdo. Na pasta você um aplicativo “Executável” conforme mostra a figura a seguir: Figura 20 - Executável do Eclipse Dê um duplo clique sobre o ícone para executar o Eclipse IDE. Supondo que a JDK/JRE já esteja instalada e o processo de execução esteja correndo de forma correta, será exibida a tela de abertura da Eclipse IDE e após outra caixa de diálogo, referente ao workspace. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 1 Criando um Aplicativo para a web com Java EE 7 Figura 21 - Tela de Inicialização e Workspace Workspace nada mais é que um diretório padrão aonde as configurações do Eclipse e os projetos criados a partir dele serão salvos. Claro que você pode gravar seus projetos em outros folders/pastas, mas o Eclipse toma esse diretório padrão como base. Marque a opção Use this as the default and do not ask again. Isso garante que o Eclipse utilizará SEMPRE a pasta indicada no path do item Workspace e, consequentemente, essa caixa de diálogo não será mais exposta. Não citei anteriormente, mas estamos trabalhando com a versão Luna do Eclipse IDE, sendo está a mais atualizada até o momento que estou criando este artigo. Geralmente, os conceitos vistos aqui, servem tanto para as versões anteriores, como as que virão a ser criadas. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 1 Criando um Aplicativo para a web com Java EE 7 Após, seremos enviados para área de trabalho do Eclipse IDE e veremos a guia Welcome. Figura 22 - Eclipse em Execução Até este momento, realizamos o processo de download, instalação e execução do Eclipse. Agora vamos realizar um pequeno tour pela ferramenta. Feche a guia Welcome, pois ela está sobre toda a área de trabalho da ferramenta. A área de trabalho do Eclipse IDE será exposta com suas ferramentas. A figura a seguir demonstra essa área de trabalho com um pequeno comentário em cada região da tela. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 2 Criando um Aplicativo para a web com Java EE 7 Figura 23 - Área de Trabalho do Eclipse Onde: • Área de Gerenciamento de Projetos: responsável por gerenciar toda a estrutura de folders/pastas (conhecidos como packages em java) e os arquivos que estes contém. Observe que por padrão o Eclipse disponibiliza a Guia Project Explorer mas, saliento que existem outras, que gerenciam tais folders e arquivos de forma mais otimizada. Veremos isso em outros artigos. • Área Para Trabalho Com Arquivos: é neste local onde “abriremos” nossos arquivos fonte e os editaremos. • Área de Gerenciamento de Estrutura Interna de Arquivos: Quando estamos com um arquivo aberto e existe a necessidade de visualizar o seu conteúdo de forma mais resumida ou até mesmo acessar determinada parte deste arquivo de forma rápida, utilizamos a guia Outline. • Área de ferramentas Gerais: Esta área contém ferramentas que são utilizadas para fazer a instalação de servidores (Tomcat, Weblogic, JBoss, etc.), depuração de aplicações, visualização de erros e console de dados e assim por diante. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 2 Criando um Aplicativo para a web com Java EE 7 De forma prática, tudo o que foi descrito anteriormente é exibido na figura a seguir: Figura 24 - Eclipse em Ação Observe na guia Package Explorer nosso projeto com o nome de ProjetoTeste. Esse projeto possui uma classe java chamada Teste1.java, sendo que seu conteúdo é exibido no centro da área de trabalho da ferramenta. Na guia Outline, podemos visualizar, de forma resumida, a estrutura de métodos desta classe. Para acessar determinado método de forma rápida, basta dar clique sobre o método desejado. Para finalizar, como exemplo, gerei um erro java, de forma que possamos visualizar, na área de ferramentas gerais, na guia Problems, alguns “bugs” de codificação. O objetivo aqui era criar um ambiente de desenvolvimento e não estudar o Eclipse IDE de forma mais aprofundada, mas resolvi tocar em alguns tópicos que achei relevante. O projeto utilizado (ProjetoTeste) anteriormente como exemplo será descartado e criaremos no lugar dele outro projeto, com foco em uma aplicação Java para web. Isto será visto a seguir. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 2 Criando um Aplicativo para a web com Java EE 7 Criando uma aplicação Java para Web com Maven Quando me refiro ao ambiente de desenvolvimento, não me refiro apenas a ferramenta de criação e manipulação de códigos Java e sim, ao contexto da aplicação num todo. Neste ebook criaremos uma aplicação Java para Web simples do zero mas, mantendo o foco naquilo que realmente é importante, ou seja, entender toda a estrutura da aplicação e as ferramentas e utilitários que a rodeiam. Criaremos agora um projeto do tipo Maven Project. Vá até o menu File, New, Maven Project. Figura 25 - Criando um projeto do tipo Maven Project Poderíamos criar um projeto Java para Web de forma tradicional, ou seja, utilizando a opção Dynamic Web Project mas, desta forma, não teríamos o recurso avançado para gerenciamento de dependências proporcionado pelo Maven. Em Java, assim como em outras linguagens de programação, o grande calcanhar de Aquiles é quando se faz referência ao grande número de bibliotecas e componentes que fazem parte da aplicação. No momento de empacotar o software para coloca-lo, por exemplo, em produção, se isso for feito de forma manual, podemos realizar tal procedimento de forma incorreta, trazendo bibliotecas e componentes errados ou até mesmo faltando. Então, essa é a principal função do Maven, ou seja, gerenciar estes pacotes de componentes, para que no momento deste empacotamento do software nada dê errado. Não teríamos motivo algum para não utiliza-lo no projeto que será criado aqui. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 2 Criando um Aplicativo para a web com Java EE 7 Continuando, clique sobre a opção Maven Project, para que a seguinte caixa de diálogo seja exposta: Figura 26 - Definindo o arquétipo do projeto Maven Nesta caixa de dialogo, iniciamos o processo de configuração de nosso projeto Maven sendo que, possuímos duas opções, ou seja, com ou sem a utilização de arquétipos. Arquétipos são para o Maven arquivos em formato .XML que tem a função de definir a estrutura e consequentemente as dependências que determinado projeto Java necessita. Em nosso caso em especifico, não utilizaremos arquétipo algum, bastando selecionar a opção Create a simple project (skip archetype selection) e após clicar sobre o botão Next para ser remetido para a próxima caixa de diálogo. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 2 Criando um Aplicativo para a web com Java EE 7 Figura 27 - Configurando o projeto Maven Temos aqui: • Group Id: pode-se considerar este item como sendo aquele que determina o nome da empresa ou grupo ao qual o projeto pertence. • Artifact Id: corresponde ao nome do projeto. • Version: Versão do projeto que está sendo criada. • Packaging: define como nosso aplicativo deverá ser empacotado, ou seja, neste caso, o Maven saberá que nossa aplicação deverá ser do tipo Java Web, pois a opção war foi selecionada. Quando o projeto é criado no Eclipse, logo todo o formato e estrutura da aplicação é automaticamente criado. • Description: Uma descrição de nosso sistema. É opcional. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 2 Criando um Aplicativo para a web com Java EE 7 Entre com as informações conforme descrito na figura e para finalizar clique sobre o botão Finish para que o projeto seja criado no Eclipse. Figura 28 - Aplicação LivrariaWeb Criada e sua visualização na Guia Project Explorer Caso você não esteja visualizando a guia Project Explorer, é provável que você esteja com uma perspectiva que não seja JavaEE. Para resolver o problema, basta que você observe no canto superior direito, pelo menos este é o padrão da ferramenta, o botão Open Perspective. Clicando nele a caixa de diálogo Open Perspective será exposta, bastando que você selecione a perespectiva JavaEE e após clique sobre o botão OK. Figura 29 - Janela Open Perspective Pronto! Nosso projeto Java para Web está criado, sua estrutura está muito bem definida e gerenciada pelo Maven. Agora o próximo passo é entender os componentes que fazem parte desta aplicação. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 2 Criando um Aplicativo para a web com Java EE 7 Componentes da estrutura de uma aplicação Java para web Entender como é a estrutura de uma aplicação java para web é muito importante, pois desta forma, além de reconhecer e localizar os principais elementos (arquivos e folders), saberemos qual a função especifica de cada um dentro da aplicação. Para iniciar, vamos entender como funciona a estrutura de um projeto do tipo Dynamic Web Project. Observe a figura: Figura 30 - Estrutura de uma aplicação Java Web Tradicional Vou descrever aqui os itens principais que fazem para da estrutura exibida anteriormente. • ProjetoWebExemplo: corresponde ao nome do projeto Java. • Java Resources: permite/organiza o acesso a recursos da aplicação como códigos fontes (pasta src), bibliotecas gerais do projeto (Libraries) e assim por diante. • WebContent: folder que realmente organiza a estrutura de arquivos da aplicação web. Aqui colocaremos nossos formulários JSF, imagens da aplicação e assim por diante. • WEB-INF: mantém a pasta lib, responsável por gerenciar as bibliotecas (.jars) utilizados nesta aplicação. Também mantém arquivos com funções especificas dentro da aplicação. • Faces-config.xml: arquivo responsável por manter regras de navegação, definir escopo e declaração de managed beans, etc. A partir da versão 2.0 do JSF não é mais obrigatório. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 2 Criando um Aplicativo para a web com Java EE 7 • Web.xml: é conhecido como Deployment Descriptor da aplicação, ou seja, realiza as configurações gerais da aplicação, como declaração de servlets, gerenciamento de tempo de timeout, definir parâmetros de conexão a banco de dados, definir as páginas iniciais da aplicação e assim por diante. Toda essa estrutura estudada anteriormente ainda é valida quando se trata de um projeto criado a partir de um Maven Project com um packaging feito via war, ou seja, quando definimos no Maven que desejamos criar um projeto com este tipo de empacotamento, estamos dizendo para ele que o mesmo deve providenciar toda a estrutura de pastas/folders estudada anteriormente mas, agregando os recursos de gerenciamento de pacotes e deploy do Maven. Figura 31 - Estrutura de uma aplicação Java Web criada a partir do Maven Embora os itens estudados anteriormente não estejam aparecendo na estrutura exibida na imagem anterior, os mesmos serão criados conforme formos adicionando determinadas funcionalidades, como por exemplo, a utilização de JSF (Java Server Faces), mas isso será visto posteriormente. Outros serão substituídos, mas veremos isso com o tempo. O que nos interessa aqui é agregar conhecimento com base no que está sendo exposto na imagem acima. Temos aqui: • src/main/java: diretório responsável por armazenar os arquivos .java (código fonte) da aplicação. • src/main/resources: diretório que armazena determinados arquivos de configuração da aplicação. Estes arquivos devem ficar obrigatoriamente armazenados neste folder. São adicionados conforme vamos utilizando determinadas funcionalidades Java em nosso projeto. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 2 Criando um Aplicativo para a web com Java EE 7 • src/main/webapp: Pasta para conteúdo Web. Folder relativo a WebContent em um projeto do tipo Dynamic web project. • src/test/java: folder que contém arquivos para testes unitários. • src/test/resources: folder que contém arquivos de configuração para testes unitários. • pom.xml: é um arquivo conhecido como Project Object Model, que tem a função de conter a estrutura, as dependências e várias outras características de nosso projeto. Como exemplo, para utilizar o conjunto de funcionalidades do JSF, devemos declarar aqui as dependências necessárias para isso. Observe: Figura 32 - Estrutura do arquivo pom.xml Observa-se claramente as informações que inserimos em nosso projeto quando iniciamos o seu processo de criação. Também, na área em vermelho, nota-se a declaração de dependências do JSF. O Maven automaticamente fará o download das bibliotecas necessárias, observe: Figura 33 - Download da biblioteca realizado pelo Maven Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 2 Criando um Aplicativo para a web com Java EE 7 Note, na região em preto, que o Maven automaticamente fez o download para a máquina local do arquivo (biblioteca) jsf-impl-2.2.9.jar. Esse processo ocorre para todas as dependências declaradas no projeto. O objetivo aqui era entender as estruturas de pastas e arquivos presentes para um projeto Java web nos tipos Maven Project (packaging War) e Dynamic Web Project. Não iremos mais aprofundar o assunto. Nosso próximo objetivo é adicionar e configurar o projeto para ter a capacidade de trabalhar com JSF e isto será visto a seguir. Configurando o projeto para utilizar JSF Embora já tenhamos criado o projeto Java com o Maven, o mesmo está apenas configurado de forma estruturalmente correta. Não temos nele ainda nem um recurso que nos possibilite utilizar componentes e funcionalidades do JSF (Java Server Faces), que hoje é a base (especificação) de desenvolvimento para qualquer aplicativo Java para web. Para configurar a utilização de JSF, deve-se clicar com o botão contrário do mouse sobre o nome do projeto, neste caso livrariaweb. No meu de contexto, você deve clicar sobre a opção Properties para que a seguinte caixa de diálogo seja exposta: Figura 34 - Caixa de propriedades para o projeto livrariaweb Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 3 Criando um Aplicativo para a web com Java EE 7 Clique sobre a opção Project Facets e após selecione a opção JavaServer Faces e aponte para a versão 2.2 do JSF, que será a utilizada neste projeto. Note que a opção Further configuration avaliable está ativa na área em amarelo na figura. Clique sobre essa opção para que possamos realizar mais algumas configurações. Figura 35 - Caixa de diálogo Modify Faceted Project Em JSF, aponte para Disable Library Configuration. Aqui poderíamos adicionar manualmente as bibliotecas do JSF mas, deixaremos essa opção inibida e adicionaremos as dependências diretamente no arquivo pom.xml visto anteriormente. Observe que na opção JSF Configuration File, existe um apontamento para a pasta WEB-INF, que antes não aparecia na estrutura do projeto web criado com o Maven anteriormente. Está pasta será criada agora e dentro dela será criado o arquivo faces-config.xml, também visto anteriormente. Em JSF Servlet Name e JSF Servlet Class Name, temos o nome e a classe do Servlet que será o responsável por interpretar nossas páginas JSF. Isso será visto posteriormente e o conteúdo Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 3 Criando um Aplicativo para a web com Java EE 7 destas opções será adicionado ao arquivo web.xml, que será criado automaticamente a partir de agora. Para finalizar, em URL Mapping Patterns, definimos a extensão que deverá ser utilizada em nossas páginas JSF. Em outras palavras, sempre que tivermos uma páginas JSF com este tipo de extensão, a mesma será interpretada pelo Servlet citado anteriormente. Clique sobre o botão OK e observe que o folder WEB-INF e os arquivos citados anteriormente foram automaticamente criados. Figura 36 - Folder WEB-INF e arquivos faces-config.xml e web.xml criados Observe o conteúdo dos arquivos faces-config e web.xml. Figura 37 - Conteúdo do arquivo faces-config.xml Figura 38 - Conteúdo do arquivo web.xml Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 3 Criando um Aplicativo para a web com Java EE 7 Agora nosso projeto está configurado para utilizar JSF. O próximo passo é adicionar as dependências (bibliotecas - .jars) necessárias. Veremos isso a seguir. Adicionando dependências do JSF no projeto Java para web Abra o arquivo pom.xml e adicione as seguintes dependências na seção <dependencies>: <dependency> <groupId>com.sun.faces</groupId> <artifactId>jsf-api</artifactId> <version>2.1.7</version> </dependency> <dependency> <groupId>com.sun.faces</groupId> <artifactId>jsf-impl</artifactId> <version>2.1.7</version> </dependency> <dependency> <groupId>org.primefaces</groupId> <artifactId>primefaces</artifactId> <version>5.0</version> </dependency> As duas primeiras dependências se referem explicitamente as bibliotecas do JSF, em sua versão 2.1.7. A terceira dependência faz referência ao framework primefaces, que é uma extensão super melhorada do JSF e hoje é um dos frameworks top de mercado para o desenvolvimento Java para web. Você poderá obter mais informações em http://www.primefaces.org, nas seções de documentação e showcase. Não é objetivo deste ebook realizar o aprofundamento em JSF e/ou PrimeFaces, mas é importante cita-los aqui, visto que os utilizaremos, de forma super básica, no exemplo de crud que será visto posteriormente. Essas são as configurações básicas necessárias para implementar a utilização de componentes JSF em nosso projeto. O próximo passo é fazer com que os mundos relacional (banco de dados) e orientado a objetos (Java/classes) se comuniquem. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 3 Criando um Aplicativo para a web com Java EE 7 MÓDULO 3 - Fazendo Com Que o Mundo Orientado a Objetos se Comunique com o Mundo Relacional - Banco de Dados Download e Instalação do Banco de Dados Utilizaremos o banco de dados PostgreSQL como repositório de dados de nosso projeto. O primeiro passo é realizar o download deste banco de dados na seguinte url: http://www.postgresql.org/download/ Figura 39 - Realizando o download do Banco de Dados Postgres Salientei na imagem anterior a questão de ser a versão do Postgres para Windows, pois é neste sistema operacional que este projeto está sendo criado. Caso você esteja utilizando outro sistema operacional, terá que clicar no link correspondente a sua versão. Clique sobre o link para a versão em Windows. Você será remetido para página de instaladores. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 3 Criando um Aplicativo para a web com Java EE 7 Figura 40 - Link de download do Windows Installer do PostgreSQL Clique sobre o link de Download para que possamos escolher qual versão do Postgres iremos realizar o download para posterior instalação. Figura 41 - Selecionado a versão do instalador do PostgreSQL conforme o sistema operacional Como estou utilizando um sistema operacional de 64 bits, realizei o download referente a versão Win x86-64, conforme está salientado em vermelho na figura anterior. Caso você possua um sistema operacional de 32 bits, deverá baixar o instalador referente a versão Win x86-32. Após o término do processo de download, vá até o instalador e execute-o. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 3 Criando um Aplicativo para a web com Java EE 7 Faça o procedimento de instalação no formato Next to Next, mantendo as configurações conforme sugeridas pelo instalador mas, quando chegar na tela referente a senha do super usuário postgres, defina a seguinte senha para ele: postgres. Tanto senha, como nome de usuário serão os mesmos mas, você poderá definir outra senha a seu gosto, mas você terá que mudá-la posteriormente em seus códigos java caso faça isso, pois os exemplos vistos de conexão a banco de dados serão com o usuário e senha descritos anteriormente. Figura 42 - Definindo o password para o usuário Postgres Clique no botão Next para continuar. Na próxima tela, você terá que definir a porta de acesso. Mantenha o valor indicado (porta 5432) pelo instalador. e clique sobre o botão Next para continuar. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 3 Criando um Aplicativo para a web com Java EE 7 Figura 43 - Definindo a porta de acesso ao banco de dados PostgreSQL A partir da próxima tela, continue no método Next to Next até que o processo de instalação inicie. Quando o processo de instalação estiver concluido, você será remetido a seguinte tela: Figura 44 - Finalizando a instalação do Banco de Dados Desmarque a opção referente ao Stack Builder e clique sobre o botão Finish. Neste ponto, concluímos a instalação do banco de dados Postgres em nosso computador. O próximo passo é acessar este banco de dados através de um utilitário vindo no pacote do instalador e criar uma base de dados (database) que será utilizada em nosso projeto. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 3 Criando um Aplicativo para a web com Java EE 7 Criando a base de dados Para gerenciar as bases de dados do Postgre, foi instalado em nosso computador o utilitário PgAdmin 3. Acesse este utilitário para ter acesso as bases de dados. Observe: Figura 45 - Executando o utilitário PgAdmin III Observe que foi instalado a versão 9.4 do Postgre, no servidor localhost (máquina local), na porta 5432. Também note o servidor está com um X vermelho. Isso ocorre pois não estamos logados no banco de dados ainda. Para isso, clique sobre o nome do servidor para que a tela de logon apareça. Insira a senha postgres, conforme definimos anteriormente e clique sobre o botão OK, para efetuar o processo de logon. Caso tudo esteja correto, o X vermelho sumirá a estrutura de árvores de objetos abaixo do servidor será exposta. Observe: Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 3 Criando um Aplicativo para a web com Java EE 7 Figura 46 - Treeview exibindo os databases existentes O próximo passo é criar o database para ser utilizado em nosso projeto. Para isso, clique com botão contrário do mouse sobre Databases e selecione a opção New Database. Figura 47 - Criando o database da aplicação Você será remetido para a caixa de diálogo New Database. Defina o nome do database como livrariawebdb e clique sobre o botão OK para concluir. Não faremos configuração alguma a mais neste database. Figura 48 - Definindo o nome e criando o database da aplicação Para finalizar, após a criação do deste database devemos criar uma sequence, que será utilizada por gerar as chaves primárias de cada registro cadastrado na tabela de livros. Para isso, na janela do utilitário pgAdmin III, na barra de ferramentas, clique sobre o botão Execute arbitrary SQL queries, para que a seguinte caixa de diálogo seja exposta. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 3 Criando um Aplicativo para a web com Java EE 7 Figura 49 - Criando a sequence hibernate_sequence_livros Digite no editor a seqüência de comandos conforme está descrito na figura acima e clique sobre o botão Execute query. Após, na guia Messages, observe se a mensagem Query returned successfully foi exibida, mostrando que tudo foi feito de forma correta. Na treeview Server Groups do utilitário pgAdmin III, você poderá visualizar a sequence criada. Figura 50 - Visualizando a sequence Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 4 Criando um Aplicativo para a web com Java EE 7 Note também, que em Tables, não existe nenhuma tabela criada. Isso será feito posteriormente. Com relação a instalação de banco de dados e criação de database e sequence o que vimos até aqui é o suficiente. O próximo passo é configurarmos nosso projeto para utilizar JPA, através do framework Hibernate e com isso, poderemos realizar mapeamento objeto-relacional entre tabelas e classes. Veremos isso a seguir. Adicionando as Dependências do Hibernate e do PostgresSQL Para adicionar as dependências do Hibernate, devemos ir até a url http://hibernate.org/orm/downloads/, no item Maven Repository e copiar os itens selecionados em vermelho na figura a seguir: Figura 51 - Maven e a lista de dependencias para a utilização do hibernate Após copiar tais itens, os mesmos devem ser colados no arquivo pom.xml que, lembrando, é o arquivo utilizado pelo Maven para gerenciar as dependências do projeto. Para finalizar a adição de dependências ao projeto, vamos agora adicionar as que são referentes ao banco de dados de Postgres. Para isso, vá até a seguinte url: http://mvnrepository.com/artifact/postgresql/postgresql/9.1-901.jdbc4. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 4 Criando um Aplicativo para a web com Java EE 7 Figura 52 - Maven e a lista de dependencias para a utilização do Postgres Do mesmo jeito que você fez para as dependências do hibernate, copie o que está em amarelo na figura acima e cole-o na área de dependências do arquivo pom.xml. Automaticamente todas as dependências serão baixadas. Seu arquivo pom.xml e a relação de dependências deverão ficar como na figura a seguir: Figura 53 - Lista de bibliotecas baixadas pelo Maven Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 4 Criando um Aplicativo para a web com Java EE 7 Criando o arquivo hibernate.cfg.xml Este arquivo é responsável por conter determinadas configurações que são utilizadas para configurar o Hibernate em uma aplicação. A partir deste ponto devemos começar a organizar nosso projeto em packages, que nada mais são que pastas. Para isso, criaremos um package (folder), com o nome de util, dentro do folder livrariaweb. Clique com o botão contrário do mouse sobre livrariaweb. No menu de contexto, selecione as opções New, Package. A seguinte caixa de diálogo será exposta: Figura 54 - Criando o package livrariaweb.util Em name, o folder livraweb já virá preenchido. Basta que você digite .util e por fim clique sobre o botão Finish para que o novo folder seja criado. A partir da criação deste folder (util), criaremos o arquivo de configurações para o hibernate citado anteriormente. Então, clique sobre o package livrariaweb.util com o botão contrário do mouse e selecione as opções: New, Other. Na tela do assistente (wizard), selecione XML File e clique sobre o botão Next. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 4 Criando um Aplicativo para a web com Java EE 7 Figura 55 - Criando um arquivo do topo XML File Na próxima caixa de diálogo digite hibernate.cfg.xml para o nome do arquivo e após sobre o botão Finish. Figura 56 - Criando o arquivo hibernate.cfg.xml Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 4 Criando um Aplicativo para a web com Java EE 7 O arquivo será criado automaticamente dentro do package livrariaweb.util. Abra o arquivo, adicione o seguinte conteúdo a ele e após salve-o. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property> <property name="hibernate.connection.driver_class">org.postgresql.Driver</property> <property name="hibernate.connection.url"> jdbc:postgresql://127.0.0.1:5432/livrariawebdb?autoReconnect=true </property> <property name="hibernate.connection.username">postgres</property> <property name="hibernate.connection.password">postgres</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <property name="connection.pool_size">5</property> <!-- Mapeamento da Classes Beans --> <mapping class="livrariaweb.bean.Livro" /> </session-factory> </hibernate-configuration> Note que o conteúdo deste arquivo configura o Hibernate para utilizar o banco de dados Postgres com base em tudo o que fizemos anteriormente. O próximo passo é criarmos uma classe utilitária, que será utilizada pelo Hibernate, para que ele possa ler as configurações necessárias para se "conectar" com a base de dados. Essa classe utilitária também será no package livrariaweb.util. Então, selecione o package citado e clique sobre ele com o botão contrário do mouse. Após, selecione as opções New, Class. Na caixa de diálogo New Java Class, no item name digite HibernateUtil.java, que será o nome da classe. Para finalizar, clique sobre o botão Finish para que a classe seja criada automaticamente. Abra a classe HibernateUtil.java e adicione a ela o seguinte conteúdo: package livrariaweb.util; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.SessionFactory; @SuppressWarnings("deprecation") public class HibernateUtil { private static final SessionFactory sessionFactory; static { try { sessionFactory = new AnnotationConfiguration(). configure("livrariaweb/util/hibernate.cfg.xml") .buildSessionFactory(); } catch (Throwable ex) { throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } } Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 4 Criando um Aplicativo para a web com Java EE 7 Note que nesta classe estamos criando uma sessionFactory, ou seja, ela conterá todas as informações necessárias para posteriormente criarmos uma conexão com a base de dados. Como estas configurações não estão presentes de forma direta nesta factory, as mesmas foram descritas no arquivo hibernate.cfg.xml, que é lido automaticamente quando esta linha é executada: sessionFactory = new AnnotationConfiguration(). configure("livrariaweb/util/hibernate.cfg.xml") Se tudo foi feito de forma correta até, sua estrutura de folder e files no Project Explorer, para este package, deve estar desta forma: Figura 57 - Package livrariaweb.util e seus arquivos Criando a Classe Livros Para Persitência de Dados Utilizaremos neste ebook apenas uma classe, que será responsável por representar no mundo orientado a objetos (no Java) a tabela de livros que realmente conterá os dados referentes ao nosso crud de livros. Não farei grandes relacionamentos ou algo do tipo. O negócio é ter uma classe que represente uma entidade (tabela) de um banco de dados e, a partir disso, possamos realizar operações básicas de crud, como inclusão, exclusão e alteração de registros. Mas antes de criar a classe Livro, vamos criar outro package com o nome de bean, dentro do folder livrariaweb. Faça isso da mesma forma feita anteriormente para o package livrariaweb.util. Depois de criado o package, iremos criar dentro dele a classe Livro. Para isso, clique com o botão contrário do mouse sobre livrariaweb.bean e após clique sobre as opções New, Class. Em name, coloque o nome da classe de Livro e após clique sobre o botão Finish. A classe será automaticamente aberta do Eclipse e pode ser visualizada na estrutura de arquivos do Project Explorer. Figura 58 - Classe Livros Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 4 Criando um Aplicativo para a web com Java EE 7 O próximo passo é inserirmos os atributos na classe, que nada mais são que a representação dos campos que serão gerados na tabela Livro no banco de dados Postgres. Esses atributos e a própria classe virão acompanhados de anotações, que nada mais são que informações que identificam e permitem manter a relação entre a classe no java e tabela no banco de dados. O arquivo da classe Livro já deve estar aberto em seu Eclipse. O mesmo deverá ficar como mostra a figura a seguir: Figura 59 - Classe Livro e seus atributos A anotação @Entity indica que esta classe representa uma tabela do banco de dados. Neste caso em especifico, ela representará a tabela Livros. A outra anotação, @SequenceGenerator indica a sequence que criamos anteriormente e será utilizada para gerar as chaves primárias, para cada registro, inserido na tabela Livros no banco de dados. As anotações @Id e @GeneratedValue indicam que o atributo idLivro, que representa a coluna id_livro no banco de dados, servirá para representar a chave primária de cada registro /objeto. Para gerar os gets e sets destes atributos, basta clicar com o botão contrário do mouse na área branca da classe Livro e no menu de contexto, selecionar as opções Source, Generatte Getters and Setters. Na caixa de diálogo que aparecerá, basta selecionar todos os itens que são demonstrados na figura a seguir: Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 4 Criando um Aplicativo para a web com Java EE 7 Figura 60 - Gerando os getters e setters da classe Livro Após, clique sobre o botão OK. Todos os getters e setters serão gerados automaticamente. Para finalizar, vamos geras os métodos hashCode e Equals. Para isso, clique com o botão contrário do mouse e no menu no de contexto, selecione as opções Source, Generate HashCode() and Equals(). Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 4 Criando um Aplicativo para a web com Java EE 7 Figura 61 - Gerando hashCode() and equals() classe Livro Mantenha todas os atributos marcados e clique sobre o botão OK. Os métodos serão gerados automaticamente. Para finalizar, vamos criar uma classe que será responsável por “testar” o que fizemos até aqui. Antes, devo lembrar, que quando criamos a sequence, também demonstrei que a tabela de Livros não existia no banco de dados. Então, a classe que criaremos agora, executará um método java, que “lerá” as informações presentes no arquivo hibernate.cfg.xml e fará, através de nossa classe, que a tabela Livros seja criada automaticamente, pois em nosso projeto, possuímos a Classe Livro, que está anotada como uma entidade. Vamos lá. Clique com o botão contrário do mouse sobre Java Resources. Através das opções New, Class, crie uma classe com o nome de GeraTabela. Preencha a classe com as codificações conforme são exibidas a seguir: Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 4 Criando um Aplicativo para a web com Java EE 7 package livrariaweb; import livrariaweb.bean.Livro; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.tool.hbm2ddl.SchemaExport; public class GeraTabela { @SuppressWarnings("deprecation") public static void main(String[] args) { AnnotationConfiguration conf = new AnnotationConfiguration() .configure("util/hibernate.cfg.xml"); conf.addAnnotatedClass(Livro.class); SchemaExport sE = new SchemaExport(conf); sE.create(true, true); System.out.println(" A Tabela " + Livro.class.getName() + " foi criada."); } } Salve as alterações e agora vamos executar a classe. Para isso, vá até o menu Run, após Run as e por último clique sobre Java Application. Se tudo estiver correto, o processo de execução começara automaticamente e as informações de execução serão exibidas na guia Console, observe: Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 5 Criando um Aplicativo para a web com Java EE 7 Figura 62 - Tela de console do Eclipse Depois que o processo de execução for completado, poderemos ver a tabela criada no banco de dados, observe: Figura 63 - Exibindo a criação da tabela de Livros no utilitário PgAdmin III Tanto a tabela, quanto os campos, seguem os nomes definidos em @Table(name=””) e @Colum(name=””). Uma classe Java deste tipo, também é conhecida entre os desenvolvedores como sendo um bean (POJOS), ou seja, uma classe que possui algumas características próprias, como um construtor vazio, atributos que possuem getters e setters associados a eles, são serializáveis e assim por diante. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 5 Criando um Aplicativo para a web com Java EE 7 Neste ponto, já estamos unido ambos os mundos relacional e orientado a objetos. O próximo é passo é criamos uma interface e uma classe utilitária que serão responsáveis por permitir que os métodos de CRUD de nosso projeto sejam executados. Isso será visto a seguir. Criando o DAO da aplicação DAO (Data Access Object), nada mais é que um padrão (design pattern) que tem a função de abstrair operações relativas a banco de dados. É claro, que este pattern é representado no Java por um objeto, que implementa uma interface e, através dela, é que faremos acesso a estes métodos de CRUD. Vamos criar outro package a partir de livrariaweb com o nome de dao. Faça todo o procedimento para criação de packages visto nos passos anteriores. Agora, selecione o package livrariaweb.dao com o botão contrário do mouse e no menu de contexto selecione as opções New, Other. Na caixa de dialogo do wizard, selecione a opção interface e clique sobre o botão Next. Figura 64 - Criando uma Interface Na próxima tela, em Name digite LivroDao para o nome da interface e clique sobre o botão Finish. O arquivo será criado e aberto automaticamente. Adicione a ele o seguinte conteúdo: Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 5 Criando um Aplicativo para a web com Java EE 7 package livrariaweb.dao; import java.util.List; import livrariaweb.bean.Livro; public interface LivroDao { public boolean insereLivro(Livro livro); public boolean alteraLivro(Livro livro); public boolean excluiLivro(Livro livro); public Livro consultarLivro(Livro livro); public List<Livro> listarLivros(); } • • • • • Onde: insereLivro: insere um livro na tabela; alteraLivro: altera dados de um livro pré-cadastrado; excluiLivro: exclui um livro cadastrado; consultarLivro: busca dados de apenas um livro em especfico; listarLivros: traz todos os livros cadastrados. Agora iremos criar a classe que realizará a implementação destes métodos, visto que a interface apenas garante o processo de assinatura e encapsulamento. Agora, selecione o package livrariaweb.dao com o botão contrário do mouse e no menu de contexto selecione as opções New, Class. Em Name digite LivroDaoImpl para o nome da classe e clique sobre o botão Finish. Adicione o seguinte conteúdo a classe: package livrariaweb.dao; import java.util.List; import livrariaweb.bean.Livro; import livrariaweb.util.HibernateUtil; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; public class LivroDaoImpl implements LivroDao { private Session session = null; private Transaction transaction = null; public boolean insereLivro(Livro livro) { boolean retorno = false; try { session = HibernateUtil.getSessionFactory().openSession(); transaction = session.beginTransaction(); System.out.print("DAO - autor: " + livro.getAutor()); Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 5 Criando um Aplicativo para a web com Java EE 7 session.persist(livro); transaction.commit(); retorno = true; } catch (HibernateException e) { transaction.rollback(); e.printStackTrace(); } finally { session.close(); } return retorno; } public boolean alteraLivro(Livro livro) { boolean retorno = false; try { session = HibernateUtil.getSessionFactory().openSession(); transaction = session.beginTransaction(); session.update(livro); transaction.commit(); retorno = true; } catch (HibernateException e) { transaction.rollback(); e.printStackTrace(); } finally { session.close(); } return retorno; } public boolean excluiLivro(Livro livro) { boolean retorno = false; try { session = HibernateUtil.getSessionFactory().openSession(); transaction = session.beginTransaction(); session.delete(session.get(Livro.class, livro.getIdLivro())); transaction.commit(); retorno = true; } catch (HibernateException e) { transaction.rollback(); e.printStackTrace(); } finally { session.close(); } return retorno; } public Livro consultarLivro(Livro livro) { Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 5 Criando um Aplicativo para a web com Java EE 7 Livro l = null; try { session = HibernateUtil.getSessionFactory().openSession(); l = (Livro) session.get(Livro.class, livro.getIdLivro()); } catch (HibernateException e) { e.printStackTrace(); } finally { session.close(); } return l; } public List<Livro> listarLivros() { List<Livro> list = null; try { session = HibernateUtil.getSessionFactory().openSession(); list = session.createQuery("select l from Livro l").list(); } catch (HibernateException e) { e.printStackTrace(); } finally { session.close(); } return list; } } Onde: • session = HibernateUtil.getSessionFactory().openSession(): a partir da classe HibernateUtil e do objeto sessionFactory uma sessão com o banco de dados é aberta. Tal sessão é atribuída a variável session. • session.persist: insere um registro no banco de dados. • session.update: atualiza um registro no banco de dados. • session.delete: exclui um registro no banco de dados. • session.get: obtem um registro no banco de dados. • session.createQuery: permite definir uma SQL para ser executada no banco dados. Neste caso, traz uma lista de livros. • transaction = session.beginTransaction(): abre um processo de transação no banco de dados. • transaction.commit(): comita, persiste as informações enviadas para o banco de dados. • transaction.rollback(): desfaz tudo caso ocorra algum problema durante o processamento de alguma transação. Seu package livrariaweb.dao e os arquivos criados anteriormente devem estar na seguinte forma no Project Explorer: Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 5 Criando um Aplicativo para a web com Java EE 7 Figura 65 - Package livrariaweb.dao e seus arquivos Sintetizando, temos nesta classe a implementação de todos os métodos necessários para realizar operações de CRUD no projeto que será criado posteriormente. Maiores conhecidos sobre Hibernate podem ser vistos no site http://hibernate.org/. Aqui finalizamos este módulo. Instalamos o banco de dados, criamos o database e a sequence, adicionamos as dependências necessárias para trabalhar com Hibernate e Postgres, configuramos o Hibernate, criamos um JavaBean (POJO), testamos as configurações do Hibernate através de uma classe java que utiliza o Bean criado e por fim criamos a interface e classe de implementação para métodos de CRUD. O próximo passo é criarmos a aplicação web. Veremos isso no módulo IV. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 5 Criando um Aplicativo para a web com Java EE 7 MÓDULO IV - Criado Uma Aplicação Simples de CRUD com JAVA Web Managed Beans Iremos criar agora uma classe conhecida como Managed Bean, que nada mais é que a classe utilizada pelo JSF para relacionar a comunicação entre páginas web (.xhtml) e as implementações de manipulação de dados implementados em nosso DAO. Em outras palavras, uma página JSF não consegue se comunicar diretamente com o banco de dados e muito menos realizar operações de CRUD nele. Então, essa é a função de uma classe do tipo managed bean, ou seja, agir como um controlador (controller) entre a primeira (páginas .xhtml) e a segunda camada (DAOs, beans, etc.). Clique sobre o package livrariaweb e crie outro package com o nome de mb. Agora, dentro do package livrariaweb.mb crie uma classe java com o nome de LivroMB.java e adicione a ela o seguinte conteúdo. package livrariaweb.mb; import javax.faces.application.FacesMessage; import javax.faces.context.FacesContext; import javax.faces.model.ListDataModel; import livrariaweb.bean.Livro; import livrariaweb.dao.LivroDao; import livrariaweb.dao.LivroDaoImpl; public class LivroMB { private LivroDao livroDao = new LivroDaoImpl(); private Livro livro; private boolean exibirForm = false; public Livro getLivro() { return livro; } public void setLivro(Livro livro) { this.livro = livro; } public ListDataModel getLivros() { return new ListDataModel(livroDao.listarLivros()); } Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 5 Criando um Aplicativo para a web com Java EE 7 public String adicionarLivro() { this.limparLivro(); this.exibirForm(); return null; } public String alterarLivro() { this.exibirForm(); return null; } public String salvarLivro() { if (livro.getIdLivro() == null) { livroDao.insereLivro(livro); } else { livroDao.alteraLivro(livro); } this.mostrarMensagem(livro.getTitulo() + " foi salvo!"); this.ocultarForm(); return null; } public String excluirLivro() { livroDao.excluiLivro(livro); this.mostrarMensagem(livro.getTitulo() + " foi excluido!"); return null; } public String cancelarCadastroLivro() { this.ocultarForm(); return null; } private void limparLivro() { livro = new Livro(); } private void exibirForm() { exibirForm = true; } private void ocultarForm() { exibirForm = false; } private void mostrarMensagem(String mensagem) { FacesContext.getCurrentInstance().addMessage(null, Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 5 Criando um Aplicativo para a web com Java EE 7 new FacesMessage(mensagem)); } public boolean isExibirForm() { return exibirForm; } } • • • • • • • • • Onde: private LivroDao livroDao = new LivroDaoImpl(): obtem uma instancia de LivroDaoImpl para acesso aos métodos de manipulação de dados. getLivro / setLivro: gets e sets referente ao objeto Livro. private boolean exibirForm = false: exibe ou oculta o formulário para cadastro/alteração de dados dos livros. getLivros: obtem toda a lista de livros. adicionarLivro() / alterarLivro() / salvarLivro() / excluirLivro : respectivamente, adiciona, altera dados, salva informações e exclui um livro da base de dados. cancelarCadastroLivro(): cancela o cadastro/alteração de um livro. limparLivro(): cria uma nova instancia do bean Livro. exibirForm() / ocultarForm(): exibe/oculta a visualização do formulário de cadastro e alteração de dados. mostrarMensagem(): mostra as mensagens da aplicação. Seu package livrariaweb.mb e o arquivo criado anteriormente devem estar na seguinte forma no Project Explorer: Figura 66 - Package livrariaweb.mb e sua classe Arquivos de Configuração faces-config.xml e web.xml Agora precisamos registrar essa para que o JSF entenda que a mesma é um managed bean. Para isso, abra o arquivo faces-config.xml, localizado no path conforme demonstra a figura a seguir: Figura 67 - Arquivos de configuração da aplicação Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 5 Criando um Aplicativo para a web com Java EE 7 Para finalizar, adicione o seguinte conteúdo a ele: <?xml version="1.0" encoding="UTF-8"?> <faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd" version="2.2"> <managed-bean> <managed-bean-name>LivroMB</managed-bean-name> <managed-bean-class>livrariaweb.mb.LivroMB</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> </faces-config> Onde: • LivroMB: é o apelido (alias) que utilizaremos nos formulários JSF. • livrariaweb.mb.LivroMB: indica o package (livrariaweb.mb) e por fim a classe LivroMB • session: é o escopo do bean. Aproveitando que estamos no folder WEB-INF, abra o arquivo web.xml e acrescente a ele o conteúdo a seguir, sem retirar as demais configurações já pré-estabelecidas anteriormente: <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> Páginas web do projeto Nossa aplicação web terá uma página html com o nome de index.html. Ela fará o redirecionamento da aplicação para outra página que criaremos posteriormente. Clique no folder webapp e, com o botão contrário do mouse selecione as opções New, Other. Na caixa de diálogo, escolha a opção HTML File e clique sobre o botão Next e, para finalizar, em Name digite index.html e após clique sobre o botão Finish. Na página index.html, adicione o seguinte conteúdo: <!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 6 Criando um Aplicativo para a web com Java EE 7 <META HTTP-EQUIV="Refresh" CONTENT="0,URL=listagem.xhtml"> </head> <body></body> </html> Aqui apenas cabe salientar a seguinte linha: <META HTTP-EQUIV="Refresh" CONTENT="0,URL=listagem.xhtml">. Essa linha é responsável por redirecionar a aplicação para a página listagem.xhtml que nada mais é que uma página JSF que exibirá todos os livros cadastrados na base de dados, bem como permitir a manipulação destes dados. Clique novamente no folder webapp e, com o botão contrário do mouse selecione as opções New, Other e crie outra página do tipo HTML File com o nome de listagem.xhtml. Adicione a ela as linhas abaixo: <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui"> <h:head> </h:head> <title>CRUD com Hibernate e JSF usando Eclipse e Banco de Dados PostGres</title> <h:body> <f:view> <div align="center"> <h:form id="form"> <h:messages /> <p:dataTable var="item" value="#{LivroMB.livros}" border="1" cellpadding="1" cellspacing="1" rendered="#{LivroMB.livros.rowCount > 0}"> <f:facet name="header"> <p:outputLabel value="Relação de Livros Cadastrados" /> </f:facet> <p:column> <f:facet name="header"> <h:outputText value="Titulo" /> </f:facet> <h:outputText value="#{item.titulo}" /> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Editora" /> </f:facet> <h:outputText value="#{item.editora}" /> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Autor" /> </f:facet> <h:outputText value="#{item.autor}" /> </p:column> <p:column rendered="#{!LivroMB.exibirForm}"> <f:facet name="header"> Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 6 Criando um Aplicativo para a web com Java EE 7 <h:outputText value="Opções" /> </f:facet> <h:commandLink action="#{LivroMB.alterarLivro}"> <h:outputText value="Alterar" /> <f:setPropertyActionListener value="#{item}" target="#{LivroMB.livro}" /> </h:commandLink> <h:commandLink action="#{LivroMB.excluirLivro}"> <h:outputText value="Excluir" /> <f:setPropertyActionListener value="#{item}" target="#{LivroMB.livro}" /> </h:commandLink> </p:column> <f:facet name="footer"> <h:outputText value="Quantidade de livros cadastrados: #{LivroMB.livros.rowCount}" /> </f:facet> </p:dataTable> <h:commandLink action="#{LivroMB.adicionarLivro}" value="Novo livro" rendered="#{!LivroMB.exibirForm}" /> <!-- Inicio: Formulario de Cadastro de livro --> <p:panelGrid border="1" columns="2" rendered="#{LivroMB.exibirForm}"> <f:facet name="header"> <h:outputText value="Cadastro de livro" /> </f:facet> <p:outputLabel for="nome" value="Titulo: " /> <p:inputText id="nome" value="#{LivroMB.livro.titulo}" required="true" /> <p:outputLabel for="email" value="Editora: " /> <p:inputText id="email" value="#{LivroMB.livro.editora}" required="true" /> <p:outputLabel for="autor" value="Autor: " /> <p:inputText id="autor" value="#{LivroMB.livro.autor}" required="true" redisplay="true" /> <f:facet name="footer"> <h:panelGroup> <h:commandButton value="Salvar" action="#{LivroMB.salvarLivro}" /> <h:commandButton value="Cancelar" action="#{LivroMB.cancelarCadastroLivro}" immediate="true" /> </h:panelGroup> </f:facet> </p:panelGrid> </h:form> </div> </f:view> </h:body> </html> Aqui temos um formulário JSF estritamente SIMPLES mas, com uma manipulação de dados (CRUD) totalmente funcional. O primeiro "link" é um botão do tipo commandLink padrão do JSF que tem a função de cadastrar um novo livro. É óbvio que não temos livro algum cadastrado na base de dados, logo apenas esse link "Novo livro" será visualizado se executarmos a aplicação. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 6 Criando um Aplicativo para a web com Java EE 7 O datatable utilizado é um componente da suite Primefaces. Esse tipo de componente é responsável tanto no JSF, como qualquer outro framework web para java, de servir como um conteiner para exibição de coleções, listas. Neste caso em especifico, escolhi utilizar o do PrimeFaces, pois os componentes desta suite já vem com um arquivo .css pré-configurado. Logo, visualmente, causa um efeito muito melhor que simplemesmente visualizarmos uma tabela "crua" no navegador. Observe: Com componente nativo do JSF: Figura 68 - Relação de Livros com datatable JSF puro Com componente nativo do Primefaces: Figura 69 - Relação de Livros com datatable do PrimeFaces Para a tela de manutenção e inclusão de livros, utilizei um componente do tipo panelGrid do Primefaces. Observe: Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 6 Criando um Aplicativo para a web com Java EE 7 Figura 70 - Tela de cadastro e manutenção de livros É claro que se pode aplicar um arquivo de folhas de estilo (.css) em componentes nativos do JSF, mas não é o objetivo aqui. Isso é apenas para demonstrar as vantagens em se utilizar frameworks de mercado, como o Primefaces, dando assim uma "turbinada" nos componentes base do JSF, tanto em layout, como em outros recursos, como por exemplo a utilização de Ajax. Bem até aqui criamos o projeto web, mas não o executamos até agora. As telas exibidas anteriormente servem apenas para demonstrar como nossa aplicação ficará. Instalando o Tomcat e Executando a Aplicação Vamos agora realizar o dowload e instalação do Tomcat 7. Para isso, utilize a seguinte url: http://tomcat.apache.org/download-70.cgi. Faça o download em Binary Distributions, no item Core, do arquivo .zip. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 6 Criando um Aplicativo para a web com Java EE 7 Figura 71 - Site para download do Tomcat 7 De preferência salve o arquivo em uma pasta aonde você tenha permissões de leitura e escrita, visto que estamos utilizando o Windows e, em alguns casos, pode ocorrer problemas de permissão com o utilitário UAC. Feito o download, descompacte o arquivo .zip e volte para o Eclipse. Agora vá até Guia Servers e clique com o botão contrário do mouse abra o menu de contexto. Após, selecione New, Server. Figura 72 - Criando um novo servidor no Eclipse Na próxima caixa de diálogo, na treeview selecione Apache e após Tomcat v7.0 Server. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 6 Criando um Aplicativo para a web com Java EE 7 Em Server's host name e Server name mantenha os nomes conforme a sugestão do wizard. Figura 73 - Registrando o servidor Tomcat Em Server runtime environment, clique sobre o botão Add e em Tomcat installation directory e aponte para pasta aonde o Tomcat foi descompactado. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 6 Criando um Aplicativo para a web com Java EE 7 Figura 74-Apontando para a pasta de instalação do Tomcat Vá clicando sobre os botões Finish até criar o servidor. Com o servidor criado, devemos agora adicionar nossa aplicação a ele. Para isso, clique com botão contrario do mouse sobre o servidor criado na guia Servers. Após, selecione a opção Add and Remove. Figura 75-Adicionando o aplicativo web no servidor Tomcat Na próxima caixa de diálogo, selecione o projeto livrariaweb e clique no botão Add e após Finish. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 6 Criando um Aplicativo para a web com Java EE 7 Figura 76-Apontando para a aplicação livrariaweb A aplicação é automaticamente adicionada no servidor Tomcat criado e agora poderá ser executada. Figura 77-Aplicação adicionada no servidor Faça o start do servidor como mostra a figura a seguir: Figura 78-Start do servidor O servidor foi starteado. Observe: Figura 79-Tomcat inicializado Para finalizar, o próximo passo agora é abrir o browser e executar nossa aplicação com a seguinte url: Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 6 Criando um Aplicativo para a web com Java EE 7 http://localhost:8080/livrariaweb/ Caso exista algum registro na tabela, a listagem de livros será exposta. Caso contrário, apenas o link para cadastrar um novo livro será exibido. Figura 80-Aplicação em execução no browser CONCLUINDO Se avaliarmos o que estudamos neste ebook, veremos que partimos do básico, desde a instalação do Java em nosso computador, até o ponto de criarmos uma aplicação java para web. Deixo aqui o desafio para se tornar um expert em Java e fazer com que o conteúdo desde ebook e de muito livros de mercado se tornem obsoletos para o conhecimento que você irá adquirir na sua vida sendo um desenvolvedor Java. Afinal, estamos nessa vida para crescer, adquirindo conhecimento e, com isso, realizando grandes conquistas. Fique com Deus e conte comigo, Jean Vargas, para o seu crescimento pessoal e intelectual e não esqueça de acessar o meu blog, http://profissionaisjava.com, onde dou várias dicas, tanto para iniciantes, como profissionais na área de TI, sobre Java e tecnologias que rodeiam está fantástica linguagem de programação. Autor: Jean Robson Batista de Vargas - http://profissionaisjava.com 6