Dominando JavaServer Faces e Facelets Utilizando Spring 2 5, Hibernate e JPA
Dominando JavaServer Faces e Facelets Utilizando Spring 2 5, Hibernate e JPA
Trabalhar em aplicações Web utilizando tecnologia Java não é uma tarefa fácil.
Entretanto, ao redor do mundo, muitos desenvolvedores já criaram diversas bi-
bliotecas que auxiliam nessa tarefa, gerando o que chamamos de frameworks.
ANTES DE COMEÇAR
Em algumas partes deste livro, você encontrará um símbolo que o ajudará a en-
tender o código proposto e desenvolvido, mostrado a seguir:
... - Indica que acima ou abaixo contém código, mas que não está sendo exibido
por não ter sido alterado ou por ser importações, e o mesmo pode ser acessado
pelo CD-ROM, anexo ao livro.
OS SOFTWARES REQUERIDOS
Os aplicativos criados neste livro não exigem software proprietário. Portanto, ao
longo dos capítulos, você não só aprenderá como usá-los, mas também onde en-
contrá-los na Internet, caso precise de uma atualização.
HARDWARE REQUERIDO
Uma boa configuração de hardware se faz necessária para trabalhar com aplica-
ções escritas em Java. Um computador para rodar bem o Eclipse IDE ou NetBeans
IDE deve ter as seguintes configurações para uma confortável utilização, segundo
o autor:
Caso não encontre algum exemplo, entre em contato com o autor pelo site http://
www.integrator.com.br.
Para uma melhor compreensão, aqui você tem uma sinopse dos capítulos encon-
trados no decorrer do livro.
Capítulo 3 - Facelets...............................................................................................53
Como o Facelets trabalha? ................................................................................53
Onde baixar o Facelets .....................................................................................54
Desenvolvendo com Facelets ...........................................................................55
O plug-in com suporte a Facelets no NetBeans IDE ....................................55
Criando um projeto simples com Facelets ...................................................55
A API do Facelets ........................................................................................71
Bibliografia ...........................................................................................................367
Livros Nacionais .............................................................................................367
Livros Internacionais .......................................................................................367
Sites..... ..........................................................................................................368
Acesso para pesquisa ......................................................................................368
Tutoriais .........................................................................................................368
Apêndice A: Pool de Conexões ............................................................. CD-ROM
Apêndice B: O MySQL.......................................................................... CD-ROM
Apêndice C: Suporte a Facelets no NetBeans ........................................ CD-ROM
AMBIENTES DE TRABALHO,
JAVASERVER FACES E
FACELETS
Visite o site www.integrator.com.br e veja um vídeo demonstrativo da aplicação
CAPÍTULO 1
O ECLIPSE IDE
O Eclipse IDE, chamado por muitos de Plataforma Eclipse, é considerada por uma
grande maioria de desenvolvedores Java como a melhor ferramenta para desen-
volvimento dessa linguagem.
Até o momento em que esse livro está sendo escrito, a versão atual e estável do
Eclipse é a 3.3.
O NETBEANS IDE
O NetBeans IDE é uma ferramenta criada em Java Swing e com várias opções em
pacotes para que você baixe a versão que melhor se encaixa em seu trabalho;
cada uma contém módulos de instalação diferentes para cada necessidade do
desenvolvedor.
Dando um clique nesse botão, você irá até a página de downloads da IDE. En-
quanto este livro é escrito, o NetBeans IDE se encontra na versão 6.0 como estável
e 6.1 como desenvolvimento. Para o livro, será adotada a versão 6.1.
FIGURA 1.7 – DOWNLOAD DO PACOTE NECESSÁRIO PARA O DESENVOLVIMENTO COM APLICAÇÕES WEB
O JAVASERVER FACES
JavaServer Faces é o framework de aplicações Web Java oficial da Sun Microsyste-
ms. Esse framework foi desenhado para simplificar o desenvolvimento de aplica-
ções Web, através do conceito baseado em componentes (component based).
O contêiner Servlet usado para este livro será o Tomcat 6 que, por padrão, não
possui suporte direto ao JavaServer Faces, ou seja, não contém as bibliotecas ne-
cessárias para o desenvolvimento com o mesmo.
Para torná-los disponíveis em sua aplicação é simples: basta colocar esses arquivos
listados no diretório lib, encontrado em WEB-INF de sua aplicação Web.
Porém, como vamos utilizar um ambiente de trabalho baseado em IDE, será mais
fácil essa configuração.
Para criar um projeto com JavaServer Faces, vá ao menu File e clique no item New
Project. Na caixa de diálogo New Project selecione o item Web em Categories
e Web Application em Projects. Clique no botão Next.
O NetBeans IDE abrirá automaticamente uma página em JSF criada pelo assisten-
te através do template existente.
Na próxima etapa digite TrabComJSF no campo Project Name, selecione JSF 1.2
em JSF Environment e altere para o item JSFKickStartWithoutLibs em Template
(isso fará com que o projeto possua de início algumas páginas em JSF). Clique no
botão Next para prosseguir.
É esse o papel da página index.jsp, no projeto criado pelo Eclipse IDE e forwar-
dToJSF.jsp, criada no projeto do NetBeans IDE. Essas páginas são encontradas na
view Package e na janela Projects do Eclipse e NetBeans respectivamente.
Em ambas as situações, você tem a tag JSP <jsp:forward /> e a página para a
qual irá direcionar no atributo page.
O DIRETÓRIO WEB-INF
No diretório WEB-INF você encontra o arquivo web.xml (deployment descriptor)
padrão, com a adição da configuração JSF e outro arquivo, chamado de faces-
config.xml. No NetBeans, você também pode acessar esses arquivos através do
diretório Configuration Files.
Em ambas as ferramentas, a edição dos arquivos podem ser tanto visuais como
pelo XML.
O elemento <navigation-case /> determina qual a página deverá ser exibida, partin-
do da configurada em <from-view-id/>. Caso receba uma mensagem, seja de suces-
so ou de falha, o elemento <from-outcome /> é acionado, verificando-se a palavra
existente entre esse elemento. A página que será exibida é determinada através do
elemento <to-view-id />, que indica a navegação para onde o browser irá.
O FORMULÁRIO
Para que essas regras funcionem, primeiro você tem que criar a página que sub-
meterá os dados digitados. Essa página também será responsável por mostrar um
erro, caso ocorra, ao usuário.
• Para criar no Eclipse IDE, com o direito do mouse sobre o projeto, selecione
no menu de contexto o item New > JSP File. Na caixa de diálogo New File
JSP, digite trabComJSF no campo Name e selecione o item JSFBasePage, em
Template. Clique em Finish para completar. O Eclipse IDE, através do plug-in
JBoss Tools, adicionará a base da página com as diretivas taglibs configuradas
para o JSF.
FACELETS
JavaServer Faces é muito bom para desenvolver aplicações Web, porém, ainda
assim, exige-se do desenvolvedor o conhecimento das tags JSF, o que atrapalha o
designer de páginas em sua construção. A saída seria utilizar um sistema de tem-
plates simples que não exigisse mudanças no uso de (X)HTML e se integrasse ao
framework sem maiores alterações.
Para esse caso, temos Facelets, um framework de templates JavaServer Faces, ba-
seado em alguns princípios simples, que transforma tags (X)HTML em páginas JSF,
sem a necessidade de utilização total de suas tags.
Nesse capítulo você aprenderá a trabalhar com Facelets através das IDEs, criando
um pequeno projeto de exemplo.
Graças ao Facelets, podemos ter como vantagens sobre a construção de páginas JSF:
• É mais rápido, pois não utiliza o engine do JSP para transformar em Servlets;
Graças a essas integrações, as aplicações podem ser escritas para serem visualiza-
das em uma interface CSS.
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/cadastrados.xhtml</from-view-id>
<navigation-case>
<from-outcome>cadastro</from-outcome>
<to-view-id>/cadastro.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
...
O ARQUIVO WEB.XML
Para ter uma aplicação Web utilizando Facelets funcionando, é necessário tam-
bém adicionar alguns elementos no arquivo web.xml.
A API DO FACELETS
A API do Facelets, contido no pacote com.sun.facelets, consiste de três classes
abstratas ( Facelet, FaceletFactory e FaceletContext) e duas interfaces (Facele-
tHandler e TemplateClient). Cada uma das três classes abstratas expõem os mé-
todos de uma classe implementada padrão, contida no pacote com.sun.facelets.
impl. A DefaultFacelet é a que deriva de Facelet; DefaultFaceletFactory deriva
de FaceletFactory e DefaultFaceletContext deriva de FaceletContext. Em con-
traste, a interface FaceletHandler é implementada por mais de trinta classes ma-
nipuladoras. Basicamente, isto ocorre porque a instância de Handler é específica
para o componente que está manipulando. A interface TemplateClient é imple-
mentada por CompositionHandler e DecorateHandler.
DESENVOLVENDO O
SITE E-COMMERCE
O MODELO DE DADOS
Para construir a aplicação Web e-commerce, teremos cinco simples tabelas ini-
cialmente. Do ponto de vista administrativo da aplicação, haverá uma área fecha-
da, que será gerenciada cadastrando-se categorias e produtos (armazenando os
dados nas tabelas de mesmo nome).
No site, para o público em geral, teremos os produtos sendo exibidos e suas res-
pectivas categorias, ao qual poderemos visualizar um ou vários desses produtos,
assim como filtrá-los por sua categoria (resumidamente falando). Assim que cria-
do o carrinho de compras, no fechamento do pedido, um usuário se cadastrará
(tabela usuários) para então, fechar o pedido (esse usuário deverá estar logado).
O código do usuário e dados de pagamento são armazenados na tabela pedidos.
A quantidade comprada, bem como os produtos adquiridos são armazenados na
tabela itens_pedido. Um pedido, como já sabe, deve ter diversos produtos adqui-
ridos. Isso significa que, na prática, o carrinho de compras será todo armazenado,
no fechamento, na tabela itens_pedido. A Figura 4.1 ilustra as tabelas e o banco
de dados do sistema.
MYSQL E O JDBC
Sendo um dos sistemas de gerenciamento de bancos de dados mais usados do
mundo, pertencente a Sun Microsystems, sua velocidade e capacidade de ser
multiplataforma só poderiam chamar a atenção de quem desenvolve em Java.
NOTA: Com a biblioteca Hibernate criada, você não precisará repetir os pas-
sos novamente para criar uma biblioteca de usuário, a menos que mude de
Workspace.
NO NETBEANS IDE
No NetBeans IDE, vá ao menu Tools>Libraries. Na caixa de diálogo Library
Manager clique no botão New Library. No diálogo New Library digite Hibernate
em Library Name e confirme. Selecione, assim como no Eclipse IDE, todos os
arquivos JARs existentes do Hibernate, no diretório de mesmo nome, encontrado
no CD-ROM.
Crie uma nova classe Java e a chame conforme mostrado nas Listagens a seguir.
Mas existem outras anotações, que estão listadas na Tabela 4.1 a seguir:
ANOTAÇÃO DESCRIÇÃO
@Entity A entidade. Indica que essa classe é uma entidade (entity bean), que nada mais é
do que um POJO, representando um objeto de negócio. Sem a definição de um
parâmetro adicional, é assumido que o valor padrão será o nome da classe.
@Table Mapeia o nome da tabela. Caso não seja utilizado o parâmetro name, o valor
padrão assumido é o nome da classe.
@Id O identificador da entidade. Normalmente se refere à chave primária da tabela
relacional.
@GeneratedValue Define que terá seus identificadores automaticamente gerados. Isso é chamado
de geração de id e é especificado por essa anotação.
@Column Mapeia o nome da coluna existente na tabela relacional. É importante frisar que
o Hibernate assume os atributos da classe como os mesmos nomes dos campos
da tabela existente no banco de dados. A utilização dessa anotação com o atributo
name se faz necessário nesse caso, uma vez que existem campos de nomes dife-
rentes no modelo relacional com relação à classe.
@Temporal São tipos baseados em informações armazenadas relativas ao tempo. A lista de
tipos temporais incluem três tipos java.sql e dois tipos java.util: java.sql.Date,
java.sql.Time, java.sql.Timestamp, java.util.Date e java.util.Calendar.
O uso dessa anotação inclui um atributo chamado de TemporalType com um
valor enumerado. Esses valores são: DATE, TIME e TIMESTAMP para repre-
sentar os tipos de java.sql.
@Lob Um termo de banco de dados comum para campos que armazenam grandes
quantidades de dados (ou até mesmo objetos baseados em bytes), conhecidos
como Binary Large Object - ou LOB, abreviado. Essa anotação atua com esse
propósito, que são vistos em campos do tipo TEXT, BLOB e outros existentes
no MySQL.
@OneToMany Define uma relação de “um-para-muitos” do utilizado em banco de dados rela-
cional. Possui um atributo chamado mappedBy para definir o atributo da outra
Entidade no qual é referenciado.
@ManyToOne Define uma relação de “muitos-para-um” do utilizado em banco de dados rela-
cional.
@JoinColumn São usadas para especificar a coluna que contém a chave estrangeira de cada
relacionamento, os conhecidos Inner Joins de um relacionamento SQL.
FIGURA 4.9 – CONFIGURAÇÃO FINAL PARA A CRIAÇÃO DO ARQUIVO PERSISTENCE.XML NO NETBEANS IDE
A Figura 4.10 exibe o arquivo persistence.xml criado em cada uma das IDEs.
Essa ferramenta possui suporte a JPA, contendo views que auxiliam no mapea-
mento entre propriedades e colunas, geração de relacionamentos, além de forne-
cer ferramentas para a geração do modelo relacional a partir das entidades.
Para criar um projeto com Dali JPA Tools no Eclipse IDE, vá ao menu File>New
e clique em Other. Selecione na caixa de diálogo New o item JPA>JPA Project.
Clique em Next para prosseguir. Chame o projeto de Model3 e clique no botão
Next até a última etapa. Siga os passos a seguir para configurar corretamente o
projeto JPA:
Na última etapa do assistente, temos a criação das entidades a partir das tabelas.
Clique no botão Create Persistence Unit para gerar um arquivo persistence.xml.
Na caixa de diálogo Create Persistence Unit digite ecommece em Persistence
Unit Name e confirme no botão Create.
Mesmo com o lançamento do EJB 3, muitas aplicações Web são pequenas, não
exigindo um servidor de aplicações web completo, rodando em contêineres Ser-
vlet. Por sua vez, os contêineres Servlets possuem limitações impostas, como o
trabalho com EJB, e outras situações que, através do Spring, podem ser supridas
facilmente.
Neste capítulo, você utilizará o Spring com anotações para trabalhar em conjunto
com a JPA, criando um DAO genérico para a aplicação e-commerce, trabalhando
com injeções de dependências, e fará os testes unitários com as anotações ofere-
cidas pelo Spring. Por fim, aprenderá a configurar um arquivo Log4j para melhor
visualizar a saída executada pelo Hibernate para depuração.
FIGURA 5.5 – SELEÇÃO DE UMA OPÇÃO EM CREATE A NEW SPRING BEAN DEFINITION FILE
JUnit é projetado para testar seu código e é composto por métodos assertivos que
podem testar várias condições. É possível construir testes com JUnit usando os
seguintes métodos:
FIGURA 5.11 – RESULTADOS DO TESTE UNITÁRIO REALIZADO NO ECLIPSE IDE E NO NETBEANS IDE
Neste capítulo você aprendará a trabalhar com os DAOs criados para cadastrar
produtos e categorias, adicionará e configurará o Apache MyFaces Trinidad, com
o intuito de trabalhar com upload de arquivos, além de conhecer as anotações do
Spring 2.5 para integração com o JavaServer Faces 1.2.
No Eclipse IDE, crie um projeto JSF Project (JBoss Tools Web>JSF>JSF Project).
Na segunda etapa, digite o nome do projeto no campo Project Name e selecione
JSF 1.2 with Facelets em JSF Environment. Mantenha a opção FaceletsBlankWi-
thoutLibs em Template. Finalize o assistente quando terminar.
FIGURA 6.1 – PROJETO JSF COM FACELETS NO ECLIPSE IDE SEM TEMPLATE
http://myfaces.apache.org/trinidad/index.html
A Listagem 6.11 exibe o componente JSF <h:dataTable/>, que gera a tag (X)HTML
<table/> preenchida, carregando todos os dados encontrados no método getTo-
dos() da classe CategoriaController. Para isso, foi configurado o atributo value
chamando esse método. O atributo var possui um valor, chamado de item, que
será distribuído por cada coluna da tabela, colocando o nome do campo que será
exibido.
Neste capítulo, você vai criar a classe responsável por gerenciar o front-end do site,
além de desenvolver o design utilizando Facelets com técnicas de layout CSS.
3
Atualmente, o trabalho com a URL e a navegação por GET tem passado por transformações. Recomendo a leitura
a respeito de REST.
NOTA: A criação dos estilos do site está fora do escopo pretendido por este
livro.
O CARRINHO DE COMPRAS
Um dos principais pontos de um site de comércio eletrônico é o seu carrinho de
compras. Os usuários de um site de comércio eletrônico podem construir seus
pedidos nessa área, selecionando e adicionando vários produtos em seus pedidos.
Há também quem o chame de cesta de compras, cesta ou apenas carrinho. Em
inglês, costumamos ver esse processo sendo descrito como “shopping bag”, “sho-
pping cart” ou somente “cart”.
Embora não importe como você o chame, o que mais importa seja a origem de
seu nome, que surgiu devido à similaridade do processo que faríamos se estivés-
semos em um mercado ou loja, onde colocamos vários produtos em uma cesta,
sacola ou carrinho.
Neste capítulo, você vai criar um carrinho de compras no site de comércio ele-
trônico, podendo visualizar os produtos, editar a quantidade e excluir, além de
calcular o total do pedido.
A PÁGINA DO CARRINHO
Você vai criar uma página similar ao mostrado na Figura 8.1, onde haverá uma
tabela com os itens adicionados.
<ui:define name=”titulo”>
Carrinho de compras
</ui:define>
<ui:define name=”conteudo”>
<div id=”cart”>
<c:choose>
FINALIZANDO A COMPRA
Quando o usuário termina de escolher tudo que deseja comprar, inicia o processo
de pagamento. Esse processo é feito através da entrada em uma área especial,
com um nome de usuário único e uma senha. Porém, para que isso ocorra, esse
mesmo usuário deve estar devidamente cadastrado no site, evitando assim frau-
des. Neste capítulo, você vai definir a segurança para a entrada na área de usuá-
rio, incluindo o formulário para seu cadastro e login, para que esse possa realizar
a finalização da compra.
id=”enviar” value=”Logar”/>
<input jsfc=”h:commandButton” type=”submit”
action=”#{usuarioController.novoUsuario}”
immediate=”true”
id=”novo” value=”Novo Usuário”/>
</fieldset>
</div>
</ui:define>
</ui:composition>
…
Embora o formulário para entrar na área de usuário seja igual a qualquer outro
feito até o momento no livro, há uma pequena mudança para exibir as mensagens
globais do formulário.
Enquanto cada campo possui uma mensagem personalizada, a tag JSF <h:messa-
ges/> exibe todas as mensagens lançadas pelo formulário, inclusive as que perten-
cem aos campos obrigatórios. Para forçar a exibição de apenas mensagens globais,
e não locais, utilize o atributo globalOnly= “true”.
id=”confirmar” value=”Confirmar”/>
</fieldset>
</div>
</ui:define>
</ui:composition>
…
Se você não gostar da mensagem padrão criada no validador, pode alterá-la dire-
tamente na tag JSF, com o atributo validatorMessage.
<h:inputText id=”ccNumero”
value=”#{usuarioController.pedido.ccNumero}”
required=”true”
validatorMessage=”Formato: 9999-9999-9999-9999,com ‘-’ ou espaço”>
Crie uma biblioteca de usuário chamada Mail em seu Eclipse IDE ou NetBeans
IDE. Descompacte e pegue os arquivos mail.jar e activation.jar e adicione na
biblioteca criada.
</fieldset>
</div>
</ui:define>
…
Por fim, você irá garantir a entrada na área administrativa para somente pessoas
autorizadas, trabalhando com PhaseListener do JavaServer Faces para controlar a
sessão.
CRIANDO A CONSULTA
Como a aplicação possui a parte de finalização de pedidos na classe Usuario-
Controller, será essa que você usará para criar a consulta de pedidos para o
administrador.
Altere no template também, adicionando um link que chama essa página, como
mostra o trecho a seguir:
<li>
<a jsfc=”h:commandLink”
action=”mostrarCompras” immediate=”true”>
Exibir Compras
</a>
</li>
ADICIONANDO UM RELATÓRIO
Para concluir as funcionalidades do administrador, é interessante adicionar a
capacidade de gerar relatórios. Existem diversos programas que trabalham com
relatórios em Java: na comunidade Open Source temos o JasperReports e sua
ferramenta visual iReport, da empresa JasperSoft, e o Eclipse Birt, da fundação
Eclipse.
Criar relatórios em Java é um assunto que exige um livro4 e a idéia aqui é apren-
der a exibir um relatório simples, com os resultados vindos da pesquisa criada na
página que exibe as compras efetuadas. O relatório será gerado em JasperReports,
por ser o mais popular, sendo que você usará o iReport para desenhá-lo visual-
mente.
4
Recomendo a leitura do livro Dominando Relatórios JasperReports com iReport, de minha autoria
(1) File – Exibe os relatórios abertos. O acesso é feito com um duplo clique
sobre o relatório que deseja exibir na janela. O ícone apresentado, ao lado do
nome do relatório, nesse painel, também indica modificação no arquivo. Caso
esteja com dois riscos, é porque houve alteração e não foi salvo. Alternativa-
mente, você pode acessar outro relatório aberto através do menu Window.