tutorial java web com jsf 2
TRANSCRIPT
-
5/24/2018 Tutorial Java Web Com Jsf 2
1/78
Tutorial JAVA Web com JSF2.0, Facelts, Hibernate 3.5
com JPA 2.0, Spring 3.0 e
PrimeFaces 2.2.1
Autor: Diego Carlos Rezende
Graduando em Sistemas de Informao
Universidade Estadual de Gois - UEG UnUCET
Anpolis
Outubro, 2011
-
5/24/2018 Tutorial Java Web Com Jsf 2
2/78
Sumrio
Figuras ............................................................................................ 2Tabelas ........................................................................................... 3Apresentao ................................................................................... 5Configurao do Banco de Dados ......................................................... 6Configurando o TomCat ...................................................................... 7Criando o projeto ............................................................................ 10Configurando o projeto .................................................................... 14Estruturando o projeto... .................................................................. 18Programando - Modelo e suas dependncias ........................................ 20Programando - Persistncia .............................................................. 29Programando - Conectando com o Banco de dados ............................... 33Configurando o Spring ..................................................................... 35Programando - Fbrica de Beans ....................................................... 39Programando - Criando nossos controladores....................................... 41Programando - Controlando a viso.................................................... 49Programando - Internacionalizao por Bundle ..................................... 53Programando - Gerenciando a viso ................................................... 57Programando - Criando nosso layout .................................................. 63Programando - Facelets e template .................................................... 65Programando - Criando as pginas ..................................................... 68Rodando a aplicao ........................................................................ 74Exerccio ........................................................................................ 76Agradecimentos .............................................................................. 77
-
5/24/2018 Tutorial Java Web Com Jsf 2
3/78
Figuras
Figura 01 - New Others ...................................................................... 7Figura 02 - Criando Server ................................................................. 7Figura 03 - Selecionando Server .......................................................... 8Figura 04 - Escolha do diretrio do TomCat ........................................... 8Figura 05 - Configurao do Server Location .......................................... 9Figura 06 - Criando um Dynamic Web Project ...................................... 10Figura 07 - Configurao do projeto ................................................... 11Figura 08 - Gerar web.xml ................................................................ 12Figura 09 - Configurao do JSF no web.xml........................................ 13Figura 10 - Bibliotecas ..................................................................... 14Figura 11 - Package ......................................................................... 18Figura 12 - Pacotes do projeto........................................................... 18Figura 13 - New>Annotation ............................................................. 20Figura 14 - New>Class ..................................................................... 22Figura 15 - New>Interface ............................................................... 29Figura 16 - New>CSS File ................................................................. 63Figura 17 - New>HTML File ............................................................... 65Figura 18 - Add and Remove... .......................................................... 74Figura 19 - PickList de projetos ......................................................... 74
-
5/24/2018 Tutorial Java Web Com Jsf 2
4/78
Tabelas
Tabela 01 - Criando banco de dados ..................................................... 6Tabela 02 - Criando tabelas ................................................................ 6Tabela 03 - web.xml ........................................................................ 15Tabela 04 - index.html ..................................................................... 17Tabela 05 - RequiredField.java .......................................................... 21Tabela 06 - Entity.java ..................................................................... 23Tabela 07 - Reino.java ..................................................................... 25Tabela 08 - Filo.java ........................................................................ 28Tabela 09 - IGenericDAO.java ........................................................... 29Tabela 10 - GenericDAO.java ............................................................ 31Tabela 11 - Connect.java.................................................................. 33Tabela 12 - jdbc.properties ............................................................... 34Tabela 13 - spring.xml ..................................................................... 36Tabela 14 - SpringFactory.java .......................................................... 39Tabela 15 - ValidatorControl.java ....................................................... 42Tabela 16 - For each em modo rtulo ................................................. 44Tabela 17 - MessagesControl.java ...................................................... 45Tabela 18 - IControl.java .................................................................. 46Tabela 19 - Control.java ................................................................... 47Tabela 20 - MessagesWeb.java .......................................................... 49Tabela 21 - Converter.java ............................................................... 51Tabela 22 - messages_pt_BR.properties ............................................. 53Tabela 23 - messages_en_US.properties ............................................. 54Tabela 24 - faces-config.xml ............................................................. 55Tabela 25 - MB.java ........................................................................ 58Tabela 26 - ReinoMB.java ................................................................. 60Tabela 27 - FiloMB.java .................................................................... 62
-
5/24/2018 Tutorial Java Web Com Jsf 2
5/78
Tabela 28 - template.css .................................................................. 64Tabela 29 - template.xhtml ............................................................... 66Tabela 30 - CadReino.xhtml .............................................................. 69Tabela 31 - CadFilo.xhtml ................................................................. 71
-
5/24/2018 Tutorial Java Web Com Jsf 2
6/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 5
Apresentao
Com este tutorial pretendo explicar o funcionamento de um CRUD bsicopara cadastro de Reino e Filo com apenas o nome dos mesmos em um
programa para a Web envolvendo o JSF 2.0 para a camada de viso,
Facelets para organizao dos templates e das pginas, Hibernate para a
camada de persistncia juntamente com o JPA, Spring para a camada de
controle (injeo de dependncias) e o PrimeFaces como interface rica para
a camada de viso. Contm tambm um validador usando o Java Reflection.
Para explicao de Spring e um pouco do Hibernate usarei tutoriais deoutros autores que julgo muito bons, sendo que citarei quando necessrio e
onde dever ser feito a leitura dos mesmos.
Na construo da aplicao, alm dos frameworks citadas acima, tambm
foram usadas as seguintes tecnologias:EclipseHelios para a IDE (Helios ou
Indigo) para desenvolvimento Java EE; Apache Tomcat 7 como servidor;
SQL Server 2005 como banco de dados.
O intuito deste tutorial a disseminao do conhecimento, apenas peopara manter os crditos dos autores, tantos deste tutorial, como dos citados
aqui tambm.
Para um melhor aproveitamento, tente no copiar o cdigo, use as
ajudas do Eclipse, as dicas contidas no tutorial e o perfeito CTRL + espao
que a IDE nos fornece. Nos arquivos XML aconselho o CTRL + C, CTRL + V
mesmo.
A explicao do Spring e Hibernate encontra-se no blog do Felipe Saab,que explica muito bem sobre os dois, e para a compreenso deste tutorial
faz-se necessrio a leitura do artigo dele,de Spring Hibernate (parte 1 ao
4), tambm necessrio o conhecimento do bsico de Java.
http://www.eclipse.org/downloads/http://www.eclipse.org/downloads/http://www.eclipse.org/downloads/http://tomcat.apache.org/download-70.cgihttp://tomcat.apache.org/download-70.cgihttp://www.javasimples.com.br/spring-2/spring-framework-parte-5-spring-web-mvc/http://www.javasimples.com.br/spring-2/spring-framework-parte-5-spring-web-mvc/http://www.javasimples.com.br/spring-2/spring-framework-parte-5-spring-web-mvc/http://tomcat.apache.org/download-70.cgihttp://www.eclipse.org/downloads/ -
5/24/2018 Tutorial Java Web Com Jsf 2
7/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 6
Configurao do Banco de Dados
No seu SQL Server j instalado, abra-o e crie a database para o sistema:01. CREATE DATABASEportal_virtual;
Tabela 01 - Criando banco de dados
Agora hora de criar a tabelas onde iremos salvar os dados:
01. USEportal_virtual;02.03. CREATE TABLEreino (04. id_reinoINT IDENTITY NOT NULL,
05. nomeVARCHAR(50)NOT NULL,06. PRIMARY KEY (id_reino)07. )08.09. CREATE TABLEfilo (10. id_filoINT IDENTITY NOT NULL,11. nomeVARCHAR(50)NOT NULL,12. id_reinoINTNOT NULL,13. PRIMARY KEY (id_filo),14. FOREIGN KEY (id_reino) REFERENCESreino(id_reino)
15. );Tabela 02 - Criando tabelas
Pronto, basta apenas criar o Usurio de acesso. No projeto defini o
usurio para o banco de dados portal_virtual com o login: ueg e senha:
portueg; voc pode, ento, criar o mesmo usurio com login e senha no seu
SQL Server, ou mudar o usurio e a senha do software no arquivo
properties do JDBC para o usurio do seu banco de dados, explicarei como
fazer essa ultima parte mais adiante.
Banco de dados criado, vamos para o JAVA.
-
5/24/2018 Tutorial Java Web Com Jsf 2
8/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 7
Configurando o TomCat
Baixe o Eclipse no site citado na Apresentao e o descompacte ondedesejar, depois baixe o Apache TomCat em zip ou instalador, descompacte-
o em uma pasta a sua escolha. Para abrir o Eclipse necessrio ter o Java
JDK instalado e configurado as variveis de ambientes.
Vamos criar o Server para rodar a aplicao WEB: no Eclipse, clique com
o boto direito e v em: New>Other...e procure por Server, depois clique
em Next:
Figura 01 - New Others
Figura 02 - Criando Server
-
5/24/2018 Tutorial Java Web Com Jsf 2
9/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 8
Na prxima aba selecione o Apache/Tomcat v7.0 Server:
Figura 03 - Selecionando Server
Clique em Next e o Wizard pedir a pasta onde o TomCat foi
instalado: Clique em Browse... e selecione a pasta onde descompactou oarquivo:
Figura 04 - Escolha do diretrio do TomCat
-
5/24/2018 Tutorial Java Web Com Jsf 2
10/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 9
Cliquem em Finish e agora voc tem seu servidor de aplicao para
rodar seu projeto localmente. Vamos definir ento onde ficar os arquivos
temporrios do projeto para teste: Na aba de Server clique duas vezes no
seu novo Servidor - Tomcat v7.0 Server at localhost - e em Server
Locations clique na segunda opo - Use tomcat installation - salve e
feche a aba:
Figura 05 - Configurao do Server Location
Seu Tomcat j est funcionando, se quiser test-lo, de Start (boto
Play um pouco acima do nome do Tomcat v7.0 da figura) e tente abrir a
pgina localhost:8080, se abrir uma pgina do Tomcat, est tudo ok.
-
5/24/2018 Tutorial Java Web Com Jsf 2
11/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 10
Criando o projeto
Em seu Eclipse com o Tomcat rodando, crie seu projeto web: botodireito > New > Other... (Figura 01) e procure por Dynamic Web Project:
Figura 06 - Criando um Dynamic Web Project
Clique em Next e ser pedido o nome do projeto e algumas
informaes da configurao do mesmo. Usaremos o Wizard do Eclipse
para nos ajudar a fornecer algumas coisas prontas, ento para isso, digite o
nome projeto e selecione em Configuration a opo JavaServer Faces
v2.0 Project, seno aparecer a opo verifique a verso do mdulo se estem 3.0. Com essa simples mudana o Eclipse criar o arquivo faces-
config.xml automaticamente que necessrio para fazer algumas
configuraes do JSF. S para informao, na verso do JSF 1.2 e
anteriores, todas as configuraes eram feitas nesse arquivo XML, a partir
da verso 2.0 comeou-se a usar annotation, no sendo necessrio mais o
uso do faces-config, entretando, ainda tem uma configurao que no
conseguir encontrar a annotation da mesma, o que me fora a usar este
arquivo ainda.
-
5/24/2018 Tutorial Java Web Com Jsf 2
12/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 11
Figura 07 - Configurao do projeto
Defini o nome do meu projeto como portal-virtual e essa ser a forma a
qual irei me referir durante todo o tutorial, para comandos de acesso e
configuraes de pacotes e arquivos mude para o nome que voc escolheu,
caso no seja o mesmo.
Clique em Next, na prxima aba ser perguntando onde ser salvo os
arquivos Java e onde ser salvo o .class no Tomcat, simplesmente
mantenha a configurao clicando em Next. Na outra aba serperguntando a pasta de deploy, onde ficar todas as pginas webs, pastas
-
5/24/2018 Tutorial Java Web Com Jsf 2
13/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 12
criadas e .class para rodar a aplicao. Nesta parte tambm mantenha as
configuraes (mudanas no Context root ir mudar a forma de acessar a
pgina web), apenas pea para o Wizard geraro deployment do web.xml
automaticamente, assim o Eclipse ir gerar a lista de arquivos para
inicializao sozinho:
Figura 08 - Gerar web.xml
V para a prxima aba clicando em Next. Nesta parte o Wizard te
ajuda a configurar o JSF 2.0 j que selecionou que existir o framework,
para isso ele pede as bibliotecas do JavaServer Faces e como ser feito o
acesso e chamada da servlet. Voc pode escolher baixar as bibliotecas do
JSF pelo Eclipse ou que o Wizard no configure esta etapa, para istoselecione: Disable Library Configuration.
Como as bibliotecas se encontram no CODE desabilite a opo de
configurao da biblioteca. Logo abaixo tem a configurao de mapeamento
da servlet do JSF, por padro o acesso a qualquer pgina JSF vem
configurado, pelo Eclipse, como /faces/*.
Vamos com um pouco de explicaes... JSF uma tecnologia para a
construo da interface do usurio, no passa de uma servlet de viso, quetraz HTML e um pouco de JSP embutidos, o que voc faria em algumas
linhas de cdigo tendo que saber todas as tecnologias citadas, voc faz em
uma no JSF. Mas para uma pgina contendo o cdigo do framework
funcionar, voc deve adicionar a biblioteca do JSF para o projeto e dizer
para o servidor que a pgina precisa passar pela servlet do JSF para uma
renderizao, ou seja, ela ter que ser reescrita de forma que o
navegador a reconhea (voltar as vrias linhas de HTML). E como fazerisso?
http://code.google.com/p/portal-virtual/source/browse/#svn%2FTutorial%2Flibshttp://code.google.com/p/portal-virtual/source/browse/#svn%2FTutorial%2Flibshttp://code.google.com/p/portal-virtual/source/browse/#svn%2FTutorial%2Flibs -
5/24/2018 Tutorial Java Web Com Jsf 2
14/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 13
Figura 09 - Configurao do JSF no web.xml
Essa configurao da imagem fica no web.xml, mas o Eclipse nos ajuda,
antes mesmo de criar o projeto, a faz-la. Como informei acima,
precisarmos de uma forma para avisar que uma pgina usa o JSF, e isso
feita na hora de abrir a pgina pela URL, a configurao que eu fiz diz que
toda vez que eu digitar uma pgina na URL e ela terminar com .jsf, essa
pgina deve passar pela servlet do JSF e renderiz-la. Exemplo, se tenhouma pgina na aplicao que o nome dela HelloWorld.xhtml, mas para
acessar ela digito: www.testejava.com.br/HelloWorld.jsf, e no web.xml tem
a configurao citada, o servidor sabe que a pgina contm JSF e ir abri-la
de forma a reconhecer todas linhas contidas no cdigo. Se no entender
bem o que foi dito agora, mais pra frente isso ficar mais claro.
Clique em Finish e teremos nosso projeto criado (Caso abra uma
mensagem pedindo para muda de perspectiva para JAVA Web, clique emYes). Vamos agora adicionar as bibliotecas para o projeto funcionar.
-
5/24/2018 Tutorial Java Web Com Jsf 2
15/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 14
Configurando o projeto
Em seu projeto, v em WebContent/WEB-INF/lib, copie e cole todos .jarque se encontrar na pasta libs doCODE,h
uma diviso de pasta nos sites, copie todas
as bibliotecas de todas as pasta para a
pasta /lib do seu projeto sem criar nova
pasta. Ficar mais ou menos assim:
Conforme figura ao lado tambm, crie as
pastas css, images, pages etemplate dentro do diretrio /WebContent
(para isso clique com boto direito, New-
>Folder ou New->Other...->Folder).
Bibliotecas criadas, vamos habilitar os
frameworks e visualizar no que o Eclipse j
nos ajudou. Dentro do diretrio /WEB-INF
temos o arquivo web.xml, abra-o. Se for a
primeira vez que abre um arquivo XML, ele
deve abrir no modo Design, clique no modo
Source para visualizar o cdigo-fonte (fica
acima da barra de
Markers/Servers/Console, bem no rodap
do web.xml aberto no Eclipse). Segue
abaixo como o web.xml deve ficar, logo
depois explico o cdigo:
Figura 10 - Bibliotecas
portal-virtual
index.html
http://code.google.com/p/portal-virtual/source/browse/#svn%2FTutorial%2Flibshttp://code.google.com/p/portal-virtual/source/browse/#svn%2FTutorial%2Flibshttp://code.google.com/p/portal-virtual/source/browse/#svn%2FTutorial%2Flibshttp://code.google.com/p/portal-virtual/source/browse/#svn%2FTutorial%2Flibs -
5/24/2018 Tutorial Java Web Com Jsf 2
16/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 15
Faces Servletjavax.faces.webapp.FacesServlet 1
Faces Servlet*.jsf
Resource Servletorg.primefaces.resource.ResourceServlet
Resource Servlet/primefaces_resource/*
primefaces.THEMEredmond
Tabela 03 - web.xml
Arquivos XML se iniciam com a tag para a definio da versodo xml e o tipo de codificao (UTF-8), depois vem a tag falando que aquilo
um arquivo do tipo web.xml , esse arquivo, principalmente o
que j citei, mais CTRL C + CTRL V, no h necessidade de decorar isso,
apenas entender como funciona.
O display-name apenas o nome do projeto, no faz interferncia na
aplicao. O wellcome-file-list (gerado porque foi marcado a opo generate
deployment citado na criao do projeto) outro elemento opcional,
inicialmente ele vem uma lista de index.algumaExtenso, que ir buscar no
/WebContext os arquivos em ordem de listagem e tentar execut-los
quando voc tentar acessar o site, exemplificando: o projeto executar
localmente, ento para acessar ele voc digita no browser:
localhost:8080/portal-virtual, tendo o arquivo do wellcome-file-list no
/WebContext o browser tentar abrir a pgina, no tendo nenhum da lista
citado, dar erro dizendo que no existe a aplicao, mesmo que tenha um
arquivo (por exemplo, teste.xhtml) dentro da pasta, ele no ser aberto seno foi citado na lista de entrada, para abrir a pgina citada no estando no
-
5/24/2018 Tutorial Java Web Com Jsf 2
17/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 16
wellcome-file-list ter que ser feita do seguinte modo:
localhost:8080/portal-virtual/teste.xhtml. Nesse wellcome-file-list ainda h
um detalhe, no se pode usar nenhuma pgina que necessite de biblioteca
para abrir, aceita apenas extenses XHTML, HTML, JSP, ou seja, voc no
pode colocar uma pgina .jsf como inicializao do projeto, j que
necessrio usar bibliotecas para exibir a pgina, logo explico como
solucionar o problema. Coloquei, na lista de inicializao, o arquivo
index.html, pois tenho ele na pasta /WebContent que a pgina inicial do
projeto.
O comando servlet serve para definir as servlets existentes no projeto,
dentro dela temos que definir, obrigatoriamente, seu nome e a classe ondedeve ser buscada para execuo da mesma. A primeira que temos a Faces
Servlet, sua classe de compilao fica na biblioteca do JSF que adicionamos
ao projeto no caminho citado na tabela. Logo depois vem o mapeamento da
servlet, ou seja, onde iremos us-la, primeiro dizemos qual a servlet que
queremos mapear, no nosso caso a Faces Servlet que acabamos de criar, e
depois dizemos a url que ela deve ser chamada, no caso *.jsf. Volto na
explicao que disse acima sobre JSF, quando voc pedir no browser
alguma pgina da aplicao e voc diz que sua extenso .jsf a pgina ir
passar pela classe javax.faces.webapp.FacesServlet e ir renderizar o que
aparecer para o usurio, exemplificando: tenho um arquivo chamado
teste.xhtml, dentro dele tenho comandos do JSF, quando eu tentar acess-
la, se apenas dizer que ela uma pgina simples: localhost:8080/portal-
virtual/teste.xhtml, provavelmente ir abrir uma pgina aparecendo apenas
os comandos HTML utilizados e o resto em branco, ou dar um erro, j se
for dito na URL que tem que passar pela servlet do JSF:
localhost:8080/portal-virtual/teste.jsf, mesmo que no exista esse arquivo
.jsf, a aplicao sabe (j que foi mapeado) que isso um comando para
chamar a Faces Servlet, e ir procurar alguma pgina com nome de teste
(independente se .html, .xhtml) e far sua execuo pela servlet, assim
ir exibir a pgina com todos comandos sem problemas.
A prxima servlet a interface rica do Primefaces, dizemos onde sua
classe, definimos seu nome, no mapeamento dizemos onde pegar osrecursos, e depois definimos o parmetro do tema do mesmo (verifique que
-
5/24/2018 Tutorial Java Web Com Jsf 2
18/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 17
h a biblioteca do tema no diretrio /lib), a servlet no um recurso
acessvel por URL como o JSF.
Com esse arquivo web.xml a aplicao ir funcionar com JSF e
Primefaces. O Spring pode ser inicializado com o projeto criando sua servlet
no web.xml, mas fiz uma pesquisa no Google sobre o framework e apareceu
muito pouco o uso desta prtica. Nesse exemplo fiz uma inicializao
diferente que dar para entender bem o Spring, a forma dele ser
inicializado ser apenas um detalhe que no far diferena para o
aprendizado. Se quiser verificar, nesse siteh um uso do Spring inicializado
pelo web.xml.
Vamos criar a pgina de inicializao do projeto, o index.html citado no
wellcome-file-list:
Tabela 04 - index.html
A pgina contm apenas um cabealho mandando recarregar a pgina e
ir para a URL template/template.jsf, com isso resolvemos o problema do
wellcome-file-list no poder abrir uma pgina JSF direto. Somente com esse
cabealho, ao tentar acessar localhost:8080/portal-virtual, o browser far o
redirecionamento para localhost:8080/portal-virtual/template/template.jsf,
como a pgina no existe, dar erro. Vamos agora para os cdigos JAVA.
http://www.javaframework.org/portal/2010/03/14/hello-world-com-spring-3-para-um-projeto-web/http://www.javaframework.org/portal/2010/03/14/hello-world-com-spring-3-para-um-projeto-web/http://www.javaframework.org/portal/2010/03/14/hello-world-com-spring-3-para-um-projeto-web/ -
5/24/2018 Tutorial Java Web Com Jsf 2
19/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 18
Estruturando o projeto...
Vamos criar os pacotes inicialmente e explicarei como ser dividida anossa arquitetura, clique com o boto direito sobre o nome do projeto,
New->Package ou New->Other->Package.
Figura 11 - Package
Em web, se padroniza que os nomes dos pacotes devem vir com o site ao
contrrio e depois o nome do pacote desejado, exemplo, quero criar opacote Teste para meu website www.tutoriais.com.br, ento meu pacote
ficara: br.com.tutoriais.teste, ou se usa o nome do projeto, usando o
mesmo exemplo: no meu site tutoriais tenho o projeto artigos, ento meu
pacote pode ser tambm: br.com.artigos.teste.
Vamos criar os seguintes pacotes: annotation, bundle, control, model,
persistence, sets, e view. Dentro de view ainda teremos o control e o
managed. Usei a base do nome de pacotes como br.ueg.portalVirtual.Criados os pacotes, ficar mais ou menos assim (no se importem com a
cor do package):
Figura 12 - Pacotes do projeto
O primeiro pacote (annotation) ficar as anotaes que criaremos; no
bundle ter apenas arquivos .properties para internacionalizao e
manuteno do JDBC ou qualquer outro que seja necessrio; j em control
-
5/24/2018 Tutorial Java Web Com Jsf 2
20/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 19
ficar nossas classes responsveis pelo controle do projeto/validaes, ou
seja, a camada intermediria entre a persistncia e a viso; em
persistence a nossa persistncia que far a comunicao com o banco de
dados; em sets ficam as configuraes, tanto do Spring como de banco de
dados; em view fica tudo designado para a viso, sendo que dentro de view
temos control e managed, o primeiro so controladores que a viso obriga
voc a criar e no managed so os gerenciadores da viso, como usamos o
JSF nesse pacote que ficam as classes de ManagedBean.
-
5/24/2018 Tutorial Java Web Com Jsf 2
21/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 20
Programando - Modelo e suas dependncias
Pronto nossa estrutura, vamos comear a programar, nossa camada maisbaixa o modelo, mas antes de cri-la, devemos criar nossas annotations
que sero utilizadas pela camada citada. No Java, annotation so chamadas
com o @nomeDaAnnotation, elas so marcaes que podem ficar na classe,
no mtodo ou no atributo e podem conter atributos para serem
preenchidos, no JSF 2.0 trabalhamos com annotation em vez de XML, a
nica parte XML que fizemos at agora, e no passa disso, foi no web.xml.
Para criar uma annotation devemos criar uma interface, s que na verdade
criamos uma @interface, isso define que aquela classe uma annotation.
Clique com o boto direito no projeto e v em New>Annotation:
Figura 13 - New>Annotation
Defina o nome da Annotation como RequiredField e a salve no pacote
especfico para ela: br.ueg.portalVirtual.annotation, a responsabilidade
dessa classe marcar atributos que so obrigatrio o preenchimento.
packagebr.ueg.portalVirtual.annotation;
import java.lang.annotation.ElementType;
-
5/24/2018 Tutorial Java Web Com Jsf 2
22/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 21
import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)public@interfaceRequiredField{
}
Tabela 05 - RequiredField.java
Veja que a classe no tem corpo, usei-a apenas como marcador de
campos obrigatrios. necessrio definir o tipo de elemento onde ser
usado a annotation, no nosso caso para atributos (elementType.FIELD), e
temos que definir a poltica de reteno que ser em execuo
(RetentionPolicy.RUNTIME), sem a definio da poltica a annotation no
ir funcionar bem.
Vamos agora para a camada mais baixa: o modelo. Dentro do pacote
/model crie a classe Entity (New->Class), marque-a como abstract. Veja na
figura que temos Superclass e Interfaces logo abaixo do nome da classe, o
primeiro serve para voc buscar a classe que deseja extender (extends) e o
segundo para adicionar interfaces (implements). Clique em Add... e
procure a interface java.io.Serializable e a adicione:
-
5/24/2018 Tutorial Java Web Com Jsf 2
23/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 22
Figura 14 - New>Class
packagebr.ueg.portalVirtual.model;
importjava.io.Serializable;
@SuppressWarnings("serial")publicabstractclassEntity implementsSerializable{
publicabstractlonggetId();
@OverridepublicinthashCode() {
finalintprime = 31;intresult = 1;result = prime * result + Long.signum(getId() ^ (getId()
>>> 32));returnresult;
}
-
5/24/2018 Tutorial Java Web Com Jsf 2
24/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 23
@Overridepublicbooleanequals(Object obj) {
if(this== obj)returntrue;
if(obj == null)returnfalse;
if(getClass() != obj.getClass())returnfalse;
Entity other = (Entity) obj;if(getId() != other.getId())
returnfalse;returntrue;
}
publicabstractString getSearchColumnTable();publicabstractString getSearchColumnEntity();
}
Tabela 06 - Entity.java
Se no pediu para implementar o Serializable na classe, ento digite o
implements como segue na tabela, logo depois do nome dado a class.
Antes da declarao da classe temos uma annotation do Eclipse de
advertncia, no h necessidade dela, serve apenas para no deixar a
classe marcada com o sinal de ateno (@SuppressWarning apenas uma
anotao para que o Eclipse no faa algumas validaes e deixe de avisar
algumas coisas, nesse caso a SuppressWarning pede para no avisar sobre
o serial ID que toda classe que implementa o Serializable deve ter, mas no
faz interferncia na aplicao, por isso apenas um pedido de ateno que
eu mandei ignor-lo).
Essa classe abstrata apenas um marcador, ela obriga a implementar o
mtodo de getId retornando um long, que ser a chave primria do objeto.
Toda objeto que ser persistido no banco de dados deve implementar uma
classe de marcao informando que o objeto virar um array of bytes(dados que sero persistidos), e o Serializable serve exatamente como
marcador para tal objetivo. Repare que os mtodos hashCode e equals
esto marcados como @Override, isso quer dizer que eles foram
sobrescritos, e usei o Eclipse para fazer isso automaticamente para mim
(clique como boto direito sobre o cdigo da classe, v em
Source>Generate hashCode() and equals()...), como essa classe no tem
nenhum atributo, no possvel pedir para o Eclipse gerar o hashCode e
equals, ento crie o atributo id (private long id;) e pea para gerar
-
5/24/2018 Tutorial Java Web Com Jsf 2
25/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 24
automaticamente, depois de gerado, apague o atributo e substitua nos
mtodos hashCode e equal o uso do atributo id pelo mtodo getId, repare
tambm que no lugar do resultado da Id no hashCode tem o mtodo de
converso Long.signum(long i) que converte um Long em Integer.
Por ltimo temos os mtodos abstratos getSearchColumnTable e
getSearchColumnEntity, esse mtodos servem para criamos um s mtodo
de busca para qualquer classe (ver no pacote de persistncia), o primeiro
retorna qual o nome da coluna no banco de dados que usaremos como
pesquisa e o ltimo o nome do atributo da classe que usaremos para
efetuar a busca.
Todas classes no pacote /model devem herdar a Entity.
No banco de dados temos as tabelas reino e filo, devemos entrar criar as
classes para fazer a correspondncia no projeto:
packagebr.ueg.portalVirtual.model;
importjavax.persistence.Column;import javax.persistence.GeneratedValue;importjavax.persistence.Id;importjavax.persistence.OneToMany;importjavax.persistence.Table;
import br.ueg.portalVirtual.annotation.RequiredField;
@SuppressWarnings("serial")@javax.persistence.Entity@Table(name = "reino")publicclassReino extendsEntity {
@Id@GeneratedValue@OneToMany(targetEntity = Filo.class, mappedBy = "reino")@Column(name = "id_reino")privatelongid;
@Column(name = "nome")@RequiredFieldprivateString reino;
publicReino() {}
publicReino(longid, String reino) {this.id= id;this.reino= reino;
}
publiclonggetId() {
returnid;}
-
5/24/2018 Tutorial Java Web Com Jsf 2
26/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 25
publicvoidsetId(longid) {this.id= id;
}
publicString getReino() {
returnreino;}
publicvoidsetReino(String reino) {this.reino= reino;
}
@OverridepublicString getSearchColumnTable() {
return"nome";}
@Override
publicString getSearchColumnEntity() {return"reino";
}
}
Tabela 07 - Reino.java
Aqui j temos o uso do JPA verifique que acima da declarao da classe
Reino h 2 annotation: @Entity e @Table, essas mesmas annotation existe
no Hibernate, mas utilizo a do JPA para haver maior flexibilidade de
tecnologias.O Hibernate um framework de persistncia que pode ou no utilizar as
especificaes do JPA, j que o Hibernate tem suas prprias especificaes
(nada mais que CTRL + C, CTRL + V no JPA). Vamos ver ento o Hibernate
como um container e o JPA como a ferramenta para fazer o container
funcionar. Se utilizarmos o Hibernate, ele por si s tem suas ferramentas
para entrar em funcionamento, mas e se no quisermos aquele container?
Se quisermos trocar por outro que atenda nossas necessidades no
momento, teremos que adicionar o novo container e mudar tudo que usa o
container para as novas ferramentas. O JPA j essa ferramenta, se
usarmos no projeto as especificaes do JPA, podemos mudar o container
(Hibernate) por outro com o mnimo de implicaes possveis, por isso uso
sempre as especificaes do JPA em vez do Hibernate.
A partir de agora, se voc no fez a leitura do artigo do Felipe Saab sobre
Spring e Hibernate isso o prejudicar numa melhor compreenso, ento,
leia!
http://www.javasimples.com.br/spring-2/spring-framework-parte-5-spring-web-mvc/http://www.javasimples.com.br/spring-2/spring-framework-parte-5-spring-web-mvc/http://www.javasimples.com.br/spring-2/spring-framework-parte-5-spring-web-mvc/ -
5/24/2018 Tutorial Java Web Com Jsf 2
27/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 26
A annotation @Entity um marcador informando que aquela classe ser
persistida e tem uma correspondente no banco de dados. A @Table(name)
informa qual o nome da tabela correspondente aquele objeto, ou seja, no
nosso banco de dados criamos a tabela reino e nossa classe Reino faz
referencia a essa tabela.
Foi criado ento o atributo id, do tipo long, e como annotation para esse
atributo temos: @Id, que determina que esse atributo a primary key do
objeto; @GeneratedValue, marcao para que quando a entidade for
persistida gere um valor automaticamente, ou seja, no h necessidade de
defini-la quando quiser salvar um novo registro; @OneToMany, essa
annotation do tipo relacional, serve para dizer que esse atributo umaforeign key de outra tabela, veja que foi definido os atributos targetEntity e
mappedBy, o targetEntity para onde esse valor vai, ou seja, onde ele ser
a foreign key, o mappedBy quer dizer quem est o mapeando, de onde
deve se pegar esse valor (a primary key da tabela reino); e por ultimo
temos o @Column, como o prprio nome diz, nessa annotation voc define
qual o nome da coluna no banco de dados.
Como ultimo atributo temos o reino, do tipo String, e suas annotationsso: @Column, para definir a coluna da tabela; e @RequiredField, ai est
nossa annotation, marcando o atributo reino como campo obrigatrio,
depois veremos como vamos utiliz-la.
Crie dois construtores para instnciar a classe sem fazer nada e outro
passando os parmetros id e reino associando aos atributos locais, o ltimo
construtor necessrio para uma validao no JSF que veremos depois.
Segue os mtodos getters and setters dos atributos, para ger-losautomaticamente clique com o boto direito sobre o cdigo da classe, v
em Source -> Generate Getters and Setters... selecione todos os atributos e
clique em Ok, caso voc j tenha pedido para o Eclipse adicionar os
mtodos obrigatrios no implementados, delete o mtodo getId() e deixe o
Generate Getters and Setters recri-lo.
Por ltimo temos os mtodos getSearchColumnTable e
getSearchColumnEntity que a classe Entity nos obrigou a escrever, o
primeiro retorna o nome da coluna no banco de dados que usamos para
-
5/24/2018 Tutorial Java Web Com Jsf 2
28/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 27
pesquisa (nome, veja que o mesmo da annotation @Column do atributo
reino), o ltimo retorna o nome do atributo que representa a coluna de
pesquisa, ou seja o prprio atributo reino.
Prxima entidade que temos no banco de dados o Filo:
packagebr.ueg.portalVirtual.model;
importjavax.persistence.Column;import javax.persistence.GeneratedValue;importjavax.persistence.Id;import javax.persistence.JoinColumn;importjavax.persistence.ManyToOne;importjavax.persistence.Table;
import br.ueg.portalVirtual.annotation.RequiredField;
@SuppressWarnings("serial")@javax.persistence.Entity@Table(name = "filo")publicclassFilo extendsEntity {
@Id@GeneratedValue@Column(name = "id_filo")privatelongid;@Column(name = "nome")@RequiredFieldprivateString filo;
@ManyToOne(optional = false, targetEntity = Reino.class)@JoinColumn(name = "id_reino", referencedColumnName ="id_reino")
@RequiredFieldprivateReino reino;
publicFilo() {}
publicFilo (longid, String filo, Reino reino) {this.id= id;this.filo= filo;this.reino= reino;
}
publiclonggetId() {returnid;
}
publicvoidsetId(longid) {this.id= id;
}
publicString getFilo() {returnfilo;
}
publicvoidsetFilo(String filo) {this.filo= filo;
}
-
5/24/2018 Tutorial Java Web Com Jsf 2
29/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 28
publicReino getReino() {returnreino;
}
publicvoidsetReino(Reino reino) {this.reino= reino;
}
@OverridepublicString getSearchColumnEntity() {
return"filo";}
@OverridepublicString getSearchColumnTable() {
return"nome";}
}
Tabela 08 - Filo.java
A classe segue o mesmo esquema que a anterior, verifique que o atributo
da annotation @Table passou a ser filo, o nome da tabela que
corresponde esse objeto no banco de dados. Temos o atributo id com suas
annotations, o atributo filo que um campo obrigatrio (@RequiredField) e
temos o atributo reino (tambm obrigatrio), sendo a nossa foreign key que
mapeamos na classe Reino, mas temos que fazer as especificaes dorelacionamento na classe Filo tambm, para isso temos a annotation
@ManyToOne (inverso do que foi declarado no Reino) dizendo que um
atributo obrigatrio (false para optional) e que ele vem da classe Reino;
logo depois de qual coluna o valor vem pela annotation @JoinColumn,
informando o nome da coluna de destinoid_reino, na tabela filo, e o nome
da coluna de origem, tambm id_reino, na tabela reino (definido pelo
targetEntity do @ManyToOne). De uma olhada na SQL do seu banco dedados para ver as comparaes.
Depois segue os construtores da classe com seus getters and setters e os
mtodos abstratos de Entity que nos obrigou a escrever agora retornam os
nomes da coluna de pesquisa relacionados a entidade (filo de
getSearchColumnEntity) e do banco de dados (nome de
getSearchColumnTable).
Terminamos o nosso modelo, vamos para a persistncia do mesmo.
-
5/24/2018 Tutorial Java Web Com Jsf 2
30/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 29
Programando - Persistncia
Para a persistncia, necessitamos do Hibernate, criaremos uma classegenrica que deve receber algum objeto que herde Entity, ou seja, nosso
modelo, e ir fazer qualquer ao no banco de dados a partir disso. Uma
classe de persistncia bsica (CRUD) ter apenas os comandos para salvar,
listar, buscar, alterar e deletar, para isso criaremos uma interface contendo
as assinaturas desses mtodos. V ento no pacote de persistncia, clique
com o boto direito sobre ele -> New -> Interface e defina o nome da
interface para IGenericDAO:
Figura 15 - New>Interface
package br.ueg.portalVirtual.persistence;
importjava.util.List;
import br.ueg.portalVirtual.model.Entity;
publicinterfaceIGenericDAO {
publiclongsave(E entity);publicvoidupdate(E entity);publicvoiddelete(E entity);publicList findByCriteria(E entity, String value);publicList findByHQL(E entity, String value);List getList(E entity);
}
Tabela 09 - IGenericDAO.java
Logo aps o nome da interface temos o uso de Generics (), essa
pratica utilizada pelo Java no ArrayList, HashMap, entre outros. Serve
para no precisarmos definir o tipo do elemento para a classe,
generalizamos para um tipo E (Elemento) e quando instnciamos a classe
que definimos qual o tipo dela, exemplo, no ArrayList se usa generics,
mas s quando voc da um new ArrayList voc define o tipo que o
ArrayList ir utilizar. O mesmo acontece com nossa interface, ela persiste o
tipo E que extende de Entity, no sabemos qual o tipo, apenas obrigamos
que qualquer classe que seja usada no Generics, tenha extendido o Entity.
Segue, na interface, as assinaturas dos mtodos de salvar, atualizar,deletar, procurar e listar a entidade.
-
5/24/2018 Tutorial Java Web Com Jsf 2
31/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 30
Agora hora de implementar esses mtodos, clique com o boto direito
sobre o pacote de persistncia e v em New -> Class e crie a classe
GenericDAO:
package br.ueg.portalVirtual.persistence;
importjava.util.List;
import org.hibernate.criterion.DetachedCriteria;import org.hibernate.criterion.Restrictions;import org.springframework.orm.hibernate3.HibernateTemplate;
import br.ueg.portalVirtual.model.Entity;
publicclassGenericDAO implementsIGenericDAO{
privateHibernateTemplate hibernateTemplate;
publicvoid setHibernateTemplate(HibernateTemplatehibernateTemplate) {
this.hibernateTemplate= hibernateTemplate;}
@Overridepubliclongsave(E entity) {
return(Long) hibernateTemplate.save(entity);}
@Overridepublicvoidupdate(E entity) {
hibernateTemplate.update(entity);}
@Overridepublicvoiddelete(E entity) {
hibernateTemplate.delete(entity);}
@SuppressWarnings("unchecked")@OverridepublicList findByCriteria(E entity, String value) {
DetachedCriteria criteria =DetachedCriteria.forClass(entity.getClass()).add(Restrictions. like(entity.getSearchColumnEntity(), "%"+value+"%"));
returnhibernateTemplate.findByCriteria(criteria);}
@SuppressWarnings("unchecked")@OverridepublicList findByHQL(E entity, String value) {
String hql = "from "+ entity.getClass().getSimpleName() +" where "+ entity.getSearchColumnTable() +" like '%"+value+"%'";
returnhibernateTemplate.find(hql);}
@SuppressWarnings("unchecked")
-
5/24/2018 Tutorial Java Web Com Jsf 2
32/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 31
@OverridepublicList getList(E entity) {
return(List)hibernateTemplate.loadAll(entity.getClass());
}
}
Tabela 10 - GenericDAO.java
A classe GenericDAO, assim como sua interface, tambm usa Generics.
Assim que der o implements passe o mouse sobre o erro que aparecer na
classe e pea para add unimplemented methods, crie o atributo
hibernateTemplate, do tipo HibernateTemplate, que o mtodo que oferece
os servios de persistncia do Hibernate, crie um setHibernateTemplate
para o Spring gerenciar a instncia desse objeto. Se voc leu o artigo do
Felipe Saab,sabe que o Spring gerencia a instncia de uma classe e injeta
os objetos necessrios para os atributos existente nela (injeo de
dependncia). A classe GenericDAO ser gerenciada pelo Spring, o objeto
hibernateTemplate no e no ser inicializado pelo Java, e o nosso
framework que ficar responsvel por isso, logo veremos que o Spring ter
uma instncia de um objeto do tipo HibernateTemplate, com todos seus
atributos setados, ento injetaremos esse objeto no hibernateTemplate danossa classe de persistncia, a partir da ele poder fazer aes, resumindo,
em vez de no construtor da classe GenericDAO eu passar um new
HibernateTemplate() para o objeto e depois setar os atributos obrigatrios,
deixo essa parte para o Spring e no preciso me preocupar o tempo que
esses objetos ficaram na memria e de que forma, o prprio framework
gerencia isso, da melhor forma que ele achar necessrio.
Como o Spring tratar da inicializao do hibernateTemplate, tomemos o
como inicializado e vamos us-lo sem preocupao. Para cada mtodo
criado na interface de persistncia h um correspondente no Hibernate,
para o save, o Hibernate tem o mesmo mtodo, que precisa que se passe
um objeto com os atributos setados e que tenham annotations de
persistncia que indiquem qual a tabela e a coluna dos atributos, ento o
Hibernate far a persistncia do mesmo.
O mesmo se segue para os outros mtodos, uma pequena observao
para o mtodo de busca, que pode ser feito por Criteria ou por HQL, no
http://www.javasimples.com.br/spring-2/spring-framework-parte-5-spring-web-mvc/http://www.javasimples.com.br/spring-2/spring-framework-parte-5-spring-web-mvc/http://www.javasimples.com.br/spring-2/spring-framework-parte-5-spring-web-mvc/ -
5/24/2018 Tutorial Java Web Com Jsf 2
33/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 32
primeiro, voc cria um objeto que voc define a tabela onde voc quer
pesquisar atravs do objeto anotado, de que forma quer pesquisar, no
nosso caso usando o LIKE, qual coluna que dever ser analisada e o objeto
a ser comparado com a coluna. Por isso criamos um DetachedCriteria para
a classe em anlise (entity.getClass) e pedimos uma pesquisa usando o
LIKE para o atributo de pesquisa (getSearchColumnEntity). O Criteria
analisa o objeto, e no os registros no banco de dados, ento ele vai na
classe, verifica suas annotations, depois escreve uma SQL correspondente
para fazer a consulta.
No HQL acontece da mesma forma, s que em vez de criarmos um objeto
que far a pesquisa, nos escrevemos a SQL, o que nos da maior liberdade.S que diferente do Criteria, o HQL j vai direto para o banco de dados, usa
apenas a annotation para saber o nome da tabela, ento devemos escrever
o mais prxima da forma que a SQL deve ficar. Nossa SQL para consulta,
na tabela reino, seria: SELECT * FROM Reino WHERE nome LIKE
%valorASerConsultado%;. O HQL resume algumas coisas desnecessrias,
voc no precisa falar que uma consulta, ento omitimos o SELECT *, j
que essa sua nica funo, dizemos qual a classe onde est a annotation
da tabela (Reino, atravs do mtodo entity.getClass().getSimpleName que
retorna o nome da classe sem o pacote) e a coluna a ser pesquisada (nome,
que foi definido no mtodo getSearchColumnTable) e depois o valor a ser
analisado. Com isso pudemos visualizar melhor o uso dos mtodos
abstratos de Entity.
Por ltimo temos o listar, que mandar carregar todos os dados de uma
tabela (classe anotada no Java).
Temos nossa persistncia criada, vamos configurar a conexo com o
banco de dados, depois o Spring.
-
5/24/2018 Tutorial Java Web Com Jsf 2
34/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 33
Programando - Conectando com o Banco de dados
Precisamos criar uma conexo com o nosso banco de dados para podefazer as aes que definimos na classe GenericDAO. J adicionamos o driver
jdbc que far a comunicao entre o Java e o SQLServer (espero!) agora
basta estabelecermos a conexo com o database criado. Para isso, crie uma
classe com o nome de Connect no nosso pacote de configuraes
(br.ueg.portalVirtual.sets), para facilitar nosso trabalho, extenda a classe
DriverManagerDataSource do Spring:
packagebr.ueg.portalVirtual.sets;
importjava.util.ResourceBundle;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
publicclassConnect extendsDriverManagerDataSource{
privateResourceBundle jdbc;
publicConnect() {jdbc=
ResourceBundle.getBundle("br/ueg/portalVirtual/bundle/jdbc" );
this.setDriverClassName(jdbc.getString("driverClassName"));this.setUrl(jdbc.getString("url"));this.setUsername(jdbc.getString("username"));this.setPassword(jdbc.getString("password"));
}
}
Tabela 11 - Connect.java
A classe tem apenas um atributo chamado jdbc do tipo ResourceBundle.
Bundle um arquivo do tipo .properties que contm apenas texto, sendo
que cada linha composta por: texto, sinal de igualdade e mais texto; o
lado esquerdo da igualdade a chave para se pesquisar e o lado direito da
igualdade o valor que representa a chave (seria a key e value de um
HashMap, por exemplo). Ento para se obter o lado direito da igualdade,
voc deve buscar enviando o texto do lado esquerdo.
No construtor da nossa classe inicializamos nosso ResourceBundle
pedindo para pegar o Bundle jdbc(arquivo jdbc.properties) que fica no
pacote br.ueg.portalVirtual.bundle. Nossa classe Connect responsvel porestabelecer a conexo com o banco de dados, para isso precisamos definir
-
5/24/2018 Tutorial Java Web Com Jsf 2
35/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 34
alguns atributos no nosso gerenciador do driver para que ele possa
entender que banco de dados utilizamos, como dever criar as SQLs e
qual database analisar. Como citei anteriormente, devemos extender o
DriverManagerDataSource do Spring para facilitar nossas vidas, e nessa
super-classe temos os atributos DriverClassName, URL, Username e
Password que so necessrios preencher. O primeiro diz qual banco de
dados utilizamos, a URL diz o caminho da database, e dois ltimos
informam o usurio e senha para se logar no banco de dados. Como
utilizamos o SQLServer o DriverClassName
com.microsoft.sqlserver.jdbc.SQLServerDriver (isso para o Driver original
da Microsoft), nossa URL ser o banco de dados instalado localmente namquina, especificando qual database em seguida, ento para dizer que
usaremos o servidor local, a URL ser: jdbc:sqlserver://127.0.0.1:1433 do
banco de dados portal_virtual (databaseName=portal_virtual) e depois
colocamos o usurio e a senha que setamos no banco de dados. At agora
eu informei o que tem que ser passado para os atributos, mas no cdigo da
classe de conexo est diferente, veja que eu peo para o Bundle uma
String, mandando suas respectivas chaves de busca, ou seja, mandei o lado
esquerdo da igualdade de um Bundle. Vamos ento construir esse
ResourceBundle para que a classe funcione, clique com o boto direito
sobre o pacote de bundles e depois v em New>Other...>File, digite o
nome jdbc.properties ( necessrio digitar a extenso do arquivo) e
Finish:
driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver url=jdbc:sqlserver://127.0.0.1:1433;databaseName=portal_virtual username=ueg
password=portuegTabela 12 - jdbc.properties
Na criao do banco de dados citei que voc poderia criar o mesmo
usurio que uso no projeto ou alterar o arquivo Properties que tem as
informaes do banco de dados. Esse o arquivo, se voc no criou o
mesmo usurio e senha, pode alterar agora nesse arquivo, caso contrrio,
mantenha as configuraes e sua classe Connect funcionar perfeitamente
pegando os dados de conexo desse arquivo.
-
5/24/2018 Tutorial Java Web Com Jsf 2
36/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 35
Configurando o Spring
As bibliotecas do Spring j foram adicionadas quando configuramos oprojeto (preciso repetir que espero?! =D), ento basta configurar a sua
inicializao e o que ele deve fazer no projeto. H duas formas de
configurao do Spring, por annotation e por XML, eu gosto de annotation,
pra mim XML cai em desuso a cada dia, alm de ser mais chato, mas se
voc usar annotation haver um problema no controlador de viso do
Spring (justamente na annotation @Controler), que ainda no consegui
resolv-lo, e se usarmos annotation seria bom configura a inicializao do
Spring junto ao projeto, que citei anteriormente que tambm est caindo
em desuso. Decidi, ento, usar XML para a configurao e a no
inicializao do Spring junto ao projeto, depois mando outra verso do
tutorial explicando como funciona com annotation, apesar de que mesmo
usando annotation, voc deve criar o XML do Spring dizendo que vai usar
annotation... Pois bem, na nossa camada de configuraes
(br.ueg.portalVirtual.sets) crie uma XML com o nome de spring, New >
Other... > XML File:
-
5/24/2018 Tutorial Java Web Com Jsf 2
37/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 36
br.ueg.portalVirtual.model.Reino br.ueg.portalVirtual.model.Filo
org.hibernate.dialect.SQLServerDialect trueupdate
Tabela 13 - spring.xml
Iniciamos nosso XML, depois definimos que ele um arquivo do Spring
com a tag dentro dessa tag esto todos os pacotes do Spring
que utilizaremos (acha que aquele tanto de biblioteca muito... no viu
nada ainda!). O aop (xmlns:aop) declarado a programao orientado a
aspectos do Spring, se quiser retir-la, fique a vontade, est ai para alguns
testes meus e a possvel incorporao da AOP no prximo (se houver)
tutorial. Nesse arquivo XML tambm use o mtodo CTRL + C, CTRL + Vpara nossa tag inicial.
Depois de definir que o arquivo um configurador do Spring, iniciamos
com a tag ela designa os objetos que usaremos, seria a instancia
do objeto, e o primeiro objeto declarado foi nossa conexo com o banco de
dados, que dei o nome de dataSource (id do bean) e informei para o Spring
onde se localiza essa classe para ele fazer sua instancia :
br.ueg.portalVirtual.sets.Connect (o nico atributo dessa classe nos oinstanciamos no construtor da mesma, ento no necessrio pedir para o
-
5/24/2018 Tutorial Java Web Com Jsf 2
38/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 37
Spring gerenci-lo). Definido essa tag, j temos a conexo com o banco de
dados criada, e podemos referenci-la pelo id dado (dataSource).
Na prxima tag temos a definio da sessionFactory, um atributo
necessrio para inicializar o hibernate, setamos seu nome e a localizao da
classe nos pacotes do Spring e definimos algumas propriedades (atributos),
como fizemos o uso das annotations do JPA para configurao das
entidades, devemos definir a propriedade do atributo annotatedClasses
com isso o Hibernate ir ler as annotations contidas nas classes e no ir
procurar um arquivo XML para fazer as anlises. Essa propriedade uma
lista de entidades declaradas para o uso no projeto, e por isso devemos
definir quais so. Como criamos apenas duas, Reino e Filo, dizemos sualocalizao no value da lista. Prximo propriedade a ser declarada o
hibernateProperties, sendo que essa propriedade tem propriedades dentro
delas a ser definidas (mais atributos), mas no necessrio definir todos,
nesse projeto definimos o dialect que seria a linguagem utilizada pelo
banco de dados, como usamos o SQLServer, o dialect :
org.hibernate.dialect.SQLServerDialect, depois definimos para mostrar a
SQL (true), isso serve apenas para testes no desenvolvimento, quando for
implantar o projeto normalmente desabilita essa opo, j que ser apenas
algo escrito no console sem uso nenhum. Por ultimo definimos o
hbm2ddl.auto, essa propriedade diz como deve tratar o banco de dados, se
tem um alto controle: criar tabelas, salvar, atualizar e listar dados, definido
por create, e se pode apenas salvar, atualizar e listar os dados, definido
por update (que o nosso caso), tem mais alguns tipos, mas no irei cit-
los. Se estiver setado o hbm2ddl como create, voc nem precisaria criar as
tabelas, apenas criava a database e executava o projeto que ele criaria
sozinho, mas prefiro no usar esse recurso.
Como ltima propriedade do hibernateProperties, precisamos passar a
conexo com o banco de dados para o Hibernate poder fazer alguma coisa,
como j definimos ela pelo Spring, basta passar o a referncia pelo nome
que a demos: ref=dataSource e por aqui termina a definio da sesso do
Hibernate.
-
5/24/2018 Tutorial Java Web Com Jsf 2
39/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 38
Lembra que nossa classe GenericDAO temos um atributo do tipo
HibernateTemplate, vamos agora setar as propriedades desse objeto e criar
uma instancia pelo Spring, e a prxima tag de isso. Definimos o
id do HibernateTemplate e a localizao da classe, depois definimos suas
propriedades, que apenas uma: sessionFactory, como estamos
controlando essa instancia tambm pelo Spring, basta passar a referncia
da mesma, assim como j fizemos e pronto, temos um objeto do tipo
HibernateTemplate.
Vamos utilizar o objeto que acabamos de criar na nossa classe de acesso
aos dados do banco. Crie a tag com o id de genericDAO e passe
onde se localiza a nossa classe GenericDAO, como ns mesmo criamos essaclasse, sabemos que h a necessidade de definir apenas uma propriedade,
a hibernateTemplate, e como j temos a instancia desse objeto pelo Spring,
passe apenas a referncia da mesma.
Pronto, nosso Spring j est configurado, gerenciando o Hibernate e
fazendo injeo de dependncia na classe GenericDAO. O Spring enorme
e pode fazer vrias coisas, e com esse tanto de linhas no XML apenas
configuramos o que foi citado. Poderamos gerenciar tambm outrasclasses, mas como citei que h um problema no controlador da viso do
Spring, preferi no estender essa injeo de dependncias.
Spring configurado, mas como iremos instanciar a GenericDAO? Como a
aplicao saber que estamos utilizando o Spring? Para resolver isso,
vamos criar uma classe de instanciao dos beans definidos no XML (apenas
a GenericDAO).
-
5/24/2018 Tutorial Java Web Com Jsf 2
40/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 39
Programando - Fbrica de Beans
No tutorial doFelipe Saab,ele citou o AplicationContext para retornar asinstancias dos objetos controlados pelo Spring, e disse que o BeanFactory
seria outro mtodo de trazer esses objetos, s que bastante simples. Fiz a
anlise dos dois e decidi criar a minha fbrica de beans, ou a minha
extenso do AplicationContext.
Para isso, crie uma classe com o nome de SpringFactory e extenda a
classe ClassPathXmlApplicationContext do Spring:
packagebr.ueg.portalVirtual.sets;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
publicclassSpringFactory extendsClassPathXmlApplicationContext {
privatestaticClassPathXmlApplicationContext instance= null;
publicstaticClassPathXmlApplicationContext getInstance() {if(instance== null) {
instance= newClassPathXmlApplicationContext( "br/ueg/portalVirtual/sets/spring.xml" )
; }returninstance;
}
privateSpringFactory() {}
}
Tabela 14 - SpringFactory.java
Essa classe usa o Design Pattern (Padro de Projeto) Singleton. Esse
mtodo faz com que haja somente uma instancia da classe que o
implemente na aplicao toda. Esse mtodo bastante usado e soluciona
vrios problemas, nesse caso no necessrio o uso desse Design Pattern,
o usei porque gosto e no ficar gerando a mesma instancia do
AplicationContext em diferentes objetos.
Para esse Padro de Projeto funcionar, voc tem que desabilitar a
possibilidade de instanciar a classe, fazendo com que o construtor seja
privado, e crie um mtodo esttico que retorne a instancia do objeto, nesse
http://www.javasimples.com.br/spring-2/spring-framework-parte-5-spring-web-mvc/http://www.javasimples.com.br/spring-2/spring-framework-parte-5-spring-web-mvc/http://www.javasimples.com.br/spring-2/spring-framework-parte-5-spring-web-mvc/http://www.javasimples.com.br/spring-2/spring-framework-parte-5-spring-web-mvc/ -
5/24/2018 Tutorial Java Web Com Jsf 2
41/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 40
mtodo ele ir verificar se h alguma instancia ou no, no havendo ele
gera a instancia.
No mtodo esttico eu retornei um ClassPathXmlApplicationContext que
pode ser convertido em um AplicationContext contendo os mtodos de
retorno de beans configurados no spring.xml (Veja a semelhana com o
mtodo que o Felipe Saab usa).
Agora que temos nossa classe que traz os objetos gerenciados pelo
Spring, vamos construir nosso controlador.
-
5/24/2018 Tutorial Java Web Com Jsf 2
42/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 41
Programando - Criando nossos controladores
Na camada de controle, ficaro nossas classes de controle depersistncia, de validao e de mensagens, tambm poderia ficar nesse
pacote as regras de negcios, se existissem. Vamos comear com os
controladores auxiliares, crie, ento, a classe ValidatorControl:
packagebr.ueg.portalVirtual.control;
importjava.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;importjava.util.ArrayList;
importjava.util.List;
import br.ueg.portalVirtual.annotation.RequiredField;import br.ueg.portalVirtual.model.Entity;
publicclassValidatorControl {
privateList emptyFields;
publicValidatorControl() {emptyFields= newArrayList();
}
@SuppressWarnings("rawtypes")publicbooleanisEmpty(Entity entity) {
clean();booleanempty = false;Class entityClass = entity.getClass();Field[] fields = entityClass.getDeclaredFields();for(Field currentField:fields) {
try{
currentField.getAnnotation(RequiredField.class);Object fieldValue = getField(entity,
currentField.getName());if(fieldValue == null||
fieldValue.equals("")) { empty = true;emptyFields.add(currentField.getName());
}}catch(Exception e) {
// do nothing yet}
}returnempty;
}
publicbooleanisEmpty(String value) {clean();
booleanempty = false;if(value == null|| value.equals("") ) {empty = true;
-
5/24/2018 Tutorial Java Web Com Jsf 2
43/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 42
emptyFields.add("Busca");}returnempty;
}
@SuppressWarnings({ "unchecked", "rawtypes"})privateObject getField(Entity entity, String fieldName) throws
SecurityException, NoSuchMethodException, IllegalArgumentException,IllegalAccessException, InvocationTargetException {
Class entityClass = entity.getClass();Method method = entityClass.getMethod("get"+
fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1));returnmethod.invoke(entity);
}
publicvoidclean() {emptyFields.clear();
}
publicList getEmptyFields() {returnemptyFields;
}
}
Tabela 15 - ValidatorControl.java
Devo dizer que essa umas das minhas classes favoritas, pois usa o Java
Reflection para validar qualquer classe que extenda Entity (=D), e aqui
que veremos o uso da nossa annotation @RequiredField.
Para nvel de conhecimento, Reflection uma prtica que podemos
analisar a classe em tempo de execuo, assim descobrimos quais atributos
ela tem, seus mtodos e podemos at invoc-los. No uma prtica
recomendada para quem est iniciando no Java, pois requer um
conhecimento maior da linguagem, mas errando que se aprende.
Tem algumas caractersticas que definem a Reflection, que a
introspeco e a interseco. No Java tem a introspeco que a
capacidade da classe se auto-examinar, a interseco a capacidade de
tomar uma deciso em tempo de execuo. Essa prtica muito mais do
que foi citado, mas somente isso o bastante para ter conhecimento do
que estamos usando. Para mais informaes tem umas boas explicaes na
OracleeGUJ.
Nossa classe tem como atributo uma lista de String com nome de
emptyFields, que usaremos para relacionar todos os campos obrigatrios
http://download.oracle.com/javase/tutorial/reflect/index.htmlhttp://download.oracle.com/javase/tutorial/reflect/index.htmlhttp://www.guj.com.br/articles/10http://www.guj.com.br/articles/10http://www.guj.com.br/articles/10http://www.guj.com.br/articles/10http://download.oracle.com/javase/tutorial/reflect/index.html -
5/24/2018 Tutorial Java Web Com Jsf 2
44/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 43
que no foram preenchidos. O construtor apenas inicializa essa lista com
nada dentro.
Vamos entender os mtodos dessa classe de baixo para cima (bottom-
up). Como ltimo mtodo temos o getEmptyFields que retorna o atributo de
lista de nomes de campos que no foram preenchidos. O mtodo clean()
serve para limpar a lista.
No mtodo getField temos alguns throws, esses throws significam que
podem acontecer as exceptions citadas e no sero tratadas nesse mtodo,
obrigando a quem us-lo fazer esse tratamento. E agora comea o Java
Reflection! Criamos uma varivel local do tipo Class que recebe a Class do
parmetro entity, com essa varivel que teremos acesso aos mtodos
internos, atributos o que j citei que a Reflection pode fazer, e na prxima
linha j vemos o exemplo disso, pedimos a entityClass para nos dar o
mtodo get*NomeDoCampo*, isso foi feito porque nossa Entity nada mais
que um POJO, ento todos atributos so privates e para verificar seus
valores preenchidos, devemos pegar seu respectivo mtodo get. Ento
invocamos o mtodo get do atributo e os retornamos.
O prximo mtodo um polimorfismo de sobrecarga de mtodo doprimeiro. Em vez de receber uma Entity, recebe uma String, esse mtodo
serve para verificar se a String no est vazia, valida ento se o campo de
busca foi preenchido. Veja que ele limpa a lista e faz as verificaes na
String, caso esteja vazia, adiciona a lista o campo que no foi preenchido:
Busca, edita o booleano que representa o retorno do mtodo para true e o
retorna.
E por ltimo, ou primeiro mtodo, temos o isEmpty que recebe umobjeto do tipo Entity, verifica quais so os campos obrigatrio e retorna se
tem algum no preenchido. O mtodo recebe um Entity, mas essa classe
abstrata, no tem como instanci-la, ento ser enviado um objeto que a
extenda. A primeira coisa que o mtodo faz chamar o mtodo clean,
criamos uma varivel local do tipo boolean que ser o retorno desse mtodo
e o inicializamos com false (temos como hiptese inicial que a entidade est
com os campos preenchidos).
-
5/24/2018 Tutorial Java Web Com Jsf 2
45/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 44
Criamos um objeto do tipo Class, e mandamos o Class do objeto entity
que veio como parmetro do mtodo (entity.getClas()), pegamos os
campos dessa Class e a associamos a um vetor do tipo Field, e a nova
varivel fields tem todos os campos da classe entity. Agora devemos
percorrer esses campos e ver se esto preenchidos. Usei o for para fazer
o lao de repetio, mas veja que a assinatura do for um pouco
diferente, esse jeito de utiliz-lo se chama for each que cria um lao de
repetio para um vetor (ou lista) percorrendo-o todo, seria a mesma coisa
que:
for(inti = 0; i
-
5/24/2018 Tutorial Java Web Com Jsf 2
46/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 45
packagebr.ueg.portalVirtual.control;
importjava.util.ResourceBundle;
publicabstractclassMessagesControl {
privatestaticResourceBundle messages;
publicMessagesControl() {messages=
ResourceBundle.getBundle("br/ueg/portalVirtual/bundle/messages" );}
protectedString getMessage(String typeMessage) {returnmessages.getString("erro_"+ typeMessage);
}
publicabstractvoidaddMessage(String message);
}
Tabela 17 - MessagesControl.java
No nosso controlador abstrato de mensagens temos o ResourceBundle
como atributo, um construtor que inicializa o nosso Bundle de mensagens
(ainda ser criado) e um mtodo protected getMessage que recebe como
parmetro o tipo da mensagem, e retornamos a String da chave enviada
pelo Bundle messages. Logo depois temos um mtodo abstrato
addMessage(). Tive alguns problemas em extender essa classe, por causado FacesContext do JSF, e tive que tirar a inicializao do bundle do
construtor. Essa classe tem como responsabilidade pegar mensagens do
bundle e obrigar quem a implemente criar um mtodo para adicionar a
mensagem e exibi-la, independente se Java Desktop, Web ou Mobile,
quem a implemente que far a distino.
Agora sim podemos criar nosso controlador de persistncia, e como
para CRUD, criaremos uma interface para ter uma melhor organizao:packagebr.ueg.portalVirtual.control;
importjava.util.List;
publicinterfaceIControl {
publicList getListAll(E entity);publicLong save(E entity);publicvoidupdate (E entity);publicList findByCriteria(E entity, String value);publicList findByHQL(E entity, String value);
publicvoiddelete (E entity);
-
5/24/2018 Tutorial Java Web Com Jsf 2
47/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 46
}
Tabela 18 - IControl.java
A nossa interface contm apenas as assinaturas para fazer a persistncia,
idntica a IGenericDAO, nem h a necessidade dessa interface, a classe
Control pode implementar a IGenericDAO mesmo, mas a criei para fazer
uma diferenciao, que pode haver.
Nosso controlador de persistncia (Control) assim como a DAO
genrico, qualquer classe que extenda Entity poder ser controlada e
persistida pelo objeto. Tambm uso o Generics do Java como j expliquei
anteriormente.
Vamos ento criar a classe que implementa nossa interface, veja que o
Control trabalha parecido como uma fachada para a persistncia, ele
apenas iria chamar os mtodos do GenericDAO, mas antes, faz algumas
validaes o que torna um controlador pr-persitncia:
packagebr.ueg.portalVirtual.control;
importjava.util.List;
import br.ueg.portalVirtual.model.Entity;
import br.ueg.portalVirtual.persistence.GenericDAO;import br.ueg.portalVirtual.sets.SpringFactory;import br.ueg.portalVirtual.view.control.MessagesWeb;
publicclassControl implementsIControl {
privateGenericDAO persistence;privateValidatorControl validator;privateMessagesControl messages;
@SuppressWarnings("unchecked")publicControl() {
persistence= (GenericDAO)
SpringFactory.getInstance().getBean("genericDAO", GenericDAO.class);validator= newValidatorControl();messages= newMessagesWeb();
}
@OverridepublicList getListAll(E entity) {
returnpersistence.getList(entity);}
@OverridepublicLong save(E entity) {
if(!validator.isEmpty(entity)) {returnpersistence.save(entity);
} else{List emptyFields =
-
5/24/2018 Tutorial Java Web Com Jsf 2
48/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 47
validator.getEmptyFields();for(inti = 0; i < emptyFields.size(); i++) {
messages.addMessage(emptyFields.get(i));}
}
return(long) 0;}
@Overridepublicvoidupdate(E entity) {
if(!validator.isEmpty(entity)) {persistence.update(entity);
} else{List emptyFields =
validator.getEmptyFields();for(inti = 0; i< emptyFields.size(); i++) {
messages.addMessage(emptyFields.get(i));}
}
}
@OverridepublicList findByCriteria(E entity, String value) {
if(!validator.isEmpty(value)) {returnpersistence.findByCriteria(entity, value);
} else{
messages.addMessage(validator.getEmptyFields().get(0));}returnnull;
}
@OverridepublicList findByHQL(E entity, String value) {
if(!validator.isEmpty(value)) {returnpersistence.findByHQL(entity, value);
} else{
messages.addMessage(validator.getEmptyFields().get(0));}returnnull;
}
@Overridepublicvoiddelete(E entity) {persistence.delete(entity);
}
}
Tabela 19 - Control.java
No Control temos como atributos a persistence, do tipo GenericDAO, o
validator e o messagesControl, ou seja, temos a camada inferior de
persistncia (GenericDAO) e os controladores secundrios (validator e
messages). No construtor inicializamos os atributos, veja que a inicializao
-
5/24/2018 Tutorial Java Web Com Jsf 2
49/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 48
do GenericDAO usa nossa fbrica de beans, instanciando o objeto via
Spring, e no com o new como os outros embaixo dele. Verifique tambm
que o MessagesControl recebe a instancia do MessagesWeb, essa ltima
classe extende MessagesControl, e iremos implement-la na camada de
viso. Como o MessagesControl abstract no se pode instanci-lo.
Como primeiro mtodo, temos o de listagem, como no necessrio
fazer nenhuma validao, chamamos a camada inferior e pedimos para
trazer a listagem do item. Depois segue os mtodos de save e update, os
dois seguem a mesma lgica, ento vou explic-los juntos. Primeiro
verificado se todos os campos foram preenchidos atravs do
ValidatorControl mandando a entidade que queremos persistir para aanlise. Se no houver campos obrigatrios vazios, chamamos o
GenericDAO e salvamos/atualizamos, caso contrrio, chamado o
MessagesControl e pedimos para adicionar a mensagem de erro (campo
obrigatrio no preenchido).
Os prximos mtodos findByCriteria e findByHQL trabalham de forma
semelhante, primeiro analisam se o campo de busca foi preenchido
chamando o ValidatorControl, se sim, pedem para o GenericDAO fazer abusca, caso contrrio pede para o MessagesControl criar mensagem de
erro.
Por ltimo temos o delete, tambm sem validaes, apenas peo para
excluir o item selecionado atravs da camada inferior.
Terminamos nossa camada intermediria, vamos a ltima camada, a
viso.
-
5/24/2018 Tutorial Java Web Com Jsf 2
50/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 49
Programando - Controlando a viso
Como estvamos falando de controlador, vamos comear criando nossocontrolador de mensagens da viso. Crie a classe MessagesWeb no pacote
de controle da viso: br.ueg.portalVirtual.view.control, e extenda o
MessagesControl:
packagebr.ueg.portalVirtual.view.control;
import javax.faces.application.FacesMessage;import javax.faces.context.FacesContext;
import br.ueg.portalVirtual.control.MessagesControl;
publicclassMessagesWeb extendsMessagesControl {
publicMessagesWeb() {super();
}
@OverridepublicvoidaddMessage(String message) {
FacesMessage msg = newFacesMessage(FacesMessage.SEVERITY_WARN, "Erro", getMessage(message));
FacesContext.getCurrentInstance().addMessage(null, msg);
}
}
Tabela 20 - MessagesWeb.java
Essa classe bem simples, no seu construtor apenas chamamos o
construtor da classe superior (mtodo super()). Implementamos o mtodo
addMessage que o MessagesControl nos obriga a faz-lo. Como se trata de
um controlador de mensagens para a Web, criamos uma varivel local do
tipo FacesMessage, essa classe faz parte do JSF e guarda mensagens deerros e alerta, basta adicionarmos algum item e a pgina que tiver um
componente de mensagens ir exibi-la (simples no?). Instanciamos o
FacesMessage passando um tipo de mensagem para exibir o cone
corresponde ao mesmo (SEVERITY_WARN, mensagem de ateno apenas)
e a mensagem que desejamos exibir. Na prxima linha adicionamos a
mensagem a instancia do JSF.
-
5/24/2018 Tutorial Java Web Com Jsf 2
51/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 50
J temos um controlador de mensagens funcionando, e nem preciso
chamar mtodos para exibir mensagem, basta criar um componente que
exiba as mensagens salvas no JSF.
Na viso temos o componente ComboBox (ou SelectOne) que mostra
uma lista de opes para selecionarmos e escolhermos uma. Iremos criar a
ComboBox para o Reino, que possui os atributos id e reino. Ser exibido
apenas o nome do reino (reino), mas precisaremos enviar o id e o reino do
item selecionado para o gerenciador da viso, e o JSF no faz isso sozinho.
Ele apenas pega o item que deseja exibir (Reino), transforma em String e
voc escolhe o que tem que aparecer (itemLabel), depois de selecionado o
item se mantm em String e voc escolhe o que deve ir para o gerenciador(itemValue), quando voc quer mandar a entidade toda (Reino, em vez de
s id ou s reino) d um erro, pois no d para passar a String para o
objeto desejado, para solucionar esse problema criamos um conversor.
Vamos criar nosso conversor do Reino e tentarmos entende-lo. No pacote
de controladores da viso, crie a classe Converter e implemente a classe
Converter do faces.converter:
packagebr.ueg.portalVirtual.view.control;
import javax.faces.component.UIComponent;import javax.faces.context.FacesContext;import javax.faces.convert.FacesConverter;
import br.ueg.portalVirtual.model.Reino;
@FacesConverterpublicclassConverter implements javax.faces.convert.Converter{
@OverridepublicObject getAsObject(FacesContext context, UIComponent
component, String value) {
intindex = value.indexOf(':');
if(index != -1) {returnnewReino(Long.parseLong(value.substring(0,
index)),value.substring(index + 1));
}returnvalue;
}
@OverridepublicString getAsString(FacesContext context, UIComponentcomponent,
-
5/24/2018 Tutorial Java Web Com Jsf 2
52/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 51
Object value) {
try{Reino optionItem = (Reino) value;returnoptionItem.getId() + ":"+
optionItem.getReino();} catch(Exception e) { }return(String) value;
}
}
Tabela 21 - Converter.java
A classe possui a annotation @FacesConverter que diz para o JSF que
essa classe se trata de um conversor de entidades. Quando implementamos
o Converter do faces.converter, ele nos obriga a criar os mtodos
getAsObjet e getAsString, o primeiro transforma String em Object, e o
outro transforma Object em String.
Essa classe CTRL + C, CTRL + V, alterando para a sua necessidade,
sendo que estamos criando agora o conversor para a entidade Reino, e
poderamos definir isso dentro da annotation @FacesConverter definindo os
atributos delas dessa forma: @FacesConverter(forClass=Reino.class); mas
como uso somente um conversor, no fiz essa declarao. Vamos agora
entender a classe.
O mtodo getAsObject pega a String do ComboBox (que veio do
getAsString), procura onde fica o : pelo indexOf, se houver os : que a
String passou pelo mtodo getAsString e podemos fazer a converso sem
nenhum problema, para isso repartimos a String na quantidade de atributos
da classe (Reino tem dois atributos, id e reino) e instanciamos o objeto.
Veja que temos um new Reino, convertendo a primeira String at o : em
long (id) e depois passamos o valor pra frente do : sem converso (reino)
e retornamos o objeto do tipo Reino.
O mtodo getAsString faz o inverso, ele recebe um objeto e tenta
converte-lo no tipo Reino (Reino optionItem = (Reino) value;) se a
converso for possvel, ento retornamos todos os atributos do tipo como se
fossem uma String, separando-os com :, caso haja algum problema
apenas h uma tentativa de converter o objeto em String direto.
-
5/24/2018 Tutorial Java Web Com Jsf 2
53/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 52
Esses so os controladores da viso, antes de ir para os gerenciadores da
viso, ou ManagedBeans, vamos criar as mensagens que usaremos nas
telas, ou seja, mais Bundle (=D).
-
5/24/2018 Tutorial Java Web Com Jsf 2
54/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 53
Programando - Internacionalizao por Bundle
J criamos o Bundle do JDBC, que sua nica funo reunir, em seuarquivo, todos os dados para configurar e criar uma conexo com o banco
de dados. Agora usaremos o Bundle para outra causa, alm de reunirmos
todas as mensagens na tela em um arquivo .properties, tambm o
usaremos para internacionalizar o nosso projeto, ou seja, iremos facilitar a
possvel alterao de lnguas no website.
No pacote de Bundle, crie o arquivo messages_pt_BR.properties
(New>Other... >File):####################### Mensagens de Erro #######################erro_reino = OcampoReinoobrigatrio!erro_filo = OcampoFiloobrigatrio!erro_Busca = necessriopreencherocampodebuscaparaefetuaraao!
####################### Comuns #######################button_save = Salvarbutton_list = Listarbutton_cancel = Cancelarbutton_search = Buscarcolumn_edit = Editar
column_delete = Excluir
####################### Mensagens utilizadas no caso de uso ManterReino #######################reino_title = ManterReinoreino_add = AdicionarReinoreino_header = CadastrarReinoreino_headerEdit = EditarReinoreino_reino = Reino:reino_reinoColumn = Reinoreino_empty = Nohreinosregistrados.
####################### Mensagens utilizadas no caso de uso ManterFilo #######################filo_title = ManterFilofilo_add = AdicionarFilofilo_header = CadastrarFilofilo_headerEdit = EditarFilofilo_filo = Filo:filo_filoColumn = Filofilo_empty = Nohfilosregistrados.filo_select = Selecioneum
####################### Mensagens utilizadas no template#######################template_register = Cadastrar
Tabela 22 - messages_pt_BR.properties
-
5/24/2018 Tutorial Java Web Com Jsf 2
55/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 54
Veja que separei as mensagens em: mensagens de erro (lembra do
MessagesControl?); comuns; caso de uso Manter Reino; caso de uso Manter
Filo; e da tela template. Esse Bundle feito durante a confeco das telas,
voc no lembra de todas as mensagens e botes que uma tela vai ter
antes.
No h o que explicar nesse Bundle, temos a chave de pesquisa a
esquerda e o valor a direita, utilizamos esse Bundle na confeco de
mensagens de erro e na tela. Antes de configurar a internacionalizao,
vamos criar as mensagens em ingls, usei o pouco conhecimento que tenho
e o Google Tradutor e criei o messages_en_US.properties:
####################### Mensagens de Erro #######################erro_reino = ThefieldKingdomisrequired!erro_filo = ThefieldPhylumisrequired!erro_Busca = Pleasefillthefieldofsearchtoperformtheaction!
####################### Comuns #######################button_save = Savebutton_list = Listbutton_cancel = Cancelbutton_search = Searchcolumn_edit = Editcolumn_delete = Delete
####################### Mensagens utilizadas no caso de uso ManterReino #######################reino_title = KeepKingdomreino_add = AddKingdomreino_header = RegisterKingdomreino_headerEdit = EditKingdomreino_reino = Kingdom:reino_reinoColumn = Kingdomreino_empty = Therearenotregisteredkingdom.
####################### Mensagens utilizadas no caso de uso ManterFilo #######################filo_title = KeepPhylum
filo_add = AddPhylumfilo_header = RegisterPhylumfilo_headerEdit = EditPhylumfilo_filo = Phylum:filo_filoColumn = Phylumfilo_empty = Therearenotregisteredphylum.filo_select = Selectone
####################### Mensagens utilizadas no template#######################template_register = Register
Tabela 23 - messages_en_US.properties
-
5/24/2018 Tutorial Java Web Com Jsf 2
56/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 55
Essa so as mensagens traduzidas, espero que esteja certo, vamos ento
configurar o Bundle para funcionar nas telas que criaremos, voc j viu
como configurar um Bundle no cdigo do Java, usando o ResourceBundle,
mas para ele ser acessvel por qualquer tela devemos configurar o nosso
arquivo no faces-config.xml que o Eclipse, provavelmente, j criou. O
arquivo fica no diretrio /WebContent/WEB-INF, perto do web.xml, ao abri-
lo, assim como todo XML, ir abrir na forma no-cdigo - Introduction, para
poder visualizar o cdigo e alter-lo clique em Source:
br.ueg.portalVirtual.bundle.messages
msg
pt_BRpt_BRen_US
br.ueg.portalVirtual.bundle.messages
Tabela 24 - faces-config.xml
Se o Eclipse criou esse arquivo, ele vem com a tag
preenchida, essa tag apenas define que um arquivo do JSF e sua verso,
caso voc tenha criado, use o CTRL + C e CTRL + V. Caso no estivssemos
querendo configurar por annotation o JSF, aqui que configuraramos as
pginas, regras de navegaes e todo o resto. Como vamos utilizar
annotation apenas a configurao do Bundle ficar nesse arquivo, j que
no encontrei como configurar por annotation.
Crie a tag (no use CTRL + C; CTRL + V, use o CTRL +
ESPAO), dentro crie a nela temos que definir ondeest o arquivo de internacionalizao e o seu nome base
-
5/24/2018 Tutorial Java Web Com Jsf 2
57/78
Tutorial JSF, Facelets, Hibernate com JPA, Spring e PrimeFaces - 56
(br.ueg.portalVitual.bundle e o nome sem a definio do idioma: messages)
e o nome d