Frameworks
e Aplicaes
Corporativas
Razer Anthom
responsvel
pelo
JAVA
Frameworks
e Aplicaes
Corporativas
Razer Anthom
JAVA
Frameworks
e Aplicaes
Corporativas
Razer Anthom
Rio de Janeiro
Escola Superior de Redes
2016
Diretor Geral
Nelson Simes
Diretor de Servios e Solues
Jos Luiz Ribeiro Filho
ISBN 978-85-63630-50-6
1. Arquitetura Java EE e Servidores de Aplicao. 2. JSF (Java Server Faces). 3. Framework
Hibernate. I. Titulo
CDD 000
Sumrio
Escola Superior de Redes
A metodologia da ESRix
Sobre o curso x
A quem se destinax
Convenes utilizadas neste livroxi
Permisses de usoxi
Sobre o autorxii
1. Introduo
Arquitetura Java EE1
EJB5
JavaServer Faces6
Servidores de Aplicao6
Padres de Projeto Front Controller e MVC8
Arquitetura JSF9
Primeiro projeto12
Comparao Servlets e JSF13
Aplicao Servlets13
Aplicao JSF15
Comparao16
iii
iv
Link <h:link>62
Link Externo: <h:outputLink>62
Exemplo com botes e links63
Textos64
Textos simples64
Textos formatados65
Imagens65
Biblioteca de recursos66
Versionamento de Recursos67
JavaScript e CSS68
Atributo Rendered68
Componentes de organizao69
Tabelas70
Mensagens73
Repetio75
7. Hibernate
Introduo125
Exerccio de Fixao
126
Classe persistente128
Acesso simples ao banco de dados: insero e consulta129
Managed Bean e XHTMLs130
Arquivo de Configurao: hibernate.cfg.xml132
Contedo de uma aplicao133
133
Exerccio de Fixao
8. Hibernate Associaes
Associaes143
Cascateamento143
10. Java EE
Java EE175
Objetos distribudos176
Transaes182
CMT183
BMT183
web Services184
SOAP185
REST188
SOA Arquitetura Orientada a Servios191
vii
viii
A metodologia da ESR
A filosofia pedaggica e a metodologia que orientam os cursos da ESR so baseadas na
aprendizagem como construo do conhecimento por meio da resoluo de problemas tpicos da realidade do profissional em formao. Os resultados obtidos nos cursos de natureza
terico-prtica so otimizados, pois o instrutor, auxiliado pelo material didtico, atua no
apenas como expositor de conceitos e informaes, mas principalmente como orientador do
aluno na execuo de atividades contextualizadas nas situaes do cotidiano profissional.
A aprendizagem entendida como a resposta do aluno ao desafio de situaes-problema
semelhantes s encontradas na prtica profissional, que so superadas por meio de anlise,
sntese, julgamento, pensamento crtico e construo de hipteses para a resoluo do problema, em abordagem orientada ao desenvolvimento de competncias.
Dessa forma, o instrutor tem participao ativa e dialgica como orientador do aluno para as
atividades em laboratrio. At mesmo a apresentao da teoria no incio da sesso de aprendizagem no considerada uma simples exposio de conceitos e informaes. O instrutor
busca incentivar a participao dos alunos continuamente.
ix
Sobre o curso
Este um curso de nvel avanado com foco no uso de frameworks e tecnologias para
desenvolvimento de aplicaes corporativas em Java. Este tipo de aplicao exige um grau
de confiabilidade e performance mais elevado, fazendo uso de recursos especficos do Java
Enterprise Edition - Java EE, tais como JSF (Java Server Faces), AJAX, Primefaces e Hibernate.
O curso se inicia com uma viso geral da Arquitetura do Java EE e caractersticas dos servidores de aplicao capazes de suportar as tecnologias/aplicaes corporativas, para em
seguida se aprofundar no JSF e Hibernate.
Cada sesso apresenta um conjunto de exemplos e atividades prticas que permitem a prtica das habilidades apresentadas.
A quem se destina
Pessoas interessadas em desenvolver aplicaes corporativas com maior grau de confiabilidade e performance. um curso recomendado para quem j tem bons conhecimentos
sobre a linguagem Java, desde seus fundamentos e o desenvolvimento de aplicaes web at
acesso a bancos de dados. Para os alunos que no tenham a prtica recente de desenvolvimento de sistemas nesta linguagem recomenda-se fortemente que considerem se matricular
previamente nos seguintes cursos: DES2 Java Interfaces Grficas e Bancos de Dados; e
DES3 Java Aplicaes Web.
Largura constante
Indica comandos e suas opes, variveis e atributos, contedo de arquivos e resultado da sada
de comandos. Comandos que sero digitados pelo usurio so grifados em negrito e possuem
o prefixo do ambiente em uso (no Linux normalmente # ou $, enquanto no Windows C:\).
Contedo de slide q
Indica o contedo dos slides referentes ao curso apresentados em sala de aula.
Smbolo w
Indica referncia complementar disponvel em site ou pgina na internet.
Smbolo d
Indica um documento como referncia complementar.
Smbolo v
Indica um vdeo como referncia complementar.
Smbolo s
Indica um arquivo de adio como referncia complementar.
Smbolo !
Indica um aviso ou precauo a ser considerada.
Smbolo p
Indica questionamentos que estimulam a reflexo ou apresenta contedo de apoio ao
entendimento do tema em questo.
Smbolo l
Indica notas e informaes complementares como dicas, sugestes de leitura adicional ou
mesmo uma observao.
Smbolo
Indica atividade a ser executada no Ambiente Virtual de Aprendizagem AVA.
Permisses de uso
Todos os direitos reservados RNP.
Agradecemos sempre citar esta fonte quando incluir parte deste livro em outra obra.
Exemplo de citao: TORRES, Pedro et al. Administrao de Sistemas Linux: Redes e Segurana.
Rio de Janeiro: Escola Superior de Redes, RNP, 2013.
xi
Comentrios e perguntas
Para enviar comentrios e perguntas sobre esta publicao:
Escola Superior de Redes RNP
Endereo: Av. Lauro Mller 116 sala 1103 Botafogo
Rio de Janeiro RJ 22290-906
E-mail: info@esr.rnp.br
Sobre o autor
Razer Anthom Nizer Rojas Montao Doutorando em Informtica (nfase em Inteligncia
Artificial) pela UFPR, Mestre e Bacharel em Informtica pela UFPR. Atualmente professor
da UFPR ministrando disciplinas de desenvolvimento em Java Web e de Aplicaes Corporativas. Possui certificao SCJP, COBIT, ITIL. Acumula mais de 15 anos de experincia
em docncia e mais de 20 anos de experincia no mercado de desenvolvimento, anlise e
arquitetura de aplicaes.
John Lemos Forman Mestre em Informtica (nfase em Engenharia de Software) e
Engenheiro de Computao pela PUC-Rio, com ps-graduao em Gesto de Empresas
pela COPPEAD/UFRJ. vice-presidente do Sindicato das Empresas de Informtica do Rio
de Janeiro TIRIO, Presidente do Conselho Deliberativo da Riosoft e membro do Conselho
Consultivo e de normas ticas da Assespro-RJ. scio e Diretor da J.Forman Consultoria e
coordenador acadmico da rea de desenvolvimento de sistemas da Escola Superior de
Redes da RNP. Acumula mais de 30 anos de experincia na gesto de empresas e projetos
inovadores de base tecnolgica, com destaque para o uso das TIC na Educao, mdias
digitais, Sade e Internet das Coisas.
xii
1
Conhecer o Java EE; Aprender sobre o histrico da evoluo da especificao;
Conhecer os servidores de aplicao e um primeiro projeto utilizando essa arquitetura.
conceitos
Arquitetura Java EE
Java EE (Java Platform, Enterprise Edition) a plataforma padro para desenvolvimento de
aplicaes corporativas em Java. Inclui diversas tecnologias que do suporte a esse tipo de
aplicao, como desenvolvimento Web, Web Services, Componentes distribudos, Componentes de persistncia etc.
O Java SE (Java Platform, Standard Edition) a plataforma bsica do Java, usada para desenvolver aplicativos baseados em console e aplicativos desktop (visuais). Para executar essas
aplicaes, basta o JVM (Java Virtual Machine), que a mquina virtual do Java. J para executar aplicaes Java EE, faz-se necessrio o uso da JVM e de um servidor de aplicao com
suporte s tecnologias disponveis na plataforma.
A figura a seguir mostra as tecnologias disponveis. Entre as mais difundidas, temos:
11 Servlets/JSP (JavaServer Pages): tecnologias bsicas para desenvolvimento de apli-
Captulo 1 - Introduo
objetivos
Introduo
Java EE7
JSON-P
JSR 353
EJB 3.2
JSR 345
Servlet 3.1
JSR 340
EL 3.0
JSR 341
CDI 1.1
JSR 346
JAX-RS 2.0
JSR 339
JPA 2.1
JSR 338
JSF 2.2
JSR 344
JMS 2.0
JSR 343
Web-Socket
JSR 356
JCache
JSR 107
Concurrent Utilities
JSR 236
Figura 1.1
Tecnologias Java EE.
11 Java EE 6 10/12/2009;
Java API for XML Registries (JAXR): servios de registros distribudos para integrao B2B
Management and Security Technologies
Java Authentication Service Provider Interface for Containers (JASPIC): API para criao de
provedores de servio para autenticao
Captulo 1 - Introduo
Java APIs for XML Messaging (JAXM): API padro para comunicao de XML na internet
Java Database Connectivity: API para conexo e execuo de SQL em servidores de banco
de dados
Java Management Extensions (JMX): forma padro de tratamento de recursos (aplicaes,
dispositivos e servios)
JavaBeans Activation Framework (JAF): determinao automtica do tipo de um pedao
de cdigo para instanciao do bean correto
Streaming API for XML (StAX): API baseada em streaming para leitura e escrita de documentos XML
Tabela 1.1
Tecnologias Java EE.
22 Exemplo: tomcat.
11 Aplicaes Corporativas:
22 Servidor JavaEE;
22 Exemplo: glassfish, Jboss.
A evoluo do Java EE tambm trouxe avanos no modelo de programao usado. Antigamente era prtica comum o uso de vrios arquivos XML para configurao de componentes
e descritores de aplicao. Hoje em dia usam-se anotaes em vrios pontos de uma
aplicao. Por exemplo, na API Servlets 2 era necessrio configurar o arquivo web.xml para
descrever as Servlets. J na verso 3 em diante basta anotar uma classe com @WebServlet
que j se indica que a classe uma Servlet, sem a necessidade do arquivo XML.
EJB
EJB (Enterprise Java Beans) so componentes de software da plataforma Java EE, usados no
desenvolvimento de aplicaes de grande porte/corporativas.
Entre as caractersticas dos EJB, temos:
e preparao para cloud computing (Java EE como consumidor de servios na nuvem, como
Computao nas
nuvens, em ingls.
o armazenamento de
arquivos ou aplicativos
na internet.
integrador de servios vide JBI Java Business Integragion e como produtor de servios na
nuvem PaaS). O servidor GlassFish 4, descrito em mais detalhes adiante, j est preparado
para esta tecnologia.
Em EJB podem ser definidos, basicamente, quatro tipos de componentes:
Singleton
Padro de projeto do
GOF (Gamma et al)
onde, para uma determinada classe, somente
ser possvel se obter
uma instncia, isto , o
sistema todo acessar
sempre o mesmo
objeto.
JavaServer Faces
JavaServer Faces (JSF) uma especificao integrante do Java EE, que tem por objetivo ser
um framework de desenvolvimento web. Atualmente est na verso 2.2 (JSR 344).
Em relao a outros frameworks, o JSF se mostra muito maduro, visto que teve sua adoo
como padro na especificao Java EE 6. Tambm um framework extensvel e que vem melhorando as tecnologias, como fcil integrao com HTML5, AJAX etc. Tambm h muito envolvimento com a comunidade, o que torna o JSF proeminente e foco de testes e atualizaes.
O JSF tambm opera atravs de requisio e resposta, mas possui um ciclo de vida bem
definido. baseado em pginas XHTML ligadas a componentes conhecidos como Managed
Beans. O processamento de uma requisio possui um ciclo de vida bem definido, que
permite a manuteno do estado dos componentes ao longo de requisies.
Java Server Faces JSF.
Servidores de Aplicao
Para que aplicativos Java EE sejam disponibilizados, faz-se necessrio o uso de Servidores de
Aplicaes, que oferecem toda a infraestrutura para execuo de aplicaes com as tecnologias disponibilizadas na plataforma. A figura 1.2 mostra as diversas camadas de um servidor
Java EE, apresentando seus contineres e suas relaes.
Client Machine
Application Client
Servlet
Web Browser
Web Page
Web
Container
Java EE Server
EJB
Container
Enterprise Bean
Figura 1.2
Servidor Java EE
e Conteiners.
Enterprise Bean
Database
Um Conteiner uma interface entre um componente e uma funcionalidade de baixo nvel da
plataforma, que o suporta. Por exemplo, Servlets e seu tratamento na plataforma Java.
Existem basicamente dois tipos de Conteiners:
11 Servlet Conteiner:
22 Conteiner web;
22 Usado para execuo de aplicaes web;
22 Implementam somente as tecnologias web (Servlets, JSP, JSF, EL e JSTL).
11 EJB Conteiner:
22 Conteiners usados para execuo de componentes EJB.
O servidor usado nesse material o Oracle GlassFish 4, que um Servidor Java EE completo,
com Servlet Conteiner e EJB Conteiner. Ele empacotado na instalao do Netbeans e j
configurado de forma automtica. O GlassFish a implementao de referncia do Java EE.
Oracle GlassFish 4
Captulo 1 - Introduo
Figura 1.3
Painel Administrativo
do GlassFish.
Para que o Front Controller seja realmente eficiente, necessrio que ele seja desenvolvido de
forma enxuta, abstraindo somente as operaes genricas a todos (ou a maioria) dos elementos. Por exemplo: verificao se um usurio est logado, para acessar determinada pgina.
Muitos frameworks de mercado usam o padro Front Controller em seu desenvolvimento e
j disponibilizam esse componente de forma automtica, bastando prover sua configurao.
Por exemplo, o Struts prov o ActionServlet, e o JSF prov o FacesServlet.
O padro de projeto MVC (Model-View-Controller) usado para separar o desenvolvimento da
aplicao em partes bem definidas, facilitando o desenvolvimento, a manuteno e extenso.
Modelo (ou model) se refere aos componentes do software que lidam com a representao
de dados (ligao com banco de dados) e lgica de negcio. A Viso (ou view) faz a interface
com o usurio. A Controladora (ou controller) responsvel por transformar as requisies
do usurio, geradas na viso, para aes de lgica de negcio ou manipulao de dados, e
tambm controlar a navegao entre vises, conforme o fluxo da aplicao.
Percebe-se que os padres Front Controller e MVC se complementam no desenvolvimento
de uma aplicao web, sendo que a camada de controle do modelo MVC pode ser implementada de vrias formas, inclusive usando-se Front Controller.
Arquitetura JSF
O JSF encontra-se em permanente evoluo. Entre os avanos mais recentes, podemos destacar:
11 Integrao com HTML5: nas verses anteriores, no se podia inserir atributos dife-
rentes dos do HTML4, pois eram ignorados. Agora temos vrias maneiras de propagar
esses atributos para que eles sejam renderizados em HTML;
11 FacesFlow: onde se pode agrupar vrias pginas (views) em um fluxo (flow), com um
determinado ponto de entrada e de sada;
11 Componente de Upload;
11 Vrias correes de erros.
Para se usar o JSF necessrio ter uma implementao deste. Vrios fabricantes tm suas
prprias bibliotecas de JSF implementadas conforme a especificao.
Entre as mais importantes, temos:
A figura 1.4 mostra a arquitetura de uma aplicao web usando Servlets/JSP. Nesse modelo,
todas as requisies efetuadas pelo cliente so atendidas por componentes web, Servlets ou
JSP, dependendo de como a aplicao foi desenvolvida. Esses componentes podem fazer uso
de outros, como JavaBeans para representar dados, lgica de negcio etc.
Captulo 1 - Introduo
disponvel na internet.
Conteiner
Cliente
Web
HttpServletResquest
Componentes Web
(Servlets/JPS)
HttpServletResponse
Java Beans
HTTP
Request
HTTP
Response
Figura 1.4
Arquitetura
Aplicao web:
jSP/Servlets.
Nesse modelo, todas as tarefas devem ser especificadas pelo programador dentro dos componentes. Por exemplo, os dados enviados por um formulrio devem ser, um a um, obtidos
do objeto de requisio (HttpServletRequest) e preenchidos em variveis do componente
ou atributos de Beans. A navegao entre telas tambm deve ser feita de forma manual,
atravs de redirecionamentos (forward ou redirect).
A figura 1.5 apresenta a arquitetura de uma aplicao usando JSF. Nesse modelo o prprio
framework j prov vrias tarefas de forma automtica, visto que vrios componentes so
automaticamente instalados. Um exemplo o Faces Servlet, parte integrante do JSF e que
faz o papel de controlador na arquitetura MVC.
Esse Servlet est programado para, de forma automtica, receber o resultado de mtodos
do modelo como uma String e usar seu valor como nome de tela para aonde o sistema deve
ser redirecionado. Isso chamado de navegao implcita.
Outra tarefa automaticamente feita o preenchimento dos dados provenientes de formulrios diretamente em atributos de componentes (chamados Managed Beans). Esses dados
so tambm, automaticamente, convertidos (exemplo, string para inteiro) e validados.
A figura 1.6 mostra a arquitetura JSF com mais detalhes, apresentando os componentes que
interagem para a execuo de uma aplicao.
Conteiner
10
Request
Formulrio
Faces
Servlet
FASES
XHTML
Facelets
Componente
Componente
Componente
Response
Managed Beans
BD
Figura 1.5
Arquitetura JSF
simplificada.
RENDERER
Conteiner
Formulrio
Faces
Servlet
FASES
Request
XHTML
Facelets
Componente
Componente
Componente
Conversor
Validador
Response
Managed Beans
Modelo
Figura 1.6
Arquitetura
Aplicao web JSF.
BD
Captulo 1 - Introduo
22 Navegao implcita.
faces-cong.xml
beans.xml
classes
Arquivos.class
lib
Primeiro projeto
Para se iniciar um projeto usando o JSF, basta selecionar, no final da criao do projeto, o
framework JavaServer Faces. Nesta sesso ser criado um projeto simples, somente com a
pgina default criada pelo Netbeans. Os passos so:
1. Iniciar o Netbeans;
2. Escolher Menu Arquivo | Novo Projeto;
3. Escolher Categoria Java Web e Projeto Aplicao Web;
4. Pressionar Prximo;
12
Figura 1.7
Estrutura de uma
Aplicao JSF.
Aplicao Servlets
Uma aplicao usando Servlets formada por pginas em JSP (usando as bibliotecas de tags
JSTL/EL), que interagem com o usurio, e Servlets para efetuar o processamento dessas
pginas. Apesar de se poder fazer todo o processamento em pginas JSP, isso no recomendado, pois com o passar do tempo o sistema pode crescer e a manuteno das pginas
acaba se tornando invivel. Se o programador quiser usar MVC e Front Controller, ele deve
implementar manualmente.
A seguir, o cdigo index.jsp de um sistema simples.
<form action=Processar method=post>
<table>
<tr>
<td>Texto Processado:</td>
<td><c:out value=${texto} /></td>
</tr>
<tr>
<td>Nmero Processado:</td>
<td><c:out value=${numero} /></td>
</tr>
<tr>
<td>Texto:</td>
<td><input type=text name=texto value=${texto} />
<c:if test=${not empty textoRequerido}>
<span style=color: red>
<c:out value=${textoRequerido} />
</span>
</c:if>
</td>
</tr>
<tr>
<td>Nmero:</td>
<td><input type=text name=numero value=${numero} />
<c:if test=${not empty numeroRequerido}>
<span style=color: red>
</span>
</c:if>
</td>
</tr>
<tr>
Captulo 1 - Introduo
13
getRequestDispatcher(/index.jsp);
rd.forward(request, response);
}
////// Efetivo processamento dos dados
nr = nr * nr;
texto = texto.toUpperCase();
/////
request.setAttribute(texto, texto);
request.setAttribute(numero, String.valueOf(nr));
RequestDispatcher rd = getServletContext().
getRequestDispatcher(/index.jsp);
rd.forward(request, response);
}
14
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
public String getServletInfo() {
return Short description;
}
}
Aplicao JSF
Uma aplicao usando JSF formada por pginas XHTML que interagem com o usurio e
Managed Beans para efetuar o processamento dessas pginas. No possvel efetuar o
processamento todo do sistema nas pginas XHTML, o que fora o programador a usar MVC
no cdigo. MVC e Front Controller j esto implementados e so sempre usados, de forma
transparente e sem aumentar o custo de codificao. A seguir, o cdigo index.xhtml de um
sistema simples.
<h:form>
<h:panelGrid columns=2>
<h:outputText value=Texto Processado: />
<h:outputText value=#{exemploMB.texto} />
<h:outputText value=Nmero Processado: />
<h:outputText value=#{exemploMB.numero} />
<h:outputLabel for=txtTexto value=Texto:/>
<h:inputText id=txtTexto value=#{exemploMB.texto}
required=true />
<h:outputLabel for=txtNumero value=Nmero:/>
<h:inputText id=txtNumero value=#{exemploMB.numero}
required=true />
value=Processar />
</h:panelGrid>
</h:form>
Captulo 1 - Introduo
<h:commandButton action=#{exemploMB.processar}
15
A seguir, o cdigo ExemploMB.java, que o Managed Bean usado para processar o XHTML.
@Named(value = exemploMB)
@RequestScoped
public class ExemploMB {
private String texto;
private int numero;
public ExemploMB() {
}
public String getTexto() {
return texto;
}
public void setTexto(String texto) {
this.texto = texto;
}
public int getNumero() {
return numero;
}
public void setNumero(int numero) {
this.numero = numero;
}
public void processar() {
this.texto = this.texto.toUpperCase();
this.numero = this.numero * this.numero;
}
}
Comparao
Fora a questo de quantidade de linhas de cdigo, que claramente em JSF menor, a complexidade do cdigo desenvolvido pelo programador deve ser levada mais em conta.
A grande vantagem do cdigo desenvolvido em JSF que validaes (se o nmero foi mesmo
entrado), converses (de String para int), mensagens de erro, atribuio do dado proveniente na
tela para variveis etc., so feitas de forma automtica pelo framework, o que foca o esforo de
desenvolvimento no que realmente importante, que o desenvolvimento do negcio.
Apesar de Servlets/JSP dar mais flexibilidade no desenvolvimento, o tempo de programao,
JAVA Frameworks e Aplicaes Corporativas
16
manuteno do sistema pode no valer a pena. Obviamente, deve-se conhecer o JSF para
se obter benefcios no seu uso, pois mesmo guiando o programador, algumas boas prticas
devem ser seguidas para que o resultado seja satisfatrio.
2
Conhecer os elementos da arquitetura do JSF e o ciclo de vida de seus componentes.
conceitos
Conforme visto na sesso anterior, JSF (Java Server Faces) um dos principais frameworks
disponveis no mercado para desenvolvimento em Java para web. Atualmente, parte integrante da especificao Java EE (a partir da verso 6) e, portanto, todos os servidores Java EE
certificados o suportam.
JSF traz para o desenvolvedor as facilidades do desenvolvimento usando os padres de
projeto Front Controller e MVC (Model-View-Controller). Esses dois padres so responsveis por toda a facilidade e agilidade no desenvolvimento em JSF. Alm disso, o suporte a
vrias operaes, extenses e customizaes tornam o JSF uma opo altamente recomendvel para projetos web em Java.
O desenvolvimento baseado em componentes outro benefcio que se obtm do uso de
JSF. Desenvolver usando um framework que suporta componentizao e eventos favorece a
manutenibilidade e extensibilidade do sistema. Em aplicaes corporativas, onde o volume
de funcionalidades em geral grande e onde se faz necessrio um ambiente que suporte
agregao de outros requisitos, os frameworks tm um papel central na construo de
sistemas flexveis.
Outro ponto relevante o fato de que muitas funcionalidades necessrias a sistemas corporativos, tais como persistncia, transaes e validaes, j esto prontas, podendo ser
usadas e personalizadas conforme a necessidade do cliente.
objetivos
elementos da aplicao.
17
Outro modelo de programao que trouxe grande agilidade no desenvolvimento foi a Injeo
de Dependncias, que pode ser descrito como: seja um componente, chamado A, que
depende (possui como atributos, por exemplo) de B e C. Para que A funcione, necessrio ter
uma instncia de B e uma instncia de C, conforme ilustra a figura 2.1.
A consegue B e C
para poder executar
B
A
C
Um cdigo possvel para descrever esse problema pode ser visto a seguir:
public class ComponenteA {
private ComponenteB b;
private ComponenteC c;
Percebe-se que a criao dos componentes B e C est sendo feita atravs da instanciao
(new), mas no se tem garantia de que esta a forma correta de obt-los, nem se uma
forma suficiente. Muitos componentes, para serem criados, devem ser geridos pelo servidor
ou devem vir previamente configurados, o que faz com que a instanciao no seja suficiente. o caso de fontes de dados, gerenciadas pelos servidores de aplicao.
Alm disso, alm da dependncia em si (componente A precisar de B e C para funcionar),
fere-se um grave princpio que o de baixo acoplamento, fazendo com que A saiba exata JAVA Frameworks e Aplicaes Corporativas
18
Uma soluo para esse problema inverter o controle (IoC Inversion of Control). Isto ,
em vez da responsabilidade em encontrar os componentes B e C ser do componente que
depende deles (no caso A), faz-se com que essas dependncias sejam preenchidas de forma
automtica. Esse o princpio de Hollywood: No nos ligue, ns ligamos para voc!. Essa
resoluo de dependncias deve acontecer em tempo de execuo e os componentes,
agora, esto desacoplados.
Figura 2.1
Dependncias.
19
Para que o CDI seja habilitado em seu projeto, deve-se criar o arquivo vazio beans.xml. S a
20
presena desse arquivo j indicia ao continer que o CDI foi ativado e todas as suas facilidades estaro disponveis.
Java EE 5:
11 Anotaes que injetavam Recursos;
11 Recursos: EJBs, Datasources, JMSs;
11 @EJB, @Resource, @PersisteceUnit;
Java EE 6+;
11 Com CDI;
11 @Inject consegue injetar qualquer componente.
XHTML
}
public void setTexto(String texto) {
this.texto = texto;
}
}
eXtensible Hypertext
Markup Language,
uma reformulao
dalinguagem de
marcaoHTML,
baseada emXML.
Combina astagsde
marcao HTML com
regras da XML.
21
O ciclo de vida do processamento de uma requisio nesse exemplo mostrado na figura 2.2.
Nesse caso, depois que o formulrio mostrado para o usurio, ele pode preencher os
dados e pressionar o boto Alterar. Quando essa requisio chega ao servidor, uma representao interna da pgina XHTML (rvore de componentes) obtida. Uma instncia do MB
tambm obtida (criada ou recuperada, dependendo das especificaes de contextos). Os
dados que so enviados na requisio (campos do formulrio) so obtidos e preenchidos
no MB. Em seguida, como est sendo mostrada a mesma pgina, os campos na representao so preenchidos e enviados para o cliente (navegador).
Cliente / Browser
Servidor / JSF
XHTML
XHTML
Usurio digita
Dados
Usurio pressiona
Alterar
JSF obtm
instncia do MB
22
11 Clicar PRXIMO;
11 Alterar o NOME DO PROJETO;
11 Clicar PRXIMO;
11 Escolher o SERVIDOR;
11 Clicar PRXIMO;
11 Escolher o Framework JAVASERVER FACES;
11 Clicar em FINALIZAR.
Figura 2.2
Ciclo de Vida
Simplificado.
A seguir, tem-se o XHTML usado para apresentar os dados do MB anterior e esse cdigo
deve ser digitado no arquivo index.xhtml.
<html xmlns=http://www.w3.org/1999/xhtml
xmlns:h=http://java.sun.com/jsf/html>
<h:head><title>Exemplo</title></h:head>
<h:body>
Texto: #{exemploBean.texto}
<h:form>
<h:inputText value=#{exemploBean.texto} />
<h:commandButton value=Alterar />
</h:form>
</h:body>
Aes
No exemplo anterior, nenhum tipo de ao era feita quando o cliente pressionava o boto
Alterar. Portanto, os dados eram submetidos, preenchidos no MB e mostrados na tela
novamente, sem qualquer tipo de processamento.
Para que um mtodo do MB seja invocado quando os dados so submetidos, usamos o
atributo action da tag <h:commandButton />. Os mtodos invocados podem retornar void ou
String, que definem:
11 Retorno void: indica que a prxima pgina a ser renderizada a mesma que originou a
</html>
requisio;
23
// setter/getter de texto
public void caixaAlta() {
this.texto = this.texto.toUpperCase();
}
</h:form>
24
</h:body>
</html>
Cliente / Browser
Servidor / JSF
XHTML
Usurio digita
Dados
Usurio pressiona
Alterar
JSF obtm
instncia do MB
Escopos
Escopos tm a ver com o ciclo de vida dos Managed Beans, isto , quando o objeto criado e
quando descartado. Isso implica na durabilidade dos dados que ele mantm.
Escopos so usados para indicar por quanto tempo um Managed Bean se manter criado e,
portanto, por quanto tempo manter seus dados ativos. O JSF e o CDI possuem mecanismos
diferentes para manter o ciclo de vida dos MBs, e o programador s precisa indicar qual
esse tempo usando uma anotao especfica. No h necessidade de criao nem mesmo
remoo dos MBs.
Os escopos do JSF so usados somente se o programador estiver em um ambiente puramente JSF sem o suporte a CDI. Mas como comumente se usam Servidores de Aplicao
Java EE 6 ou superior, que j possuem suporte nativo a JSF e CDI, deve-se usar os escopos do
prprio CDI.
No CDI, a partir da verso 2.2, tambm est disponvel um escopo do JSF muito til para confeco de Managed Beans que precisam estar disponveis enquanto o usurio se mantiver
em uma determinada pgina.
Escopos do CDI importados de javax.enterprise.context:
11 Dependent: @DependentScoped;
11 Request: @RequestScoped;
11 Session: @SessionScoped;
11 Application: @ApplicationScoped;
Figura 2.3
Ciclo de Vida
Simples com Invocao de Ao.
11 Conversacional: @ConversacionalScoped;
25
11 View: @ViewScoped.
A seguir, vamos detalhar cada um desses escopos.
@DependentScoped
o escopo default do CDI. Quando um MB marcado com esse escopo, ele assume o
escopo do objeto onde ele est sendo injetado. Por exemplo, se foi injetado em um Componente que possui escopo de sesso, ento o MB tambm possuir escopo da sesso.
Para aplicaes puramente JSF/CDI, esse escopo pouqussimo usado e, em geral, ser
necessrio trocar o escopo do MB para o de requisio. O cdigo a seguir mostra um trecho
de cdigo de um MB com escopo dependente.
import javax.enterprise.context.DependentScoped;
@Named
@DependentScoped
public class TesteMB {
}
@RequestScoped
Quando o MB marcado com esse escopo, ele criado a cada nova requisio, e fica ativo
at que a requisio termine. Quando a requisio termina, todos os dados so descartados,
isto , nada mantido para a requisio seguinte.
O cdigo a seguir mostra um trecho de cdigo de um MB com escopo de requisio.
import javax.enterprise.context.RequestScoped;
@Named
@RequestScoped
public class TesteMB {
}
@SessionScoped
O MB que possui escopo da sesso mantido na sesso do usurio e, portanto, s descartado quando o usurio faz logout, deixa de fazer requisies por determinado tempo
ou o servidor/aplicao so parados. O MB deve implementar a interface Serializable, pois
26
Um ponto importante sobre o escopo da sesso que na maioria das vezes no se deve
deixar MBs na sesso. A sesso possui um tamanho limitado e seu uso indiscriminado pode
prejudicar a escalabilidade e desempenho da aplicao.
@ApplicationScoped
Quando um MB assinalado como possuidor do escopo da aplicao, uma, e somente uma
instncia criada para a aplicao toda, e criada assim que o MB for usado pela primeira
vez (instanciao conhecida como lazy).
Essa instncia mantida at a aplicao ser finalizada e compartilhada por todos os usurios da aplicao, isto , sempre que requisitado o mesmo bean retornado. Deve implementar Serializable. O quadro mostra um exemplo de MB com escopo da aplicao.
import javax.enterprise.context.ApplicationScoped;
@Named
@ApplicationScoped
public class TesteMB implements Serializable {
}
@ViewScoped
O escopo de viso existe como um escopo do JSF, adicionado no JSF 2, mas no existe como
escopo do CDI. No JSF 2.2, foi introduzida uma maneira de se us-lo no CDI para que as aplicaes possam ser desenvolvidas com esta funcionalidade.
Para us-lo, o Managed Bean deve importar o ViewScoped do JSF, que a seguinte classe:
import javax.faces.view.ViewScoped;
Nesse escopo o MB existe enquanto o usurio no sair da pgina, lembrando que mtodos
de ao do MB que retornam void permanecem na mesma pgina ou viso. Quando o
usurio muda de tela, o MB descartado.
Assim, MBs anotados com esse escopo no compartilham dados entre telas ou abas diferentes na mesma sesso; cada viso uma instncia diferente do MB. O MB deve implementar Serializable. O cdigo a seguir mostra um exemplo de MB com escopo de viso.
import javax.faces.view.ViewScoped;
@Named
@ViewScoped
public class TesteMB implements Serializable {
}
O escopo de conversao maior que uma requisio e menor que uma sesso. O MB existe
com um incio e fim determinados programaticamente, atravs da chamada de mtodos
especficos determinados pelo programador.
Podemos fazer vrias chamadas ao bean (exemplo: aAJAX) e os dados sero os mesmos, e o
programador deve fechar programaticamente a conversao.
Para funcionar, deve-se injetar um objeto do tipo Conversation. O incio do escopo se d pela
chamada do mtodo begin(), e o trmino do escopo se d pela chamada do mtodo end(). O MB
deve implementar Serializable. O cdigo a seguir mostra um exemplo de escopo de conversao.
@ConversationScoped
27
import javax.enterprise.context.ConversationScoped;
@Named
@ConversationScoped
public class TesteMB implements Serializable {
@Inject
private Conversation conversation;
public void initConversation() {
conversation.begin();
}
public String endConversation() {
conversation.end();
}
public Conversation getConversation() {
return this.conversation;
}
}
@TransactionScoped
O escopo de transao foi criado no Java EE 7 e usando quando um MB deve ter a mesma
durao que uma transao do JTA (Java Transaction API).
@FlowScoped
O escopo de fluxo foi criado no Java EE 7 e um escopo maior que uma requisio e menor
que uma sesso. Dentro de uma aplicao, podemos definir vrios fluxos com as seguintes
caractersticas:
11 Cada fluxo possui vrios nodos, entre vises (XHTML), chamadas de funo etc.;
11 Um fluxo pode chamar outros fluxos;
11 Possui um ponto de entrada e vrios pontos de sada;
11 Um MB nesse escopo existe enquanto o fluxo estiver ativo.
ser exibida. Esse processamento passa por diversas fases e cada uma dessas fases tem um
28
objetivo especfico. Conhecer esses passos essencial para o desenvolvedor que usa JSF.
A figura 2.4 mostra um diagrama das fases e seu sequenciamento, executadas pelo FacesServlet. A seguir, sero detalhadas todas as fases e o processamento realizado em cada uma delas.
l
Esse escopo ideal
para representar
wizards (conjunto de
telas que ajudam o
usurio a executar
alguma tarefa, um
assistente) e fluxos de
operao. Um detalhe
importante que o MB
deve ser serializvel
(implementar Serializable).
Response
complete
Faces Request
Faces Response
Restore
View
Apply
Requests
Render
Response
Response
complete
Render
Response
Process
Events
Process
Events
Process
Validation
Process
Events
Response
complete
Invoke
Application
Conversion Error/
Render Response
Figura 2.4
Ciclo de Vida de
uma Requisio JSF.
Response
complete
Process
Events
Update
Model
Values
Validation/
Conversion Errors/
Render Response
Process Events
Os vrios passos chamados Process Events na figura so pontos em que o JSF pode desviar o
fluxo da aplicao, para no seguir o processamento normal. Isso se d por conta de erros
(exemplo: validao de dados), tipo de requisio (exemplo: primeira requisio em vez de
postback) e por conta de chamada voluntria do programador. Nesse caso, em uma
chamada a FacesContext.responseComplete().
Quando a aplicao precisa redirecionar para uma pgina externa ou uma pgina que no
esteja sendo tratada pelo JSF, precisa-se indicar que o JSF no deve renderizar a sada conforme fluxo normal da requisio. Isso feito atravs da chamada a responseComplete().
Restore View
Essa a primeira fase do processamento de uma requisio em JSF. Duas situaes podem
ocorrer: ser a primeira requisio pgina ou ser outra requisio (chamado de postback).
No caso de uma primeira requisio, a rvore de componentes que representa a tela
criada e armazenada no FacesContext, com dados vazios, e o fluxo redirecionado para a
fase de Render Response, responsvel por envi-la para o cliente.
No caso de postback, uma representao da rvore de componentes j existe, e somente
anexados a componentes, so tambm restaurados. Aps isso, a prxima fase invocada.
Em qualquer um dos casos, a rvore de componentes criada precisa ser armazenada para
posterior recuperao. Existem duas tcnicas, que pode ser configurada no arquivo web.xml:
11 Cliente: o estado da tela (ViewState) armazenado em um campo hidden na tela (HTML);
11 Servidor: o estado da tela armazenado na sesso do usurio.
Em qualquer caso, faz-se necessrio armazenar esse estado para se conseguir o comportamento stateful do JSF, visto que HTML, originalmente, no armazena estado de nenhum
componente (stateless). Outro ponto importante a robustez do JSF. Se o estado da pgina
no armazenado, no h mecanismo de verificao indicando se alguma requisio HTTP
foi interceptada e seus atributos alterados (como por exemplo, campos desabilitados,
O cdigo a seguir apresenta um trecho exemplo de pgina XHTML, e a figura 2.5, sua
representao como uma rvore de componentes.
<h:form>
<h:inputText value=#{mb.valor} id=valor />
<h:inputText value=#{mb.texto} id=texto />
<h:commandButton value=Enviar action=#{mb.acao} />
</h:form>
UIViewRoot
UIForm
UIInput
UIInput
UICommand
Process Validations
Nesta fase, os dados j decodificados na fase anterior so convertidos (converses padro
ou converses registradas) e validados (validadores registrados). Se algum erro ocorrer, as
mensagens pertinentes so colocadas no contexto da requisio (FacesContext) e o fluxo
redirecionado para Render Response, para que a mesma pgina (com os erros) seja enviada
e mostrada ao cliente.
Caso nenhum erro seja encontrado, o processo continua para a prxima fase.
Invoke Application
Nesta fase, as aes correspondentes ao componente que disparou a requisio (clique de
um boto ou link) so executadas. Podemos ter vrias aes para serem executadas, e elas
so executadas na seguinte ordem:
1. Mtodo associado com o atributo actionListener;
2. Mtodos associados com as tags <f:actionListener >, na ordem em que aparecem no XHTML;
3. Mtodo associado com o atributo action.
30
Figura 2.5
rvore de
Componentes.
O retorno do mtodo associado ao atributo action determina qual a prxima pgina a ser
renderizada. Se o retorno do mtodo for void ou null, ento permanece na mesma pgina.
Se for uma String, esta o nome da pgina (acrescida de.xhtml) que dever ser renderizada.
Render Response
Fase na qual a prxima tela renderizada e enviada ao cliente. Se a aplicao se mantiver
na mesma pgina, sua representao j conhecida, seu novo estado armazenado e cada
componente convertido para HTML, para que possa ser enviado ao cliente.
Se uma nova pgina precisar ser gerada, uma nova rvore de componentes criada e esta
representao armazenada, para que na prxima requisio possa ser recuperada.
Se houver alguma mensagem de erro no contexto da requisio e se houver tags
<h:message> ou <h:messages>, essas mensagens tambm so renderizadas no HTML resul-
MB, a fase Invoke Application ainda ser chamada, visto que nessa fase que o JSF descobre
qual ser a prxima tela a ser renderizada para o usurio.
Navegao
A navegao entre telas de uma aplicao JSF um mecanismo sofisticado, mas simples
de implementar e entender. Tudo baseado em um sinal enviado para o JSF, chamado
outcome. Por exemplo, se uma pgina possui um link para uma segunda pgina, envia-se o
outcome segunda para o JSF e o usurio ser redirecionado para a pgina segunda.xhtml.
Assim, o outcome nada mais do que o nome da pgina sem a extenso.xhtml.
Os componentes visuais que fazem transio entre pginas so os componentes de ao
<h:commandButton> e <h:commandLink>, e os componentes de redirecionamento <h:button>
Componentes visuais:
31
32
3
Conhecer os componentes visuais para confeco de telas em JSF, usando formulrios
e manipulao de dados para apresentao.
conceitos
Estrutura bsica
As telas de uma aplicao JSF so definidas em arquivos XML. Tags bem definidas nesses
arquivos fazem com que se possa descrever telas usando HTML e tags do prprio JSF.
O JSF possui um tratador de telas (vises) chamado de VDL (View Declaration Language), que
at antes da verso JSF 2.0 era implementado com o JSP. Aps a verso 2.0, foi introduzido
o Facelets, que um tratador otimizado de vises, sem os problemas de incompatibilidade
que eram comuns ao JSP.
Para usar os componentes do JSF, devemos incluir as bibliotecas de tags nos arquivos XHTML.
As mais importantes so:
objetivos
33
<h:head>
<title>JSF</title>
</h:head>
<h:body>
<h:outputText value=Estrutura bsica de uma tela JSF />
</h:body>
</html>
Onde <h:outputText indica que a tag outputText da bibliotega h (html), representada pela
URI http://java.sun.com/jsf/html.
O exemplo anterior tambm apresenta a estrutura bsica de uma viso (tela) XHTML para
o JSF. Os seguintes elementos so obrigatrios:
11 DOCTYPE;
11 HTML.
A pgina delimitada pela tag <html>.
11 H:BODY
34
O uso das tags h:head e h:body recomendado para que o JSF possa renderizar scripts ou
recursos necessrios na fase Render Response, para que a pgina funcione adequadamente.
Formulrios
Formulrios so definidos pela tag h:form. Os formulrios em JSF so renderizados como
formulrios HTML que enviam dados via POST, independente se for definido um boto
ou um link de submisso. Scripts inseridos na pgina pelo prprio JSF se encarregam de
ajustar o comportamento.
Dentro do formulrio, devem ser colocados componentes de entrada de dados, cujos
valores inseridos sero enviados para o JSF ao ser efetuado um submit.
<h:form>
<h:outputLabel value=Nome: for=nome />
<h:inputText value=#{exemploMB.nome} id=nome />
<h:commandButton value=Enviar />
</h:form>
</h:body>
</html>
35
Renderizado em HTML
<?xml version=1.0 encoding=UTF-8 ?>
<!DOCTYPE html>
<html xmlns=http://www.w3.org/1999/xhtml> <head id=j_idt2><title>Exemplo</
title></head> <body>
<form id=j_idt5 name=j_idt5 method=post action=/CaixasTexto/faces/index.
xhtml enctype=application/x-www-form-urlencoded>
<input type=hidden name=j_idt5 value=j_idt5 />
<label for=j_idt5:nome>Nome: </label>
<input id=j_idt5:nome type=text name=j_idt5:nome />
<input type=submit name=j_idt5:j_idt7 value=Enviar />
<input type=hidden name=javax.faces.ViewState id=j_id1:javax.faces.
ViewState:0 value=-8689468098154464721:-6542804232569543406 autocomplete=off />
</form>
</body></html>
Figura 3.1
Formulrio em JSF.
Binding e processamento
Quando se escreve um componente visual em uma pgina XHTML do JSF, em geral necessrio lig-lo a um componente ou atributo no MB. Esse comportamento chamado de
binding ou ligao.
Podemos fazer dois tipos de ligao:
11 Valor: faz-se com que o componente seja preenchido com um atributo do MB e,
quando o formulrio for submetido, faz com que o valor digitado seja escrito nesse
mesmo atributo. Usa-se o atributo value:
<h:inputText value=#{pessoaMB.nome} />
36
11 <h:inputText />: usada para entrar com textos simples. Renderiza um:
<input type=text />
11 <h:inputArea />: usada para entrar com textos em vrias linhas. Renderiza um:
<textArea>
11 <h:inputSecret />: usada para entrar com textos sem eco, por exemplo, senhas.
Renderiza um: <input type=password />
Caixas de texto
A tabela 3.1 mostra alguns atributos do <h:inputText />.
Descrio
id
Identificador do componente
value
readonly
disabled
required
requiredMessage
maxlength
size
title
style
styleClass
Eventos do DOM
A seguir, temos um exemplo que mostra como um <h:inputText /> escrito em JSF, como
renderizado em HTML e como apresentado no navegador.
Cdigo em JSF
<h:outputLabel value=Nome: for=nome />
<h:inputText value=#{exemploMB.nome} id=nome />
Tabela 3.1
Atributos de
<h:inputText />.
Atributo
37
Renderizado em HTML
<label for=j_idt5:nome>Nome: </label>
<input id=j_idt5:nome type=text name=j_idt5:nome />
Figura 3.2
Apresentao do
<h:inputText />
em JSF, renderizado
em HTML e no
navegador.
Descrio
id
Identificador do componente
cols
Nmero de linhas
rows
Nmero de colunas
value
readonly
disabled
required
requiredMessage
maxlength
title
style
styleClass
Eventos do DOM
Tabela 3.2
Atributos de
<h:inputTextarea />.
A figura a seguir mostra como um <h:inputTextarea /> escrito em JSF, como renderizado
em HTML e como apresentado no navegador.
Cdigo em JSF
38
Renderizado em HTML
<label for=j_idt5:descricao>Descrio: </label>
<textarea id=j_idt5:descricao name=j_idt5:descricao>
</textarea>
Figura 3.3
Apresentao do
<h:inputTextarea />
em JSF, renderizado
em HTML e no
navegador.
Descrio
id
Identificador do componente
redisplay
(true/false) por default no recarregado o valor do bean. Setando para true, o valor
trazido
value
readonly
disabled
required
requiredMessage
maxlength
size
title
style
styleClass
Eventos do DOM
Tabela 3.3
Atributos de
<h:inputSecret />.
Podemos ver adiante como um <h:inputSecret /> escrito em JSF, como renderizado em
HTML e como apresentado no navegador.
Cdigo em JSF
<h:outputLabel value=Senha: for=senha />
<h:inputSecret value=#{exemploMB.senha} id=senha />
Renderizado em HTML
<label for=j_idt5:senha>Senha: </label>
Figura 3.4
Apresentao do
<h:inputSecret />
em JSF, renderizado
em HTML e no
navegador.
39
@Named(value = exemploMB)
@RequestScoped
public class ExemploMB {
private String nome;
private String senha;
private String descricao;
// setters/getters
}
Figura 3.5
Os trs tipos de
caixa de entrada
em um nico
formulrio.
40
Rtulos
Para renderizar um rtulo de um componente no formulrio, usa-se <h:outputLabel />.
Esse componente aumenta a rea clicvel de elementos, como botes de rdio, e pode ser
usado por leitores de tela em casos de aplicativos de acessibilidade. A tabela 3.4 mostra
alguns atributos de <h:outputLabel />.
Atributo
Descrio
id
Identificador do componente
value
Texto do rtulo
for
Associa o rtulo a um componente. Deve conter o ID do componente para o qual ele rtulo
style
styleClass
Eventos do DOM
Tabela 3.4
Atributos de
<h:ouputLabel>.
O cdigo a seguir mostra como um <h:ouputLabel /> escrito em JSF, como renderizado
em HTML e como apresentado no navegador.
Cdigo em JSF
<h:outputLabel value=Nome: for=nome />
<h:inputText value=#{exemploMB.nome} id=nome />
Renderizado em HTML
<label for=j_idt5:nome>Nome: </label>
<input id=j_idt5:nome type=text name=j_idt5:nome />
Figura 3.6
Apresentao do
<h:ouputLabel />
em JSF, renderizado
em HTML e no
navegador.
Campos ocultos
A tag <h:inputHidden> renderiza um campo oculto ( <input type=hidden /> ). usada para
enviar informaes em um formulrio, sem que esse dado aparea para o usurio. A Tabela 3.5
apresenta seus principais atributos.
Atributo
Descrio
value
Valor do campo, pode ser ligado a uma propriedade de um bean atravs de EL ( #{...} )
id
Associa o rtulo a um componente, deve conter o ID do componente para o qual ele rtulo
O cdigo a seguir mostra como um <h:inputHidden /> escrito em JSF e como renderizado
em HTML.
Cdigo em JSF
<h:inputHidden value=#{exemploMB.nome} />
Renderizado em HTML
<input type=hidden name=j_idt5:j_idt10 />
Tabela 3.5
Atributos de
<h:inputHidden>.
41
Caixas de Seleo
O JSF fornece sete tipos de caixas de seleo, a saber:
11 <h:selectBooleanCheckbox>: cria um CHECKBOX para seleo do tipo sim/no, vinculada a uma propriedade booleana;
11 <h:selectOneMenu>: cria um COMBOBOX, onde somente uma opo mostrada por
vez e somente uma pode ser selecionada;
11 <h:selectManyListbox>: cria um LISTBOX, onde vrias opes so mostradas e vrias
podem ser selecionadas;
11 <h:selectManyCheckbox>: cria vrios campos CHECKBOX, para seleo de mltiplas
escolhas;
11 <h:selectOneRadio>: cria vrios campos do tipo RADIO, mutuamente exclusivos
(somente um pode estar selecionado);
11 <h:selectOneListbox>: cria um LISTBOX, onde vrias opes so mostradas, mas
somente uma opo pode ser selecionada;
11 <h:selectManyMenu>: cria um COMBOBOX, onde somente uma opo mostrada por
vez, mas vrias podem ser selecionadas.
42
Figura 3.7
Todas as Caixas
de Seleo.
Atributo
Descrio
id
identificador do componente
value
readonly
Disabled
title
style
styleClass
Eventos do DOM
Tabela 3.6
Atributos de
<h:selectBoolean
Checkbox>.
Renderizado em HTML
<label for=j_idt5:teste>Teste</label>
<input id=j_idt5:teste type=checkbox name=j_idt5:teste checked=checked />
Figura 3.8
<h:selectBoolean
Checkbox> em
JSF, renderizado
em HTML e no
navegador.
43
Tabelaa 3.7
Atributos de
<h:selectOneMenu>.
Atributo
Descrio
id
identificador do componente
value
readonly
disabled
title
style
styleClass
Eventos do DOM
Para preenchimento dos itens usa-se a tag <f:selectItem> da biblioteca core do JSF. A tabela
3.8 apresenta seus principais atributos.
Atributo
Descrio
itemLabel
itemValue
itemDisabled
noSelectionOption
Tabela 3.8
Atributos de
<f:selectItem>.
Cdigo em JSF
<h:outputLabel value=Sexo: for=sexo />
JAVA Frameworks e Aplicaes Corporativas
44
Renderizado em HTML
<label for=j_idt5:sexo>Sexo: </label>
<select id=j_idt5:sexo name=j_idt5:sexo size=1>
<option value=M>Masculino</option>
<option value=F>Feminino</option>
</select>
Figura 3.9
<h:selectOneMenu>
em JSF, renderizado
em HTML e no
navegador.
Tabela 3.9
Atributos de
<h:selectMany
Listbox>.
Atributo
Descrio
id
identificador do componente
value
size
readonly
disabled
title
style
45
Atributo
Descrio
styleClass
Eventos do DOM
O cdigo a seguir mostra como um <h:selectManyListbox> escrito em JSF, como renderizado em HTML e como apresentado no navegador.
Cdigo em JSF
<h:outputLabel value=Cor: for=cor />
<h:selectManyListbox id=cor >
<f:selectItem id=M itemLabel=Verde itemValue=V />
<f:selectItem id=F itemLabel=Azul itemValue=A />
</h:selectManyListbox>
Renderizado em HTML
<label for=j_idt5:cor>Cor: </label>
<select id=j_idt5:cor name=j_idt5:cor multiple=multiple size=2>
<option value=V>Verde</option>
<option value=A>Azul</option>
</select>
Figura 3.10
<h:selectMany
Listbox> em
JSF, renderizado
em HTML e no
navegador.
size=3 >
46
@Named(value = exemploMB)
@RequestScoped
public class ExemploMB {
private List<String> estados;
@PostConstruct
public void init() {
estados = new ArrayList<String>();
estados.add(pr);
estados.add(sc);
}
public List<String> getEstados() {
return this.estados;
}
public void setEstados(List<String> estados) {
this.estados = estados;
}
}
11 @PreDestroy.
22 O mtodo anotado invocado antes da destruio.
Exerccios
Caixa de Seleo: mltiplos Checkboxes
O componente <h:selectManyCheckbox> renderiza uma tabela contendo uma lista de checkbox
para seleo do tipo SIM/NO, que poder ser vinculada a uma propriedade lista de um Managed
47
Descrio
id
identificador do componente
value
layout
border
readonly
disabled
title
style
styleClass
Eventos do DOM
</h:selectManyCheckbox>
48
Renderizado em HTML
<table border=0 id=j_idt5:teste>
<tr><td>
<input name=j_idt5:teste id=j_idt5:teste:0 value=SC type=checkbox />
<label for=j_idt5:teste:0 class=> Santa Catarina</label></td>
</tr><tr><td>
<input name=j_idt5:teste id=j_idt5:teste:1 value=PR type=checkbox />
<label for=j_idt5:teste:1 class=> Paran</label></td>
</tr><tr><td>
<input name=j_idt5:teste id=j_idt5:teste:2 value=RS type=checkbox />
<label for=j_idt5:teste:2 class=> Rio Grande do Sul</label></td>
</tr>
Tabela 3.10
Atributos de
<h:selectMany
Checkbox>.
</table>
Figura 3.11
<h:selectMany
Checkbox> em
JSF, renderizado
em HTML e no
navegador.
@Named(value = exemploMB)
@RequestScoped
public class ExemploMB {
private List<String> escolhidos = new ArrayList<>();
@PostConstruct
public void init() {
escolhidos.add(PR);
escolhidos.add(SC);
}
// setters/getters
49
Descrio
id
identificador do componente
value
layout
border
readonly
disabled
title
style
styleClass
Eventos do DOM
Tabela 3.11
Atributos de
<h:selectOne
Radio>.
Cdigo em JSF
<h:selectOneRadio id=sexo layout=pageDirection >
<f:selectItem id=M itemLabel=Masculino itemValue=M />
<f:selectItem id=F itemLabel=Feminino itemValue=F />
</h:selectOneRadio>
Renderizado em HTML
<table id=j_idt5:sexo>
<tr><td>
<input type=radio name=j_idt5:sexo id=j_idt5:sexo:0 value=M />
<label for=j_idt5:sexo:0> Masculino</label></td>
</tr><tr><td>
<input type=radio name=j_idt5:sexo id=j_idt5:sexo:1 value=F />
JAVA Frameworks e Aplicaes Corporativas
50
</tr>
</table>
Figura 3.12
<h:selectOneRadio>
em JSF, renderizado
em HTML e no
navegador.
@Named(value = exemploMB)
@RequestScoped
public class ExemploMB {
private String sexo;
// setters/getters
}
Atributo
Descrio
id
identificador do componente
value
Size
readonly
disabled
title
style
styleClass
Eventos do DOM
Tabela 3.13
Atributos de
<h:selectOne
Listbox>.
51
O cdigo a seguir mostra como um <h:selectOneListbox> escrito em JSF, como renderizado em HTML e como apresentado no navegador.
Cdigo em JSF
<h:outputLabel value=Cor: for=cor />
<h:selectOneListbox id=cor >
<f:selectItem id=M itemLabel=Verde itemValue=V />
<f:selectItem id=F itemLabel=Azul itemValue=A />
</h:selectOneListbox>
Renderizado em HTML
<label for=j_idt5:cor>Cor: </label>
<select id=j_idt5:cor name=j_idt5:cor size=2>
<option value=V>Verde</option>
<option value=A>Azul</option>
</select>
Figura 3.13
<h:selectOne
Listbox> em
JSF, renderizado
em HTML e no
navegador.
<f:selectItem id=rs
52
@Named(value = exemploMB)
@RequestScoped
public class ExemploMB {
private String estado;
// setters/getters
}
Descrio
id
identificador do componente
value
Valor dos itens selecionados (casa com o itemValue do item), pode ligar a uma propriedade de um MB, que deve ser uma lista.
readonly
disabled
title
style
styleClass
Eventos do DOM
Tabela 3.14
Atributos de
<h:selectManyMenu>.
O cdigo a seguir mostra como um <h:selectManyListbox> escrito em JSF, como renderizado em HTML e como apresentado no navegador.
Cdigo em JSF
<h:outputLabel value=Cor: for=cor />
<h:selectManyMenu id=cor >
<f:selectItem id=M itemLabel=Verde itemValue=V />
<f:selectItem id=F itemLabel=Azul itemValue=A />
</h:selectManyMenu>
Renderizado em HTML
53
@Named(value = exemploMB)
@RequestScoped
public class ExemploMB {
private List<String> estados;
// setters/getters
}
22 <h:selectOneMenu value=#{pessoaMB.estado}>
54
22
22
22 </h:selectOneMenu>
11 Atributos
22 itemValue: o que ser enviado se o item for selecionado
22 itemLabel: descrio, o que mostrado para o usurio na opo
No exemplo anterior renderizado um ComboBox ( <select> ) e dentro dele dois elementos do tipo <option>. A tabela 3.8 apresentada anteriormente mostra os atributos de
<f:selectItem>.
Opes dinmicas
11 Alteraes nas listas podem ser dinamicamente mostradas
11 <f:selectItems>: executa um lao entre os vrios elementos indicados em sua propriedade values, montando as opes da tag de seleo
11 Por exemplo:
22 <h:selectOneMenu value=#{pessoaMB.estado}>
22
<f:selectItems value=#{pessoaMB.listaEstados}
22
var=estado
22
itemValue=#{estado.sigla}
22
itemLabel=#{estado.nome} />
22 </h:selectOneMenu>
11 Atributos:
22 value: lista de itens a serem varridos
22 var: varivel que assume um item em cada iterao sobre os itens especificados
em value
22 itemLabel: o texto (rtulo) de cada opo
22 itemValue: valor do item que ser submetido, quando esta opco estiver selecionada
Nesse caso acima, o ComboBox ter como elementos todo o contedo de
#{pessoaMB. listaEstados}.
Atributo
Descrio
value
Lista de itens a ser varrida. Para cada element dessa lista, um item ser gerado.
var
itemLabel
itemValue
Valor do item que ser submetido, quando esta opco estiver selecionada
itemDisabled
noSelectionValue
Tabela 3.15
Atributos de
<f:selectItems>.
Os cdigos a seguir mostram o XHTML de uma aplicao usando carga dinmica de opes
em um ComboBox ( <f:selectOneMenu> ), o Managed Bean e o Bean Estado, criado para
armazenar os dados a serem mostrados.
55
<h:form>
<h:panelGrid columns=2>
<h:outputLabel value=Selecionado: for=selecionadostr />
<h:outputText value=#{exemploMB.selecionado} id=selecionadostr />
<h:outputLabel value=Estados: for=estado />
<h:selectOneMenu id=estado value=#{exemploMB.selecionado} >
<f:selectItems value=#{exemploMB.listaEstados}
var=estado
itemLabel=#{estado.nome}
itemValue=#{estado.sigla} />
</h:selectOneMenu>
<h:commandButton value=Enviar />
</h:panelGrid>
</h:form>
@Named(value = exemploMB)
@RequestScoped
public class ExemploMB {
private String selecionado;
private List<Estado> listaEstados;
@PostConstruct
public void init() {
listaEstados = new ArrayList<Estado>();
Estado e = new Estado();
e.setSigla(PR);
e.setNome(Paran);
listaEstados.add(e);
e = new Estado();
e.setSigla(SC);
e.setNome(Santa Catarina);
listaEstados.add(e);
}
// setters/getters
JAVA Frameworks e Aplicaes Corporativas
56
Deve-se notar no exemplo anterior que a inicializao do Managed Bean foi feita no mtodo
init(), anotado com @PostConstruct.
<h:selectManyCheckbox>
<h:selectOneRadio>
<h:selectOneMenu>
<h:selectOneListbox>
<h:selectManyListbox>
<h:selectManyMenu>
Os componentes de seleo nica precisam ligar seu atributo value a somente um elemento
no Managed Bean, por exemplo, no XHTML:
<h:selectOneRadio id=sexo
value=#{exemploMB.sexo}
layout=pageDirection>
<f:selectItem id=M itemLabel=Masculino
itemValue=M />
<f:selectItem id=F itemLabel=Feminino
itemValue=F />
</h:selectOneRadio>
E no MB:
@Named(value = exemploMB)
@RequestScoped
public class ExemploMB {
private String sexo;
}
// setters/getters
Tabela 3.16
Seleo nica x
Seleo Mltipla..
Seleo Mltipla
57
J os componentes que possuem seleo mltipla devem ter uma lista de elementos para
receber os elementos selecionados e submetidos. Por exemplo, no XHTML:
<h:selectManyListbox id=estados
value=#{exemploMB.estados}
size=3 >
<f:selectItem id=pr itemLabel=Paran
itemValue=PR />
<f:selectItem id=sc itemLabel=Santa Catarina
itemValue=SC />
<f:selectItem id=rs
itemLabel=Rio Grande do Sul
itemValue=RS />
<f:selectItem id=sp itemLabel=So Paulo
itemValue=SP />
<f:selectItem id=mg itemLabel=Minas Gerais
itemValue=MG />
</h:selectManyListbox>
E no MB:
@Named(value = exemploMB)
@RequestScoped
public class ExemploMB {
private List<String> estados;
// setters/getters
}
Opo No Selecionada
Para que um componente com mltiplas opes apresente uma opo no selecionada,
usa-se o atributo noSelectionOption em algum item, conforme o seguinte exemplo:
<h:selectOneMenu value=#{pessoaMB.estados}>
<f:selectItem itemLabel=Nenhum
noSelectionOption=true />
<f:selectItems value=#{pessoaMB.estados}
var=estado
itemValue=#{estado.sigla}
58
itemLabel=#{estado.nome} />
</h:selectOneMenu>
4
Aprender sobre os demais componentes visuais, para criar interfaces grficas em JSF.
conceitos
objetivos
Botes e links
O JSF possui cinco tipos de botes e links, com variaes nos mtodos de submisso (POST
ou GET) e no destino das pginas. So eles:
Botes:
11 <h:commandButton>: renderiza um boto que, quando clicado, submete um formulrio
via POST;
11 <h:button>: renderiza um boto que realiza uma requisio via GET para uma pgina
do sistema quando clicado.
Links:
11 <h:commandLink>: renderiza um link que, quando clicado, submete um formulrio
via POST;
11 <h:link>: renderiza um link que realiza uma requisio via GET para uma pgina do
sistema quando clicado.
Tabela 4.1
Comparativo entre
botes e links.
Componente
Tipo
Submisso
Destino
<h:commandButton>
BOTO
POST
JSF
<h:button>
BOTO
GET
JSF
<h:commandLink>
LINK
POST
JSF
<h:link>
LINK
GET
JSF
<h:outputLink>
LINK
GET
Externas
Link externo:
59
Cada uma destas variantes de botes e links ser explorada em maior detalhe a seguir.
Boto de Ao <h:commandButton>
O componente <h:commandButton> um boto com ao de submisso, para um formulrio via POST. Ele renderiza um <input type=submit />. A tabela 317 apresenta seus
principais atributos.
Atributos
Descrio
value
action
actionListener
Contm o mtodo de um ActionListener, que ser invocado quando o boto for pressionado. Exemplo: #{mb.acaoListener}
type
image
A URL ou caminho da imagem que ser renderizada como um boto de submit (renderiza
um <input type=image src=... />)
disabled
style
styleClass
Eventos do DOM
Tabela 4.2
Atributos de
<h:command
Button>.
Cdigo em JSF
<h:commandButton action=#{exemploMB.acaoBotao}
value=Boto de Comando />
Renderizado em HTML
<input type=submit name=j_idt5:j_idt10 value=Boto de Comando />
Boto de Comando
60
Descrio
value
action
actionListener
Figura 4.1
<h:command
Button> JSF,
HTML e imagem
renderizada.
Tabela 4.3
Atributos de
<h:commandLink>.
Atributos
Descrio
type
disabled
style
styleClass
Eventos do DOM
Renderizado em HTML
<script type=text/javascript src=/BotoesLinks/faces/javax.faces.resource/jsf.
js?ln=javax.faces&stage=Development>
</script>
<a href=# onclick=mojarra.jsfcljs(document.getElementById(j_idt5),{j_idt5:j_
Figura 4.2
<h:commandLink>
JSF, HTML e imagem
renderizada.
Link de Comando
Boto <h:button>
O componente <h:button> um boto que direciona para uma pgina da aplicao.
Ele renderiza um <input type=button> e seu redirecionamento um mtodo GET.
A tabela 4.4 apresenta seus principais atributos.
Atributos
Descrio
value
outcome
disabled
image
A URL ou caminho da imagem que ser renderizada como um boto de submit (renderiza
um <input type=image src=... />)
style
styleClass
Eventos do DOM
Tabela 4.4
Atributos de
<h:button>.
61
Cdigo em JSF
<h:button outcome=teste value=Boto/>
Renderizado em HTML
<input type=button onclick=window.location.href=/BotoesLinks/faces/teste.
xhtml; return false; value=Boto />
Figura 4.3
<h:button> JSF,
HTML e imagem
renderizada.
Boto
Link <h:link>
O componente <h:link> um link que direciona para uma pgina da aplicao. Ele renderiza
um <a href=> e seu redirecionamento um mtodo GET. A tabela 4.5 apresenta seus
principais atributos.
Atributos
Descrio
value
outcome
disabled
style
styleClass
Eventos do DOM
A figura 4.4 mostra como um <h:link> escrito em JSF, como renderizado em HTML e
como apresentado no navegador.
Tabela 4.5
Atributos de
<h:link>.
Cdigo em JSF
<h:link outcome=teste value=Link/>
Renderizado em HTML
<a href=/BotoesLinks/faces/teste.xhtml>Link</a>
Link
62
Figura 4.4
<h:link> JSF,
HTML e imagem
renderizada.
Atributos
Descrio
value
disabled
style
styleClass
Eventos do DOM
Tabela 4.6
Atributos de
<h:outputLink>.
</h:outputLink>
Renderizado em HTML
<a href=http://www.google.com.br>Google</a>
Figura 4.5
<h:outputLink>
JSF, HTML e imagem
renderizada.
63
Managed Bean
@Named(value = exemploMB)
@RequestScoped
public class ExemploMB {
private String texto;
private String acao;
// setters/getters
public void acaoBotao() {
this.acao = Pressionou um BOTO de ao;
}
public void acaoLink() {
this.acao = Pressionou um LINK de ao;
}
}
Teste.xhtml
Teste de Links <br/>
<h:link outcome=index value=Voltar />
Textos
Para inserir textos nas pginas XHTML, temos dois componentes:
11 <h:outputText>: o que for escrito no atributo value apresentado;
Textos simples
O <h:outputText> recomendado quando se precisa fazer uma renderizao condicional
(usando o atributo rendered), quando precisamos fazer formataes (um elemento <span>
renderizado) ou quando se necessita alguma funcionalidade via AJAX. Outra utilidade que
torna o uso desta tag extremamente recomendado o fato de o JSF j ter embutido um mecanismo de preveno de ataques do tipo XSS (Cross-Site Scripting), que uma vulnerabilidade
onde um hacker consegue colocar cdigos Javascript dentro de campos no site, fazendo com
que ele obtenha controle do sistema, como por exemplo, monitorando entradas de usurio ou
64
Cdigo em JSF
<h:outputText value=Teste styleClass=classecss />
Renderizado em HTML
<span class=classecss>Teste</span>
Teste
Figura 4.6
<h:outputText>
JSF, HTML e texto
renderizado.
Textos formatados
O <h:outputFormat> usado para criar textos formatados atravs de parametrizao.
Tambm recomendando quando se deseja concatenar textos com variveis, quando se
precisa fazer uma renderizao condicional (usando-se o atributo rendered), quando se
precisa fazer formataes (um elemento <span> renderizado) ou quando se necessita
alguma funcionalidade via AJAX.
Para criar os textos formatados usam-se parmetros que so adicionados dentro da string
final. Os parmetros comeam em {0}, depois {1} e assim por diante. Para preencher esses
parmetros na string, usamos a tag <f:param>, que possui os seguintes atributos:
Atributo
Descrio
name
Nome do parmetro. No caso do <h:outputFormat>, no precisa ser utilizado, pois a ordem em que
os parmetros so colocados a ordem em que sero inseridos na string
value
Tabela 4.7
Atributos de
<f:param>.
Renderizado em HTML
<span class=classecss>Meu nome Maria e tenho 20 anos.</span>
Figura 4.7
<h:outputFormatt>
JSF, HTML e texto
renderizado.
Imagens
O componente do JSF usado para inserir imagens o <h:graphicImage>. Esse componente
renderiza um <img src= />. A tabela 4.8 mostra alguns de seus atributos.
Atributo
Descrio
value
A url a imagem a ser mostrada. Se iniciar com /, procura a imagem no contexto da aplicao.
Pode-se colocar uma URL completa da imagem. Tambm possvel que aponte para um recurso
(imagem) diretamente retornado por um MB
width
height
usemap
alt
library
Nome da biblioteca de imagens sendo utilizada. Deve ser um subdiretrio do diretrio /resources,
que est na raiz da aplicao
name
Usado juntamente com o atributo library. Nome da imagem que est dentro da biblioteca
Tabela 4.8
Atributos de
<h:graphicImage>.
65
Renderizado em HTML
<img src=http://docs.oracle.com/javaee/6/tutorial/doc/graphics/javalogo.png />
Figura 4.8
<h:graphicImage>
JSF, HTML e texto
renderizado.
Biblioteca de recursos
As imagens podem estar armazenadas em diretrios especficos chamados de bibliotecas.
Uma biblioteca de imagens deve ser um subdiretrio dentro do diretrio /resources, que se
situa na raiz da aplicao. Para adicionar uma imagem de uma biblioteca, usa-se o atributo
library e o nome da imagem deve ser configurado com o atributo name. Por exemplo:
<h:graphicImage library=fotos name=foto.jpg />
66
Figura 4.9
Biblioteca de
Imagens.
A estrutura de bibliotecas tambm pode ser usada para carregar Scripts personalizados e
estilos CSS, usando-se as tags <h:outputScript> e <h:outputStylesheet>, respectivamente,
desde que dentro do diretrio tema1 sejam criados os diretrios js e css. Segue um exemplo:
<h:outputScript library=tema1 name=js/func.js />
<h:outputStylesheet library=tema1
name=css/estilo.css />
Versionamento de Recursos
possvel armazenar diferentes verses de bibliotecas atravs de um padro numrico em
dois nveis no formato DIGITOS_DIGITOS, conforme o seguinte exemplo:
1_0
ou 2_1
O JSF sempre referencia a verso mais atual (maior) para acessar os recursos. Esse versionamento opcional, bastando omiti-lo, como no exemplo anterior (tema1). Na imagem a seguir
Figura 4.10
Biblioteca de
Imagens com
verses.
67
JavaScript e CSS
Scripts em JavaScript e CSS adicionais (leiautes) podem ser adicionados usando as tags
comuns: <script> e <link>. O ideal usar o mecanismo de bibliotecas (o mesmo mostrado
para imagens) e, neste caso, usamos as seguintes tags do JSF:
<h:outputScript>: inclui um JS e usa o mesmo esquema de bibliotecas:
Atributo Rendered
Todos os componentes visuais do JSF possuem o atributo booleano rendered. Seu objetivo
fazer a renderizao condicional, isto , se o seu valor for verdadeiro (true), o componente
mostrado; caso contrrio, no mostrado. Isso evita a proliferao de comandos condicionais, comuns no desenvolvimento com JSTL.
Todos os componentes do JSF possuem o atributo booleano rendered:
11 Usado para dizer se o componente deve ou no ser apresentado na fase de
Render Response;
11 Seu valor default true.
Exemplo:
<h:outputFormat value=Aluno: {0} Mdia: {1}
rendered=#{alunoMB.mostrarAluno}>
<f:param value=#{alunoMB.nome} />
JAVA Frameworks e Aplicaes Corporativas
68
</h:outputFormat>
Dentro do atributo rendered, tambm podemos colocar uma expresso complexa, por
exemplo, queremos mostrar um determinado <h:outputText> caso:
(alunoMB.media >= 7.0 e alunoMB.mostrarAluno) ou (alunoMB.media < 7.0)
<h:outputText value=Oi
rendered=#{(alunoMB.media ge 7.0 and alunoMB.mostrarAluno) or
(alunoMB.media lt 7.0)} />
<h:form>
Media: <h:inputText value=#{alunoMB.media} /> <br/>
<h:selectBooleanCheckbox value=#{alunoMB.mostrarAluno} /> Mostrar? <br/>
<h:commandButton value=OK />
</h:form>
@Named(value = alunoMB)
@RequestScoped
public class AlunoMB {
private boolean mostrarAluno = false;
private double media = 0.0;
// setters/getters
}
Componentes de organizao
Para composio de Grids usando os componentes visuais, podemos usar dois componentes de organizao:
11 <h:panelGrid>: organiza os elementos em uma grade ou tabela. Atributo columns: se
<table><tbody>
<tr><td><label for=nome>Nome: </label></td>
<td><input id=nome type=text name=nome value=Joo /></td></tr>
<tr><td><label for=idade>Idade: </label></td>
<td><input id=idade type=text name=idade value=18 /></td></tr>
</tbody></table>
Figura 4.11
<h:panelGrid>
JSF, HTML e texto
renderizado.
Renderizado em HTML
69
/>
Figura 4.12
<h:panelGroup>
renderizado.
70
Tabelas
O componente para criao de tabelas o <h:dataTable>.
11 Principais atributos <h:dataTable>:
22 Atributo value: uma lista contendo os elementos da tabela, gera uma linha para
cada item da lista;
22 Atributo var: a cada volta do lao, representa um elemento da lista.
11 Colunas da tabela so definidas por <h:column> e
11 Cabealhos ou rodaps so definidos por <f:facet>.
Managed Bean
@Named(value = alunoMB)
@RequestScoped
public class AlunoMB {
private List<Aluno> alunos;
@PostConstruct
public void init() {
alunos = new ArrayList<Aluno>();
Aluno a = new Aluno();
a.setNome(Joo);
a.setIdade(18);
a.setEmail(joao@joao.com);
alunos.add(a);
a = new Aluno();
a.setNome(Maria);
a.setIdade(20);
a.setEmail(maria@maria.com);
alunos.add(a);
}
// setters/getters
Bean Aluno
public class Aluno {
private String nome;
private int idade;
private String email;
//setters/getters
}
71
Renderizado em HTML
<table>
<tbody>
<tr>
<td>Joo</td>
<td>18</td>
<td>joao@joao.com</td>
</tr>
<tr>
<td>Maria</td>
<td>20</td>
<td>maria@maria.com</td>
</tr>
</tbody>
</table>
Joo
Maria
18 joao@joao.com
20 maria@maria.com
Para criar cabealhos e rodaps na tabela ou coluna usamos a tag da biblioteca core
<f:facet>. O seu atributo name determina o tipo e, para tabelas, temos dois: header ou
<h:column>
72
<f:facet name=header>E-mail</f:facet>
#{aluno.email}
</h:column>
<f:facet name=footer>Fim da Lista</f:facet>
</h:dataTable>
Figura 4.13
Apresentao
da tabela no
navegador.
Renderizado em HTML
<table border=1>
<thead>
<tr><th colspan=3 scope=colgroup>Lista de Alunos</th></tr>
<tr>
</tr>
</thead>
<tfoot>
<tr>
</tr>
<tr> <td> Maria </td> <td> 20 </td> <td> maria@maria.com </td>
</tr>
</tbody>
</table>
Lista de Alunos
Nome
Idade
Joo
18
joao@joao.com
Maria
20
maria@maria.com
X
Fim da lista
Mensagens
Pode-se adicionar mensagens no processamento de uma requisio para que sejam mostradas na prxima pgina a ser exibida (resposta). O cdigo a seguir mostra como adicionar
uma mensagem dentro de um Managed Bean:
FacesMessage mensagem = new FacesMessage(
Aluno Removido);
mensagem.setSeverity(FacesMessage.SEVERITY_ERROR);
FacesContext.getCurrentInstance().addMessage(
null, mensagem);
Figura 4.14
Apresentao
no navegador de
uma tabela com
cabealhos e
rodaps.
73
A classe FacesMessage a que representa uma mensagem a ser mostrada e possui dois
construtores teis e um mtodo para definir a severidade da mensagem. So eles:
11 FacesMessage(String resumo): cria um FacesMessage com uma mensagem resumida;
11 FacesMessage(String resumo, String detalhes): cria um FacesMessage com uma mensagem resumida e com uma mensagem detalhada;
11 setSeverity(FacesMessage.Severity): configura a severidade da mensagem, que pode ser:
22 FacesMessage.SEVERITY_INFO
22 FacesMessage.SEVERITY_WARN
22 FacesMessage.SEVERITY_ERRO
22 FacesMessage.SEVERITY_FATAL
A tag <h:messages/> possui os seguintes atributos principais:
11 showDetail: true/false, se deve ou no mostrar os detalhes da mensagem. Default false;
11 showSummary: true/false, se deve ou no mostrar a mensagem resumida. Default true;
11 style, styleClass, errorClass, errorStyle, fatalClass, fatalStyle, infoClass, infoStyle,
warnClass, warnStyle: para definir a classe CSS de apresentao da mensagem, em
cada uma das severidades.
Os cdigos a seguir mostram o XHTML exemplo e o Managed Bean exemplo de uso
de mensagens.
XHTML
Aqui aparece a mensagem:
<h:messages style=color: red showDetail=true/>
<h:form>
<h:commandButton action=#{mensagemMB.criarMensagem}
value=Mensagem/>
</h:form>
Managed Bean
@Named(value = mensagemMB)
@RequestScoped
public class MensagemMB {
public MensagemMB() {
JAVA Frameworks e Aplicaes Corporativas
74
Repetio
O JSF tambm disponibiliza uma tag de repetio para que uma operao possa ser feita mediante
uma lista de itens. A tag <ui:repeat>, que se encontra na biblioteca de tags do facelets.
11 Para repetir um cdigo sobre uma lista de elementos, usa-se <ui:repeat>
Bean Aluno
public class Aluno {
private String nome;
// setters/getters
}
Managed Bean
@Named(value = alunosMB)
@RequestScoped
public class AlunosMB {
private List<Aluno> alunos;
@PostConstruct
public void init() {
alunos = new ArrayList<>();
Aluno a = new Aluno();
a.setNome(Joo);
alunos.add(a);
a.setNome(Maria);
alunos.add(a);
a = new Aluno();
a.setNome(Jos);
alunos.add(a);
}
// setters/getters
}
a = new Aluno();
75
76
5
Conhecer o tratamento de dados e eventos no JSF com recursos disponveis e atravs
de customizao.
conceitos
Pginas e templates
Um dos grandes benefcios em se utilizar o facelets, que o motor padro de tratamento
de telas em JSF, o uso de templates. Um template um modelo de tela que deve ser usado
por toda (ou grande parte) da aplicao. Em um template temos as pores fixas, que no
mudam conforme muda-se de tela. So, por exemplo, o cabealho da aplicao, que fixo,
seguido de partes variveis que mudam a cada tela da aplicao.
Entre os benefcios dessa abordagem esto o reuso de pores fixas das pginas da aplicao, a preveno da duplicao de pginas similares e a manuteno de um padro de
aparncia entre todas as telas do sistema.
Para o reuso de pginas existem duas alternativas: incluso de pginas e templates.
11 Facelets: engine padro de tratamento de telas;
Incluso de pginas
Em JSF podemos incluir arquivos XHTML dentro de outros de modo a evitar duplicao e
diminuir o esforo de manuteno quando for preciso modificar alguma coisa. Esse recurso
interessante, porque pginas grandes podem ser separadas ou trechos de pginas que so
objetivos
11 Para incluso de arquivos XHTML dentro de outros XHTML, usa-se a tag <ui:include>;
11 O arquivo a ser includo deve iniciar com <ui:composite> (sem o atributo template);
11 No arquivo que receber a incluso, usa-se <ui:include>.
No exemplo a seguir, o cabealho de uma pgina includo atravs desse recurso.
A pgina que possui a imagem de cabealho includa exatamente no ponto em que a tag
<ui:include> colocada.
index.xhtml
<html xmlns=http://www.w3.org/1999/xhtml
xmlns:h=http://java.sun.com/jsf/html
xmlns:ui=http://java.sun.com/jsf/facelets >
<h:head><title>JSF</title></h:head>
<h:body>
<ui:include src=cabecalho.xhtml />
<hr/>
Contedo da pgina
<hr/>
<div id=footer style=text-align: center>Rodap</div>
</h:body>
</html>
cabecalho.xhtml
<ui:composition
xmlns=http://www.w3.org/1999/xhtml
xmlns:h=http://java.sun.com/jsf/html
xmlns:ui=http://java.sun.com/jsf/facelets>
<div id=header>
</ui:composition>
Templates
Para definir um template em JSF, deve-se escrever um arquivo XHTML que contm a poro
fixa do template. Esse arquivo ser usado nas demais pginas da aplicao. Para indicar onde a
78
poro dinmica da aplicao inserida nesse template, usa-se a tag <ui:insert>. Cada tela da
aplicao dever indicar qual template ser usado e isso feito usando a tag <ui:composition>
e <ui:define>, que insere o contedo dinmico em determinado espao do template.
Templates so arquivos XHTML com tags especiais do facelets:
11 <ui:insert>: usada no arquivo de template, indica que ser feita a troca por um
arquivo especfico;
11 O atributo name usado para nomear os trechos dinmicos;
11 <ui:define>: define um contedo a ser inserido em um local definido por <ui:insert>;
11 <ui:composition>: define um grupo de elementos que ser inserido em um template.
O atritubo template deve ser usado. O contedo fora dessa tag ignorado.
</ui:define>
</ui:composition>
79
na tag <ui:define>
dentro do contedo
dinmico dever casar
com algum atributo
name da tag
<ui:insert> dentro do
template.
determinado template, deve-se ter ateno na colocao das tags <ui:define>, pois cada
uma delas representa uma poro dinmica indicada no template pela tag <ui:insert>.
Conversores
Os dados que trafegam de um formulrio HTML para uma aplicao web esto sempre em
formato de String e, portanto, podem demandar converso para serem usados. Mais do que isso,
pode ser que precisem ser tambm validados para garantir estejam semanticamente corretos.
Da mesma forma, os dados dentro da aplicao esto em seus formatos originais (exemplo:
java.util.Date) e precisam ser convertidos em String para serem exibidos em uma pgina.
Converso ou Validao:
11 BigDecimal e BigInteger;
11 Boolean e boolean;
11 Byte e byte;
11 Character e char;
11 Double e double;
11 Float e float;
11 Integer e int;
11 Long e long;
11 Short e short.
A seguir, temos um exemplo de converso automtica, onde o texto digitado no componente
automaticamente convertido para inteiro.
XHTML
<h:inputText value=#{pessoaMB.idade} />
Managed Bean
@Named
@RequestScoped
public class PessoaMB {
private int idade;
// setters/getters
}
80
Converso de nmeros
Descrio
maxFractionDigits
minFractionDigits
maxIntegerDigits
minIntegerDigits
pattern
type
currencySymbol
ExemploMB
@Named
@RequestScoped
public class ExemploMB {
private double decimal;
// setters/getters
}
Tabela 5.1
Atributos da tag
<f:convert
Number />.
Atributo
81
<f:convertNumber type=currency/>
</h:inputText><br/>
<h:commandButton value=Alterar />
</h:form>
ExemploMB
@Named
@RequestScoped
public class ExemploMB {
private double decimal;
// setters/getters
}
As figuras a seguir apresentam as diferenas entre os dois exemplos, quando entrado com o
valor 100,87878787.
Normal: 100.87878787
Convertido: 100,88
Normal: 100.87878787
Convertido: R$ 100,88
100,8788
R$ 100,88
Alterar
Alterar
Figura 5.1
Diferena entre os
dois exemplos.
No primeiro exemplo, o valor convertido com dois dgitos aps a vrgula no texto e com
quatro dgitos no componente de entrada de dados. No segundo exemplo, o valor foi
convertido para currency e, portanto, deve conter a sigla da moeda do pas corrente no
navegador (no caso, R$).
82
Atributo
Descrio
pattern
type
Para especificar se a data, a hora ou os dois sero apresentados (date (default), time, both)
dateStyle
timeStyle
Estilo de apresentao da hora (default, short, medium, long, full), somente se type for time ou both
Locale
Preferncias regionais (do local) a serem utilizadas nas converses. (exemplo: pt_BR)
Tabela 5.2
Atributos de
<f:convertDate
Time>.
</h:outputText>
<h:form>
<h:inputText value=#{exemploMB.data} >
<f:convertDateTime pattern=dd/MM/yyyy/>
</h:inputText> <br/>
<h:commandButton value=Alterar />
</h:form>
ExemploMB
import java.util.Date;
@Named
@RequestScoped
public class ExemploMB {
private Date data;
// setters/getters
}
A figura a seguir mostra a execuo do exemplo anterior, quando a data entrada 10/01/2015.
Normal: Fri Jan 09 22:00:00 BRST 2015
Padro dd.MM.yy: 10.01.2015
Estilo Long: 10 de Janeiro de 2015
10/01/2015
Alterar
Conversor personalizado
Se os conversores padro no forem suficientes, podemos criar seu prprio conversor. Isso
usado quando se quer disponibilizar converses para objetos que no so os padres que
o JSF j oferece. Devemos seguir os seguintes passos:
1. A classe cujos objetos sero armazenados deve implementar a interface Serializable e os
mtodos equals() e hashCode();
2. Criar uma classe que implementa a interface javax.faces.convert.Converter;
3. Nesta classe, adicionar a anotao @FacesConverter, indicando a classe associada
@FacesConverter(forClass=Telefone.class)
Figura 5.2
Exemplo com
data de entrada
10/01/2015.
83
Os cdigos a seguir mostram um exemplo de uso de um conversor customizado e um conversor customizado para a classe Estado.
<h:form>
<h:panelGrid columns=2>
<h:outputLabel value=Selecionado:
for=estadostr />
<h:outputText value=#{exemploMB.selecionado.nome}
id=selecionadostr />
<h:outputLabel value=Estados: for=estado />
<h:selectOneMenu id=estado
value=#{exemploMB.selecionado}
converter=estadoConverter>
<f:selectItems value=#{exemploMB.listaEstados}
var=estado
itemLabel=#{estado.nome}
itemValue=#{estado} />
</h:selectOneMenu>
<h:commandButton value=Enviar />
</h:panelGrid>
</h:form>
84
UIComponent component,
Object value) {
return ((Estado) value).getSigla();
}
}
Mesmo quando a lista era formada por objetos (exemplo: estado), somente a sigla era armazenada. Mas essa no a situao ideal para um sistema orientado a objetos. O que se quer
que um objeto do tipo Estado (ou aquele que seja o assunto da escolha) seja armazenado,
em vez de uma string.
Esse o uso mais comum para conversores customizados, que ser mostrado nos exemplos a seguir:
index.xhtml: pgina do usurio.
<h:form>
<h:panelGrid columns=2>
<h:outputLabel value=Selecionado:
for=selecionadostr />
<h:outputText value=#{exemploMB.selecionado.nome}
id=selecionadostr />
<h:outputLabel value=Estados: for=estado />
<h:selectOneMenu id=estado
value=#{exemploMB.selecionado}
converter=estadoConverter>
<f:selectItems value=#{exemploMB.listaEstados}
var=estado
itemLabel=#{estado.nome}
itemValue=#{estado} />
</h:selectOneMenu>
<h:commandButton value=Enviar />
</h:panelGrid>
</h:form>
85
ArrayList<Estado>();
Estado e = new Estado();
e.setSigla(PR);
e.setNome(Paran);
listaEstados.add(e);
e = new Estado();
e.setSigla(SC);
e.setNome(Santa Catarina);
listaEstados.add(e);
return listaEstados;
}
86
As mensagens possuem uma verso detalhada e uma resumida, que podem ser mostradas
atravs dos atributos showSummary e showDetails, por exemplo:
<h:message for=idade showSummary=true
showDetail=false/>
Para apresentar mensagem de todos os campos, usa-se <h:messages />, cujo valor default
Para definir uma mensagem de erro de converso, usa-se o atributo converterMessage nos
campos, como por exemplo:
<h:inputText value=#{alunoMB.idade} id=idade
converterMessage=Digite um nmero />
<h:message for=idade />
87
Arquivo de mensagens:
11 Arquivo.properties (mensagens.properties);
11 Coloca-se em um pacote dos fontes;
11 Conjunto de CHAVE=VALOR.
22 CHAVE: usado para recuperar a mensagem;
22 VALOR: mensagem a ser apresentada.
11 Exemplo:
javax.faces.converter.NumberConverter.NUMBER=O valor {0} no adequado.
javax.faces.converter.NumberConverter.NUMBER_detail={0} no nmero ou
inadequado.
Para registrar o arquivo de mensagens, adiciona-se uma referncia a seu nome no arquivo
faces-config.xml, omitindo-se o sufixo.properties. Por exemplo:
<application>
<message-bundle>pacote.mensagens</message-bundle>
</application>
Validadores
Aps a converso, podemos verificar se os valores passados para a aplicao seguem determinadas regras, por exemplo, se a idade entrada pelo usurio foi um nmero positivo. Essas
regras no so verificadas na fase de converso.
11 Regra no verificada na fase de converso;
11 Atributo required dos campos indica se o mesmo obrigatrio;
11 Exemplo:
<h:inputText value=#{alunoMB.idade}
id=idade required=true />
<h:message for=idade />
<f:validateLongRange minimum=18
maximum=150 />
</h:inputText>
<h:inputText value=#{produtoMB.preco}
id=preco required=true >
<f:validateDoubleRange minimum=10.5
maximum=450.87 />
</h:inputText>
88
<h:inputText value=#{alunoMB.idade}
<f:validateLength minimum=4
maximum=12 />
</h:inputText>
<h:inputText value=#{alunoMB.codigo}
id=codigo required=true >
</h:inputText>
ExemploMB
@Named
@RequestScoped
public class ExemploMB {
// setters/getters
}
As mensagens de erro de validao esto contidas nas bibliotecas do JSF, mas podem ser
customizadas atravs da criao de um arquivo.properties. Esse arquivo deve conter o
seguinte formato:
javax.faces.converter.DateTimeConverter.DATE={2}: {0} no parece ser uma data.
javax.faces.converter.DateTimeConverter.DATE_detail=Formato de data invlido.
javax.faces.validator.LengthValidator.MINIMUM={0} no tem o tamanho mnimo
requerido.
89
Onde do lado esquerdo esto as validaes feitas e do lado direito os textos a serem apresentados. Esse arquivo tambm deve ser registrado no faces-config.xml, da seguinte forma:
<application>
<message-bundle>
com.app.mensagens
</message-bundle>
</application>
Bean Validation
No JSF 2 foram introduzidas regras de validao nos beans, que so usadas para restringir
os valores setados em atributos. Essas regras de validao no so feitas nas telas,
mas as complementam.
A preferncia de uso entre validaes nos beans e no XHTML depende da aplicao. Se a
validao deve ser feita a cada set() executado no bean, ou se esse bean ser usado em
vrios subsistemas e a validao requerida, ento Bean Validation deve ser usado. Mas se
a validao depende mais do formulrio, isto , dependente da viso, ento a validao no
XHTML deve ser usada.
Para usar Bean Validation, adiciona-se anotaes antes dos atributos que recebem a validao.
No exemplo a seguir, o atributo nome no pode ser nulo:
public class Aluno {
@NotNull
private String nome;
}
Por exemplo:
<h:inputText value=#{alunoMB.nome} >
<f:validateBean disabled=true />
</h:inputText>
90
@Max(value=200)
11 @Min: nmero inteiro mnimo:
@Min(value=10)
11 @NotNull: obriga o valor a no ser nulo;
11 @Null: obriga o valor a ser nulo;
11 @Size: define tamanho mnimo e mximo para Collections, Arrays ou Strings:
@Size(min=2, max=10)
11 @Pattern: se o atributo segue uma expresso regular:
@Pattern(regexp= \\(\\d{3}\\)\\d{4}-\\d{4})
Podemos customizar as mensagens de erro diretamente nas anotaes, com o atributo
message. Por exemplo:
public class Aluno {
Validador Personalizado
Caso as validaes padro no sejam suficientes para a aplicao, podemos criar um validador
customizado. Por exemplo, validao de data inicial e data final e-mail etc. A criao
anloga criao de um Conversor Customizado, e seguimos os seguintes passos:
Passos para criar Validador Customizado:
Se a validao resultar em erro, cria-se uma mensagem e lana-se uma exceo, como no
seguinte exemplo:
FacesMessage mensagem = new FacesMessage(
Email Invlido);
mensagem.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ValidatorException(mensagem);
</h:inputText>
91
@FacesValidator(emailValidator)
public class EmailValidator implements Validator {
public void validate(FacesContext context,
UIComponent component, Object value)
throws ValidatorException {
String email = (String)value;
Pattern p = Pattern.compile(
^[\\w-]+(\\.[\\w-]+)*@([\\w-]+\\.)+[a-zA-Z]{2,7}$);
Matcher m = p.matcher(email);
if (!m.find()) {
FacesMessage fm = new FacesMessage(E-mail invlido.);
throw new ValidatorException(fm);
}
}
}
Eventos
Aplicaes JSF so baseadas em eventos:
11 Eventos gerados pelos usurios;
JAVA Frameworks e Aplicaes Corporativas
92
FacesEvent
Os eventos do tipo FacesEvent so:
E no Managed Bean:
@ManagedBean
public class AlunoMB {
public String salvar() {
return tela1;
}
}
Atributo actionListener:
11 Associado a um mtodo pblico de um MB que retorna void;
11 O mtodo recebe como parmetro um ActionEvent.
UICommand c = (UICommand)e.getComponent();
E no Managed Bean:
@Named
@RequestScoped
public class AlunoMB {
public void mudar(ActionEvent e) {
UICommand c = (UICommand)e.getComponent();
c.setValue(Alterado);
}
93
Os atributos action e actionListener permitem que no mximo dois mtodos sejam invocados. Se for necessrio mais, deve-se ter uma classe que implementa a interface ActionListener. Essa classe deve implementar o mtodo processAction() e, para invoc-lo, usa-se
<f:actionListener> no commandButton ou commandLink. Por exemplo, no XHTML:
<h:commandLink value=Enviar action=...
actionListener=...>
<f:actionListener type=com.curso.Alterar />
</h:commandLink>
E no listener fica:
public class Alterar implements ActionListener {
public void processAction(ActionEvent e) {
UICommand c = (UICommand)e.getComponent();
c.getAttributes().put(style, color: red);
}
}
Faces Response
94
Restore
View
Apply
Requests
Render
Response
Response
complete
Render
Response
Process
Events
Process
Events
Response
complete
Process
Validation
Process
Events
Response
complete
Invoke
Application
Conversion Error/
Render Response
Process
Events
Update
Model
Values
Validation/
Conversion Errors/
Render Response
ValueChangeEvent
Esse evento ocorre quando uma caixa de texto ou seleo so alterados. Podemos
associar um mtodo de um MB, que ser invocado quando o evento ocorrer. Os mtodos
devem ser pblicos e receber um parmetro do tipo ValueChangeEvent. Usa-se o atributo valueChangeListener dos componentes ou a tag <f:valueChangeListener>.
Figura 5.3
FacesEvent:
action Event.
E no Managed Bean:
@Named
@RequestScoped
public class ProdutoMB {
public void mudarPreco(ValueChangeEvent e) {
System.out.println(Antigo: +
e.getOldValue());
System.out.println(Novo: +
e.getNewValue());
}
Usando a tag <f:valueChangeListener>, podemos apontar para uma classe que implementa
interface ValueChangeListener, que implementa o mtodo processValueChange.
Por exemplo, no XHTML:
<h:outputLabel value=Preo: for=preco />
<h:inputText id=preco >
<f:valueChangeListener type=
com.curso.AlteracaoPreco />
</h:inputText>
E o Listener:
public class AlteracaoPreco
implements ValueChangeListener {
public void processValueChange(
ValueChangeEvent e) {
System.out.println(Antigo: +
e.getOldValue());
System.out.println(Novo: +
}
}
e.getNewValue());
95
Response
complete
Faces Request
Faces Response
Restore
View
Apply
Requests
Render
Response
Response
complete
Render
Response
Process
Events
Process
Events
Response
complete
Process
Validation
Process
Events
Response
complete
Invoke
Application
Conversion Error/
Render Response
Update
Model
Values
Process
Events
Validation/
Conversion Errors/
Render Response
Atributo immediate
Figura 5.4
facesEvent:
valueChangeEvent.
Praticamente todos os componentes visuais possuem esse atributo. Por padro (sem nada
ou immediate=false):
11 A validao dos dados de um componente de entrada (exemplo: <h:inputText>) ocorre na
fase Process Validations;
11 Eventos de mudana de valor (ValueChangeEvent) tambm acontecem na fase Process
Validation, conforme figura a seguir;
11 Eventos de ao (ActionEvent: <h:commandButton> e <h:commandLink>) ocorrem no final da
fase Invoke Application.
Response
complete
Faces Request
96
Faces Response
Restore
View
Apply
Requests
Render
Response
Response
complete
Render
Response
Process
Events
Process
Events
Figura 5.5
Com
immediate=true
eventos acontecem
na na fase Apply
Request
Response
complete
Process
Validation
Process
Events
Response
complete
Invoke
Application
Conversion Error/
Render Response
Process
Events
Update
Model
Values
Validation/
Conversion Errors/
Render Response
11 Fazer um commandLink ou commandButton navegar para outra pgina sem processar qualquer dado que esteja nos campos de entrada. Exemplo: boto de Cancelamento, wizard;
11 Fazer um commandLink ou commandButton disparar um cdigo da aplicao
(exemplo: preencher algum dado da tela), sendo que para isso ainda no se faz necessrio (ou no se pode) validar os dados de entrada. Exemplo: combo categoria que,
quando selecionado, carrega as subcategorias;
11 Fazer um ou mais campos de entrada terem sua validao priorizada, sendo feita
97
98
6
Conhecer conceitos de internacionalizao; Aprender sobre o uso de Javascript com
XML de forma assncrona; Entender biblioteca Primefaces.
conceitos
Internacionalizao
Internacionalizao a capacidade de uma aplicao se adaptar ao idioma e padres de
exibio de data, hora etc. de diferentes localidades. Em geral, isso afeta a forma de exibir
textos (principalmente dos componentes de tela) e outros smbolos de acordo com um
padro pr-definido ou escolhido pelo usurio.
Mecanismos do JSF para internacionalizao:
Arquivos de mensagens
Os arquivos de mensagens so arquivos .properties que residem em algum pacote do
cdigo fonte da aplicao.
11 Pacote: com.cursojava.messages
11 Arquivos:
22 messages_pt_BR.properties: Portugus (pt) do Brasil (BR);
22 messages_en_US.properties: Ingls (en) dos Estados Unidos (US).
Esses arquivos possuem um conjunto de itens do tipo chave/valor, onde chave o nome da
string a ser usada nos arquivos XHTML e o valor a string a ser mostrada naquele idioma.
objetivos
Arquivo messages_pt_BR.properties
Arquivo messages_en_US.properties
portuguese=Portugus
portuguese=Portuguese
english=Ingls
english=English
save=Salvar
save=Save
delete=Excluir
Delete=Delete
name=Nome
name=Name
title=Formulrio
title=Form
Tabela 6.1
Arquivos de
mensagens em
portugus e ingls.
100
Figura 6.1
Configuraes do
arquivo facesconfig.xml para
internacionalizao.
@Named
@SessionScoped
public class LocaleMB {
private Locale currentLocale = new Locale(pt, BR);
public void englishLocale() {
UIViewRoot viewRoot = FacesContext.getCurrentInstance().
getViewRoot();
currentLocale = Locale.US;
viewRoot.setLocale(currentLocale);
}
public void portugueseLocale() {
UIViewRoot viewRoot = FacesContext.getCurrentInstance().
getViewRoot();
currentLocale = new Locale(pt, BR);
viewRoot.setLocale(currentLocale);
}
public Locale getCurrentLocale() {
return currentLocale;
}
}
<f:view locale=#{localeMB.currentLocale}>
O cdigo apresentado na figura 6.3, a seguir, mostra um XHTML preparado para internacionalizao contendo dois botes que, ao serem pressionados, alteram o idioma em que a
aplicao deve ser mostrada.
Figura 6.2
Configuraes do
arquivo facesconfig.xml para
internacionalizao.
101
<html xmlns=http://www.w3.org/1999/xhtml
xmlns:h=http://java.sun.com/jsf/html
xmlns:f=http://java.sun.com/jsf/core>
<f:view locale=#{localeMB.currentLocale}>
<h:head>
<title>#{msgs.title}</title>
</h:head>
<h:body>
<h:form>
<h:outputText value=#{msgs.name} />
<h:inputText id=nome
/> <br/>
<h:commandLink value=English
action=#{localeMB.englishLocale()}
/><br/>
<h:commandLink value=Portugus
action=#{localeMB.portugueseLocale()}
/>
Figura 6.3
Configuraes
do arquivo
faces-config.xml
para
internacionalizao.
</h:form>
</h:body>
</f:view>
</html>
AJAX
AJAX significa Asynchronous Javascript And XML. Traduz-se em uma maneira de fazer
requisies na internet atravs de Javascript, de forma assncrona, sem que a pgina toda
precise ser recarregada. As grandes vantagens no seu uso esto na atualizao de trechos
da pgina sem recarregar toda a tela e na realizao de requisies sem interromper a
navegao dos usurios.
Asynchronous Javascript And XML. Uso:
102
Eventos
Uma requisio AJAX deve ser invocada atravs de um evento, geralmente relacionado aos
eventos visuais, de tela, invocados pelo usurio.
Esse cdigo indica que a requisio AJAX ocorrer sempre que o contedo do inputText for
modificado (evento default onchange).
No exemplo a seguir, explicita-se o evento que dispara a requisio usando o atributo event:
<h:inputText >
<f:ajax event=keyup />
</h:inputText>
Esse cdigo deixa claro que a requisio s ser acionada quando o evento onkeyup
for disparado.
103
Componentes
atributo execute. Esse atributo pode conter uma lista com todos os IDs dos campos que sero
avaliados (separados por espaos). O default ser enviado somente o prprio elemento.
formId:textId
Para determinar quais componentes devem ser enviados e avaliados no servidor, usamos o
Atributo execute:
O execute indica quais valores (componentes) sero enviados para processamento via
a serem processados.
104
Atualizao
Quando se faz uma requisio AJAX, parte da (ou toda) a tela deve ser atualizada. O atributo
render indica se a recarga de parte ou de toda a tela.
No exemplo a seguir, indicado que o texto com id numero1 e o texto com id numero2
devem ser recarregados aps a chamada AJAX.
<h:commandButton value=Processar>
<f:ajax event=click render=numero1 numero2/>
</h:commandButton>
<h:outputText id=numero1
value=#{alunoMB.matricula} />
<h:outputText id=numero2
value=#{alunoMB.matricula} />
Mtodo Invocado
Atravs do atributo listener, se define qual mtodo responde a uma requisio AJAX. Esse
mtodo ser executado na fase Invoke Application e deve ser public void.
No exemplo a seguir, efetuada a chamada do mtodo salvar() de aluno MB, aps o evento
onclick do boto, quando so enviados todos os dados do formulrio para atualizao.
<h:commandButton value=Salvar>
<f:ajax event=click execute=formulario
render=formulario
listener=#{alunoMB.salvar} />
Resumo
Atributos de <f:ajax>:
11 Atributo event : evento para o qual a requisio AJAX deve ser disparada;
11 Atributo execute: lista com os IDs dos componentes que sero avaliados no servidor;
11 Atributo render: lista com os IDs dos componentes que sero atualizados aps a
requisio ser executada;
11 Atributo listener: mtodo do MB que ser executado quando a requisio AJAX ocorrer.
</h:commandButton>
105
Palavras-chave associadas a grupos de componentes que podem ser usadas nos atri-
Neste exemplo, ao ser pressionado o boto Enviar, uma requisio Ajax invocada para o
sistema, sendo enviados todos os dados do formulrio para serem processados.
Primefaces
O Primefaces uma Biblioteca de Componentes Ricos completamente integrada ao ciclo de
vida do JSF. O prprio JSF j possui todos os componentes bsicos do HTML, mas faltam configuraes, flexibilidade e caractersticas que tornariam o desenvolvimento de uma aplicao
mais rpido. Primefaces no a nica biblioteca para JSF, mas uma das mais utilizadas.
O JSF possui todos os componentes bsicos do HTML. Bibliotecas que contm compo-
106
Um comparativo entre
essas bibliotecas pode
ser encontrado no AVA
(http://www.mastertheboss.com/
jboss-web/richfaces/
primefaces-vs-richfaces-vs-icefaces).
preciso tomar algumas providncias para utilizar os componentes disponveis no Primefaces. Primeiro deve-se adicionar suas bibliotecas ao projeto (no Netbeans, elas j esto
integradas ao ambiente e podem ser facilmente adicionadas). preciso tambm ajustar o
namespace. O XHTML com suporte a Primefaces fica como no exemplo a seguir:
<html xmlns=http://www.w3.org/1999/xhtml
xmlns:h=http://java.sun.com/jsf/html
xmlns:f=http://java.sun.com/jsf/core
xmlns:ui=http://java.sun.com/jsf/facelets
xmlns:p=http://primefaces.org/ui>
O componente de Layout usado para criar leiautes de pginas. formado por componentes do tipo <p:layout>, que define um layout na pgina e que pode usar a pgina toda
(parmetro fullPage) ou somente parte dela. Tambm formado por componentes do tipo
<p:layoutUnit>, que define uma poro especfica do layout.
Um layout composto por cinco regies (unidades Layout Units): north, west, east, South e
center. A figura 6.4 mostra a posio geogrfica das regies de um Layout, enquanto que as
tabelas 6.2 e 6.3 apresentam, respectivamente, alguns atributos de <p:layout> e <p:layoutUnit>.
Figura 6.4
Regies de um
Layout.
center
south
east
west
north
Layout <p:layout>
107
Atributo
Descrio
rendered
fullPage
style, styleClass
onResize
onClose
onToggle
Atributo
Descrio
header
rendered
position
resizable
closable
collapsible
style, styleClass
Apresentamos o Exemplo de Layout 1, cujo cdigo fonte pode ser visto a seguir, para em
seguida mostrar como este renderizado, por meio da figura 6.5.
<h:body>
<p:layout fullPage=true>
108
</p:layoutUnit>
</p:layoutUnit>
</p:layoutUnit>
</p:layoutUnit>
<p:layoutUnit position=center>
</p:layoutUnit>
</p:layout>
</h:body>
Tabela 6.2
Atributos de
<p:layout>.
Tabela 6.3
Atributos de
<p:layoutUnit>.
Top content
Center content
Left content
Figura 6.5
Renderizao do
Exemplo de
Layout 1.
Right content
Bottom content
Esquerdo
Centro
Figura 6.6
Renderizao do
Exemplo de
Layout 2 (Parcial).
Topo
109
<h:body>
<p:layout fullPage=true>
<p:layoutUnit position=north>
Topo
</p:layoutUnit>
<p:layoutUnit position=west>
Esquerdo
</p:layoutUnit>
<p:layoutUnit position=center>
<p:layout fullPage=false>
<p:layoutUnit position=north>
Topo 2
</p:layoutUnit>
<p:layoutUnit position=west>
Esquerdo 2
</p:layoutUnit>
<p:layoutUnit position=east>
Direito 2
</p:layoutUnit>
<p:layoutUnit position=center>
Centro 2
</p:layoutUnit>
<p:layoutUnit position=south>
Base 2
</p:layoutUnit>
</p:layout>
</p:layoutUnit>
</p:layout>
</h:body>
Topo
Esquerdo
Topo 2
Esquerdo 2
110
Base 2
Centro 2
Direito 2
Figura 6.7
Renderizao do
Exemplo de Layout 3
(Aninhado).
DataTable <p:dataTable>
O DataTable equivalente ao DataTable puro do JSF, mas aumenta suas funcionalidades.
Ele apresenta as seguintes caractersticas:
11 Parecido com o dataTable do JSF;
11 Faz paginao entre elementos;
11 Faz ordenao de elementos (colunas);
11 Permite o uso de Filtros;
11 Deve ser colocado dentro de um <h:form>;
11 Faz carga preguiosa de elementos (Lazy Load).
22 Para usar paginao, o MB deve ter escopo maior que da requisio
A tabela 6.4 mostra alguns dos atributos de <p:dataTable>, enquanto que a figura 6.8 mostra
como fica, visualmente, um DataTable.
Atributo
Descrio
rendered
value
var
Nome da varivel que receber os dados na iterao usada para preencher a tabela
rows
paginator
style, styleClass
Figura 6.8
Exemplo de
DataTable.
Tabela 6.4
Atributos de
<p:dataTable>.
111
<h:form>
<p:dataTable id=dataTable var=p value=#{exemploMB.pessoas}
paginator=true rows=10>
<f:facet name=header>
Exemplo
</f:facet>
<p:column>
<f:facet name=header>
<h:outputText value=Nome />
</f:facet>
<h:outputText value=#{p.nome} />
</p:column>
<p:column>
<f:facet name=header>
<h:outputText value=E-mail/>
</f:facet>
<h:outputText value=#{p.email} />
</p:column>
</p:dataTable>
</h:form>
Calendar <p:calendar>
O componte <p:calendar> tem por objetivo oferecer um mtodo para a entrada de datas de
forma mais prtica do que digit-las em algum formato especfico. A tabela 6.5 mostra
alguns dos seus atributos, enquanto a figura 6.9 demonstra a aparncia desse componente.
112
Tabela 6.5
Atributos de
<p:calendar>.
Atributo
Descrio
value
A propriedade em que a data escolhida ser setada tambm indica a data inicial em que o calendrio estar setado
rendered
mindate
maxdate
pattern
showOn
Figura 6.9
Exemplo de
Calendar.
Para usar o calendrio em portugus do Brasil, deve-se criar uma localizao no Primefaces
(usando JavaScript) e adicionar o atributo locale ao <p:calendar>. O trecho a seguir o
cdigo que deve ser inserido para que os textos do calendrio fiquem em portugus.
PrimeFaces.locales[pt_BR] = {
closeText: Fechar,
prevText: Anterior,
nextText: Prximo,
currentText: Comeo,
monthNames: [Janeiro,Fevereiro,Maro,Abril,Maio,Junho,
Julho,Agosto,Setembro,Outubro,Novembro,Dezembro],
monthNamesShort: [Jan,Fev,Mar,Abr,Mai,Jun, Jul,Ago,
Set,Out,Nov,Dez],
dayNames: [Domingo,Segunda,Tera,Quarta,Quinta,Sexta,
Sbado],
dayNamesShort: [Dom,Seg,Ter,Qua,Qui,Sex,Sb],
dayNamesMin: [D,S,T,Q,Q,S,S],
firstDay: 1,
isRTL: false,
showMonthAfterYear: false,
yearSuffix: ,
timeOnlyTitle: S Horas,
timeText: Tempo,
hourText: Hora,
minuteText: Minuto,
secondText: Segundo,
currentText: Data Atual,
ampm: false,
month: Ms,
week: Semana,
day: Dia,
weekHeader: Semana,
113
No custa lembrar: o texto pt_BR usado no componente o mesmo que foi setado
no JavaScript, na linha PrimeFaces.locales[pt_BR].
InputMask <p:inputMask>
O componente <p:inputMask> usado para a entrada de dados com mscara, ou seja, que
possuem uma combinao especfica de dgitos, smbolos etc. Exemplos de dados com
Tabela 6.6
Atributos de
<p:inputMask>.
mscara so um nmero de telefone ou CEP. A tabela 6.6 a seguir apresenta alguns dos
atributos desse componente.
Atributo
Descrio
rendered
mask
A mscara a ser usada no componente, por exemplo: 9999-9999, indicando que deve ser entrado
com quatro nmeros, depois tem um hfen e depois mais quatro nmeros
value
114
Exemplos:
11 Telefone: (##) ####-####
11 Placa de carro: ???-####
O cdigo a seguir apresenta um formulrio contendo campos com vrios tipos de mscaras.
<h:form>
<p:panel header=Masks>
<h:panelGrid columns=2 cellpadding=5>
<h:outputText value=Date: />
<p:inputMask value=#{maskController.date}
mask=99/99/9999/>
O componente <p:editor> usado para que o usurio possa entrar textos com formatao
rica: negrito, fonte, cores etc.
Atributo
Descrio
rendered
value
Texto editado, pode estar ligado a um atributo String de um MB, em format HTML
controls
Lista com os controles que aparecem no componente, por exemplo: bold, italic, underline, color
style, styleClass
Tabela 6.7
Atributos de
<p:editor>.
Editor <p:editor>
115
<h:form>
<p:editor id=editor
value=#{editorBean.value}
width=600/>
</h:form>
A figura 6.10 mostra como o Editor exibido na tela, com uma srie de cones na parte superior representando comandos de formatao de texto.
Figura 6.10
Exemplo de Editor.
PickList <p:pickList>
O PickList um componente de escolhas, onde so mostradas ao usurio duas listas.
A primeira contm os elementos disponveis. Na segunda esto os elementos que o usurio
j escolheu. Tambm so disponibilizados botes para transferncia dos elementos entre as
listas e funcionalidades de drag-n-drop.
Um exemplo de PickList visto a seguir.
<p:pickList id=pickList
value=#{pickListBean.cities}
var=city
itemLabel=#{city}
itemValue=#{city} />
A tabela 6.8 apresenta alguns atributos do componente PickList, enquanto que a Figura 6.11
116
Tabela 6.8
Atributos de
<p:pickList>.
Atributo
Descrio
rendered
value
Valor do componente, com as opes a serem mostradas e a lista de elementos escolhidos. Usa a
interface DualListModel.
itemLabel
itemValue
var
Nome da varivel de iterao entre todos os elementos a serem mostrados nas listas
A interface DualListModel contm os dados das duas listas de um PickList. Podemos cri-las
dentro do mtodo anotado com @PostConstruct.
cities = new DualListModel<String>(source, target);
Figura 6.11
Renderizao de
um <p:pickList>.
Istanbul
Ankara
Izmir
Antalya
Bursa
do componente.
117
Atributo
Descrio
rendered
center
model
zoom
streetView
type
style, styleClass
Tabela 6.9
Atributos do
<p:gmap>.
Figura 6.12
Exemplo de
<p:gmap>.
Para utilizar o Google Maps deve-se adicionar no <h:head> da pgina o seguinte script:
<script type=text/javascript src=http://maps.google.com/maps/api/
js?sensor=false></script>
O MB que manipula o mapa pode ser implementado como o cdigo abaixo. O atributo que
recebe a localizao deve ser do tipo MapModel.
@Named
118
@RequestScoped
public class ExemploMB {
@PostConstruct
}
}
// setters/getters
Tabela 6.10
Atributos de
<p:accordion
de Panel>.
Tabela 6.11
Atributos de
<p:tab>.
Atributo
Descrio
rendered
onTabChange
style, styleClass
Atributo
Descrio
rendered
title
Ttulo da aba
tooltip
titleStyle, titleStyleClass
disable
closable
Teste3
</p:tab>
</p:accordionPanel>
Menus <p:menu>
O componente <p:menu> usado para criar menus de navegao. Os itens de menu so
Figura 6.13
Exemplo de
Accordion Panel.
Atributo
Descrio
rendered
style, styleClass
Tabela 6.12
Atributos de
<p:menu>.
Atributo
Descrio
rendered
value
O texto do item
action, actionListener
disabeld
url
URL para onde a aplicao ser redirecionada quando o item for pressionado
icon
style, styleClass
O cdigo a seguir mostra a criao de um menu com quatro itens, enquanto a figura 6.14
mostra como exibido.
Tabela 6.13
Atributos de
<p:menuItem>.
<p:menu>
</p:menu>
Google
Hotmail
Figura 6.14
Exemplo de
apresentao
de menu e item
de menu.
Youtube
Facebook
J a figura 6.15 mostra como este mesmo menu apresentado dentro de um componente
de Layout.
Top content
120
Center content
Right content
Hotmail
Youtube
Facebook
Bottom content
Figura 6.15
menu dentro
de um layout.
Cabe destacar que <p:menuItem> pode ser utilizado em diversos outros componentes
de menu, tais como MenuBar e MenuButton, que sero vistos mais frente. Chamamos
ateno tambm para o atributo icon, atravs do qual podemos adicionar uma imagem a um
item de menu.
Exemplos de imagens de itens de menu do Primefaces:
11 ui-icon-disk
ui-icon-trash
11 ui-icon-print
11 ui-icon-search
Exemplo de uso:
<p:menuitem value=Google
url=http://www.google.com
icon=ui-icon-search />
Hotmail
Yahoo Mail
library=css />
</h:head>
121
SubMenus <p:submenu>
Para acrescentar agrupamentos ou submenus, usa-se a tag <p:submenu>. A tabela 6.14 apresenta alguns atributos de SubMenu.
Atributo
Descrio
rendered
label
O ttulo do submenu
icon
style, styleClass
Tabela 6.14
Atributos de
<p:submenu>.
O cdigo a seguir mostra um exemplo de Menu com Itens de Menu e Submenus. A figura
6.17 mostra como este cdigo renderizado.
<p:menu>
<p:submenu label=Mail>
<p:menuitem value=Gmail
url=http://www.google.com />
<p:menuitem value=Hotmail
url=http://www.hotmail.com />
<p:menuitem value=Yahoo Mail
url=http://mail.yahoo.com />
</p:submenu>
<p:submenu label=Videos>
<p:menuitem value=Youtube
url=http://www.youtube.com />
<p:menuitem value=Break
url=http://www.break.com />
<p:menuitem value=Metacafe
url=http://www.metacafe.com />
</p:submenu>
<p:submenu label=Social Networks>
<p:menuitem value=Facebook
url=http://www.facebook.com />
<p:menuitem value=Linkedin
JAVA Frameworks e Aplicaes Corporativas
url=http://www.linkedin.com />
</p:submenu>
</p:menu>
Mail
Gmail
Hotmail
Yahoo Mail
Vdeos
Youtube
Break
Metacafe
Social Networks
Facebook
Linkedin
122
Figura 6.17
Exemplo de Menu
com SubMenu.
Descrio
rendered
autoDisplay
style, styleClass
Tabela 6.15
Atributos de
MenuBar.
A cdigo a seguir exemplifica a construo de uma barra de menu, com o resultado final
sendo apresentado na figura 6.18.
<p:menubar>
<p:submenu label=Mail>
<p:menuitem value=Gmail
url=http://www.google.com />
<p:menuitem value=Hotmail
url=http://www.hotmail.com />
<p:menuitem value=Yahoo Mail
url=http://mail.yahoo.com />
</p:submenu>
<p:submenu label=Videos>
<p:menuitem value=Youtube
url=http://www.youtube.com />
<p:menuitem value=Vimeo
url=http://www.vimeo.com />
</p:submenu>
</p:menubar>
Vdeos
Gmail
Hotmail
Yahoo Mail
Tabela 6.16
Atributos de
Boto de Menu.
Atributo
Descrio
rendered
value
O texto do boto
disabled
style, styleClass
Figura 6.18
Exemplo de
MenuBar.
123
O codigo a seguir traz como exemplo a construo de um Boto de Menu com trs itens,
sendo que a figura 6.19 exibe o resultado da renderizao desse cdigo.
<p:menuButton value=Options>
<p:menuitem value=Save url=/home.jsf />
<p:menuitem value=Update url=/home.jsf />
<p:menuitem value=Go Home url=/home.jsf />
</p:menuButton>
Options
Save
Update
Figura 6.19
Exemplo de
Boto de Menu.
Go Home
Growl <p:growl>
O componente <p:growl> usado para apresentar mensagens em formato de notificaes.
As mensagens mostradas so as produzidas por FacesMessage e, portanto, funcionam como
o <h:messages>.
Podemos tambm direcionar as mensagens como neste exemplo:
<p:messages for=mensagens1 />
<p:growl for=mensagens2 />
124
Teste de Mensagem
Figura 6.20
Exemplo de Growl.
7
Conhecer o Hibernate como ferramenta de mapeamento Objeto/Relacional
em Java com JSF.
conceitos
Introduo
Hibernate uma ferramenta de Mapeamento Objeto/Relacional em Java, isto , transforma
dados das tabelas em um grafo de objetos.
11 Ferramenta de Mapeamento Objeto/Relacional em Java;
Captulo 7 - Hibernate
objetivos
Hibernate
125
Veiculo
Veiculo
tb_veiculo
Modelo
Cor
Ano
Gol
Preto
2002
Uno
Branco
2005
Plio
Vermelho
2006
Figura 7.1
Exemplo de
Correspondncia
Objeto-Relacional.
11 Banco de Dados.
22 Tabelas criadas.
11 Arquivo de configurao: hibernate.cfg.xml.
22 Contm referncia para todas as classes persistentes.
11 Hibernate Session Factory.
22 Uma classe utilitria que retorna uma sesso para usar o hibernate.
11 Classes Persistentes.
22 Classes que sero mapeadas para tabelas.
Os passos para criao de um projeto Hibernate no Netbeans esto a seguir, adicionando
2. Criar HibernateUtil.java;
3. Criar Classe Persistente;
4. Criar Arquivo de Configurao;
5. Classe de Teste (Programa Principal).
Exerccio de Fixao e
Acompanhar o passo a passo apresentado em sala de aula para criar um primeiro projeto
utilizando o Hibernate no Netbeans. O cdigo a seguir ser utilizado no exerccio e traz um
exemplo de classe persistente e uma classe principal, sem usar ainda o JSF.
Os cdigos a seguir apresentam um exemplo de classe persistente e um exemplo de classe
principal, sem JSF.
126
package model;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
@Entity
@Table(name=tb_teste)
@SequenceGenerator(name=sequencia, sequenceName=seq_id)
public class Pessoa {
private Long id;
private String nome;
public Pessoa() {
}
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator=sequencia)
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getNome() {
return this.nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
import org.hibernate.Session;
import model.Pessoa;
import util.HibernateUtil;
public class Teste {
public static void main(String[] args) {
Pessoa p = new Pessoa();
p.setNome(Joo);
Session session = HibernateUtil.
getSessionFactory().
session.beginTransaction();
session.save(p);
session.getTransaction().commit();
System.out.println(p.getNome() +
Inserido com sucesso.);
}
}
Captulo 7 - Hibernate
openSession();
127
Classe persistente
Uma classe persistente deve ser anotada para que seja devidamente utilizada pelo Hibernate.
public Aluno() {
}
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,
generator=sequencia)
return id;
this.id = id;
return this.nome;
this.nome = nome;
Essa classe pode estar relacionada seguinte tabela, definida pelo seu DDL:
CREATE TABLE tb_aluno (
id
nome
character varying(30),
128
Captulo 7 - Hibernate
129
Nesse MB, o mtodo salvar() usa a API do Hibernate para salvar a classe persistente aluno
que j est preenchida no MB.
.openSession();
session.beginTransaction();
session.save(this.aluno);
session.getTransaction().commit();
session.beginTransaction();
// lista todos os alunos
Query query = session.createQuery(from Aluno);
this.listaAlunos = query.list();
130
session.getTransaction().commit();
session.close();
return listar;
}
O mtodo listar() busca todos os alunos da base e preenche a lista Alunos para ser mostrada
no XHTML e redireciona para listar.xhtml.
.openSession();
session.beginTransaction();
// lista todos os alunos
Query query = session.createQuery(from Aluno);
this.listaAlunos = query.list();
session.getTransaction().commit();
session.close();
return listar;
}
// setters/getters
public Aluno getAluno() {
return aluno;
}
public void setAluno(Aluno aluno) {
this.aluno = aluno;
}
public List<Aluno> getListaAlunos() {
return listaAlunos;
}
public void setAluno(List<Aluno> listaAlunos) {
this.listaAlunos = listaAlunos;
}
}
<h:body>
<h:dataTable value=#{alunoMB.listaAlunos} var=a>
<f:facet name=header >
<h:outputText value=LISTA DE ALUNOS />
</f:facet>
<h:column>
Captulo 7 - Hibernate
A seguir o arquivo listar.xhtml, que apresenta todos os dados retornados pelo mtodo listar().
131
<property name=hibernate.connection.driver_class>
org.postgresql.Driver
</property>
<property name=hibernate.connection.url>
jdbc:postgresql://localhost:5432/curso
</property>
<property name=hibernate.connection.username>postgres</property>
132
<property name=hibernate.connection.password>postgres</property>
<property name=hibernate.connection.pool_size>1</property>
<property name=hibernate.dialect>
org.hibernate.dialect.PostgreSQLDialect
</property>
<property name=hibernate.current_session_context_class>
thread
</property>
<property name=hibernate.cache.provider_class>
org.hibernate.cache.NoCacheProvider
</property>
<property name=hibernate.show_sql>true</property>
<!-- Class Mapping -->
<mapping package=com.cursojava.model/>
<mapping class=com.cursojava.model.Aluno/>
</session-factory>
</hibernate-configuration>
faces-cong.xml
beans.xml
classes
hibernate.cfg.xml
Arquivos.class
lib
Exerccio de Fixao e
Criar a aplicao contendo a classe persistente Aluno, o Managed Bean AlunoMB, o arquivo
indexemplo:xhtml e o arquivo listar.xhtml, conforme mostrados anteriormente.
persistncia de um objeto;
11 Unidade de Trabalho: conjunto de operaes que so consideradas como um grupo
(algumas vezes atmico);
11 Contexto de Persistncia: mecanismo que mantm todos os objetos persistentes,
seus estados e modificaes. Mantido por uma Session em Hibernate
(ou EntityManager no JPA);
11 Estados: situaes que um objeto pode assumir no ciclo de vida de persistncia:
transiente, Persistente, Removido, Desligado;
Captulo 7 - Hibernate
Figura 7.2
Contedo de
uma aplicao.
133
Transiente
new
Removido
get()
load()
Query.list()
Query.uniqueResult()
Query.iterate()
nd()
getReference()
Query.getResultList()
Query.getSingleResult()
lixo
delete()
remove()
lix
save()
saveOrUpdate()
persist()
merge()
Persistente
evict()
close()
clear()
update()
saveOrUpdate()
merge()
lixo
Figura 7.3
Ciclo de Vida
de Objetos.
Desligado
A figura 7.3 mostra os estados e os mtodos que fazem com que um objeto transite entre
esses estados. Os estados so:
11 Transientes: instanciados com new. No so persistidos imediatamente;
Anotaes
Para anotar uma entidade, usa-se @Entity. Por exemplo, a classe Pessoa a seguir ser persistente:
@Entity
public class Pessoa {
...
}
Para criar um identificador nico, que no banco de dados se reflete como uma chave primria,
134
@Entity
public class Pessoa {
@Id
private Long id;
}
Para customizar o nome da tabela no banco de dados e o nome da coluna, usa-se @Table e
@Column. No exemplo a seguir, o nome da tabela foi alterado. Se no for usado, o nome da
tabela deve ser o mesmo nome da classe:
@Entity
@Table(name = tb_pessoa)
public class Pessoa {
@Id
private Long id;
}
No exemplo a seguir, o nome da coluna tambm foi customizado. Se no for usado, o nome
da coluna deve ser o mesmo nome do atributo da classe.
@Entity
@Table(name = tb_pessoa)
public class Pessoa {
@Id
@Column(name=pess_id)
private Long id;
}
Captulo 7 - Replicao
135
Chaves primrias
Para chaves primrias simples, anota-se com @Id o atributo cujo campo a chave.
So tipos permitidos para chaves primrias:
// setters/getters
}
136
generator=seq)
@Id
private long id;
}
O prximo sequenciador usa uma entidade sequence do banco de dados para obter o
prximo valor a ser gerado como Id.
@SequenceGenerator(name=seq, sequenceName=seq_pessoa)
public class Pessoa {
@GeneratedValue(strategy=GenerationType.SEQUENCE,
@Id
private long id;
generator=seq)
Captulo 7 - Replicao
@Entity
137
Datas
Para persistncia de Datas, usa-se em Java:
11 java.util.Date;
11 java.util.Calendar.
Esses tipos so mapeados automaticamente para os tipos de data/hora dos bancos de
dados. Por default, a data e a hora so armazenados no banco. Para mudar o comportamento, usa-se:
@Temporal, que pode receber um dos seguintes valores:
138
@Entity
public class Pessoa {
@Id
@GeneratedValue
private Long id;
@Lob
private byte[] avatar;
}
Atributos transientes
Quando algum atributo de uma entidade no deve ser persistido, usa-se a anotao
@Transient ou marca-se o atributo como transient. No exemplo a seguir, o atributo idade
no ser persistido.
@Entity
public class Pessoa {
@Id
@GeneratedValue
private Long id;
@Temporal(TemporalType.DATE)
private Calendar nascimento;
@Transient
private int idade;
}
Interfaces do Hibernate
Qualquer tipo de acesso ao banco de dados pode ser feito com o Hibernate, e isso provido
por suas interfaces.
Admite-se:
dos objetos.
Captulo 7 - Replicao
139
Uma aplicao pode ter vrias fbricas (SessionFactory), se acessa vrios bancos de dados.
Essas fbricas so obtidas atravs da classe HibernateUtil. Pela fbrica, obtm-se uma
sesso (chamada de openSession()) e na sesso que as operaes so efetuadas.
Caractersticas desses objetos:
Persistindo um objeto
Usa-se o mtodo save(), como no exemplo a seguir:
Pessoa p = new Pessoa();
p.setNome(Joo);
p.setIdade(18);
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
140
Quando ocorre o commit(), o objeto sincronizado, isto , se houver alguma alterao ela
efetuada no banco de dados (Automatic Dirty Checking).
Remoo de um objeto
Usa-se delete() para remover o estado persistente do objeto, como no exemplo a seguir:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Pessoa p = session.get(Pessoa.class, new Long(1));
session.delete(p);
tx.commit();
session.close();
Aps o delete(), o objeto passa para o estado removido e no deve mais ser manipulado. Quando
ocorre o commit(), o SQL (delete) executado e o objeto no ter mais estado persistente.
11 Esse objeto possui valores diferentes em atributos (portanto precisa ser atualizado);
11 Ele no est na sesso do hibernate (exemplo: sesso recm-aberta).
O processo :
11 Abrir ou obter a sesso do hibernate;
11 Chamar mtodo update().
22 Agenda um UPDATE na base de dados.
Captulo 7 - Replicao
141
Para resolver esta questo, deve-se abrir ou obter a sesso do hibernate e chamar o mtodo
update() passando como parmetro o objeto a ser atualizado. Esse procedimento coloca o
objeto na sesso e agenda o UPDATE necessrio.
p.setNome(Teste); // objeto fora da sesso mas j existe na base
Session session2 = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session2.update(p);
p.setIdade(28);
tx.commit();
session2.close();
O update() religa a instncia para uma nova sesso. Como a sesso nova, no tem informao
se o objeto est ou no sujo (isto , se foi alterado), portanto, no importa se houve alteraes antes ou depois do update(), o objeto sempre ser persistido.
Se h certeza absoluta que o objeto no foi alterado, usa-se o mtodo lock(), como no exemplo:
Session session2 = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session2.lock(p, LockMode.NONE);
p.setIdade(28);
tx.commit();
session2.close();
O lock() religa a instncia (no alterada) para uma nova sesso. Tudo o que foi modificado
antes do lock() no persistido, tudo que for alterado depois de sua chamada persistido.
O delete(), nesse caso, religa o objeto com o contexto de persistncia e agenda a deleo do
mesmo no commit().
142
8
Aprender as configuraes necessrias no Hibernate para se trabalhar com
relacionamento entre tabelas e sua contrapartida, como associaes entre classes;
Conhecer os quatro tipo mais comuns de associaes.
conceitos
Associaes
Existem quatro tipos de Associaes (em orientao a objetos) que so mapeadas para
Relacionamentos (no modelo relacional). Vejamos cada um deles no exemplo a seguir.
Tipos de Associao entre Pessoa e Endereo:
11 um-para-um (@OneToOne): uma pessoa tem um s endereo. Um endereo per-
Cascateamento
Cascateamento quando se indica que uma operao aplicada em um objeto ser tambm
aplicada aos objetos a ele associados. Os tipos so definidos na classe CascadeType. A seguir
so apresentados alguns deles:
11 CascadeType.PERSIST: cascateia a operao de persistncia (salvar);
11 CascadeType.MERGE: cascateia a operao que religa um objeto ao contexto
de persistncia;
11 CascadeType.REMOVE: cascateia a operao de remoo;
objetivos
Hibernate Associaes
143
Lazy Load
O Load ou Fetch a indicao de como a associao deve ser recuperada, definindo se,
ao carregar um objeto que possui outros objetos associados, os dados das associaes
tambm devem ser recuperados.
Temos dois tipos:
11 Default FecthType.LAZY;
11 Para trocar o tipo de Fetch em uma associao, usa-se:
@OneToOne(fetch=FetchType.EAGER)
@JoinColumn(name=user_id)
private Profile getUser() {
return user;
}
144
O que usar?
11 Eager:
22 Pouca codificao;
22 Problemas de desempenho, pois busca todas as associaes.
11 Lazy Default e Preferencial:
22 Mais codificao;
22 Mais eficiente, pois s busca os dados da associao explicitamente.
UML
Unified Modeling
Language, uma notao
usada para descrever
sistemas em vrias
vises. Mais detalhes
em: http://www.uml.org/
Associao Um-para-Um
Uma associao Um-para-Um indica que um objeto possui relao com somente outro, por
exemplo, uma pessoa que possui um e somente um endereo. Nessa relao, um endereo
tambm de somente uma pessoa. A figura a seguir ilustra como seria a associao, atravs
de uma ligao entre as duas entidades, usando notao UML.
Pessoa
Figura 8.1
Associao
Um-para-Um.
- nome : String
Disciplina
- rua : String
- numero : int
11 O proprietrio:
22 Na propriedade da associao anota-se com @OneToOne;
22 responsvel por manter a associao;
22 Declara a coluna de ligao.
11 Do lado oposto ao proprietrio, usamos:
22 Anotao @OneToOne;
22 Com atributo mappedBy.
11 @JoinColumn usado para indicar qual o campo que liga das duas tabelas
As anotaes utilizadas so @OneToOne, que deve ser colocada na classe proprietria da
associao, bem como na outra classe. A tabela 8.1 mostra os atributos dessa anotao.
Atributos
Descrio
cascade
fetch
mappedBy
optional
orphanRemoval
targetEntity
Tabela 8.1
Atributos de
@OneToOne.
145
J a anotao @JoinColumn usada para indicar o campo que faz a ligao entre as duas
tabelas da relao, e seus atributos so apresentados na tabela a seguir. A tabela 8.2 mostra
alguns atributos de @JoinColumn.
Atributos
Descrio
name
nullable
table
unique
integer
NOT NULL);
end_rua
// imports
146
@Entity
@Table (name=tb_pessoa)
@SequenceGenerator(name=sequencia, sequenceName=seq_pess_id)
public class Pessoa implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,
generator=sequencia)
return id;
Tabela 8.2
Atributos de
@JoinColumn.
this.id = id;
return this.nome;
this.nome = nome;
}
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name=end_id, updatable=true)
return this.endereco;
this.endereco = endereco;
}
}
A classe Endereco, por sua vez, deve ser anotada conforme o seguinte trecho:
package com.cursojava.model;
// imports
@Entity
@Table (name=tb_endereco)
@SequenceGenerator(name=seq_end, sequenceName=seq_end_id)
public class Endereco implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator=seq_end)
return id;
}
public void setId(Long id) {
this.id = id;
return this.rua;
this.rua = rua;
147
return this.numero;
this.numero = numero;
@OneToOne(mappedBy = endereco)
return this.pessoa;
this.pessoa = pessoa;
}
}
No exemplo anterior o passo de preenchimento do atributo da associao deve ser feito para
os dois objetos. Deve-se preencher o endereo na Pessoa e tambm a pessoa no Endereco.
Associao Um-para-Muitos
Uma associao Um-para-Muitos indica que um objeto possui relao com vrios outros.
Por exemplo, um professor que ministra vrias disciplinas e uma disciplina que ministrada
por somente um professor. A figura a seguir ilustra como seria a associao, atravs de um
JAVA Frameworks e Aplicaes Corporativas
148
Professor
- nome : String
- salario : double
- dataAdmissao : Date
Disciplina
- nome : String
- carga : int
Figura 8.2
Associao
Um-para-Muitos.
O lado many o proprietrio da associao, pois nele que est a informao de ligao
entre as classes ou tabelas. O proprietrio responsvel por manter a coluna de associao, e
nessa classe que se declara a coluna de ligao. No lado oposto usado um atributo chamado
mappedBy para indicar a propriedade do lado inverso, que representa a associao.
11 O lado many o proprietrio da associao.
22 No exemplo: disciplina.
11 Em Professor:
22 Na propriedade da associao anota-se com @OneToMany;
22 Usa-se mappedBy para indicar o proprietrio da associao.
11 Em Disciplina;
11 Anotao @ManyToOne.
22 Como Disciplina o proprietrio da associao;
22 Anota-se @JoinColumn.
As anotaes utilizadas so @OneToMany, que deve ser colocada na classe proprietria da
associao, @ManyToOne, que deve ser colocada na classe que est sujeita associao e o
@JoinColumn, usado para indicar o campo que faz a ligao entre as duas tabelas.
Como j foi dito, no caso de associaes Um-para-Muitos, o lado many ser o dono da
associao, pois manter o campo de ligao, e portanto ser nessa classe que ser declaTabela 8.3
Atributos de
@OneToMany.
rado o @JoinColumn.
A tabela 8.3 mostra os atributos de @OneToMany.
Atributos
Descrio
cascade
fetch
mappedBy
orphanRemoval
targetEntity
Atributos
Descrio
cascade
fetch
optional
Tabela 8.4
Atributos de
@ManyToOne.
integer
NOT NULL,
NOT NULL,
NOT NULL);
149
disc_nome
Deve-se perceber que, para caracterizar uma associao Um-para-Muitos entre Professor
e Disciplina, o campo de ligao (chave estrangeira) est na tabela tb_disciplina, e por isso
que a coluna de ligao ser declarada na classe Disciplina.
As classes Professor e Disciplina devem ser anotadas conforme o exemplo a seguir. Primeiramente mostramos a classe Professor.
package com.cursojava.model;
// imports
@Entity
@Table (name=tb_professor)
@SequenceGenerator(name=seq_prof, sequenceName=seq_prof_id)
public class Professor implements Serializable {
@Id
JAVA Frameworks e Aplicaes Corporativas
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator=seq_prof)
150
return id;
this.id = id;
return this.nome;
this.nome = nome;
return this.salario;
this.salario = salario;
return this.dataAdmissao;
this.dataAdmissao = dataAdmissao;
@OneToMany(mappedBy=professor, cascade=CascadeType.ALL,
fetch=FetchType.EAGER)
return this.disciplinas;
this.disciplinas = disciplinas;
}
}
@Id
generator=seq_disc)
return id;
this.id = id;
return this.nome;
@GeneratedValue(strategy=GenerationType.SEQUENCE,
151
this.nome = nome;
return this.carga;
this.carga = carga;
}
@ManyToOne
@JoinColumn(name=prof_id)
return this.professor;
this.professor = professor;
}
}
Um exemplo de trecho de cdigo usando esta configurao de associao pode ser visto
a seguir.
Professor professor = new Professor();
professor.setNome(Joo);
professor.setDataAdmissao(new Date());
professor.setSalario(15000.00);
ArrayList<Disciplina> lista = new ArrayList<Disciplina>();
Disciplina disciplina = new Disciplina();
disciplina.setNome(Java Bsico);
disciplina.setCarga(40);
disciplina.setProfessor(professor);
lista.add(disciplina);
Disciplina disciplina = new Disciplina();
disciplina.setNome(Java Corporativo);
disciplina.setCarga(40);
disciplina.setProfessor(professor);
152
lista.add(disciplina);
professor.setDisciplinas(lista);
Session session = HibernateUtil.getSessionFactory()
.openSession();
session.beginTransaction();
session.save(professor);
session.getTransaction().commit();
session.close();
Associao Muitos-para-Muitos
Uma associao Muitos-para-Muitos indica que um objeto possui relao com vrios outros.
Por exemplo, um usurio que participa de vrios grupos, e um grupo que possui vrios usurios
cadastrados. A figura a seguir ilustra como seria a associao, atravs de uma ligao entre
as duas entidades, usando a notao UML.
Usurio
Figura 8.3
Associao Muitospara-Muitos.
- nome : String
- idade : int
Grupo
- nome : String
- tipo : String
22 No exemplo: usurio;
22 Usa-se (cria-se) uma tabela de ligao.
11 Em Usurio:
22 Na propriedade da associao anota-se com @ManyToMany;
22 Como Usurio o proprietrio da associao anota-se com @JoinTable.
11 Em Disciplina:
22 Anotao @ManyToMany;
22 Usa-se mappedBy para indicar o proprietrio da associao.
11 @JoinColumn: usado para indicar qual o campo que liga as duas tabelas.
As anotaes utilizadas so @ManyToMany, que deve ser colocada tanto na classe proprietria como na outra classe da associao; o @JoinTable que usado para indicar a tabela
de ligao entre as duas tabelas, e o @JoinColumn, que usado para descrever a coluna na
tabela de ligao.
A tabela 8.5 mostra os atributos de @ManyToMany:
Atributos
Descrio
cascade
fetch
mappedBy
targetEntity
Captulo 8 - Replicao
Tabela 8.5
Atributos de
@ManyToMany.
153
Descrio
joinColumns
inverseJoinColumns
name
integer
usuario_nome
character varying(50)
usuario_idade
integer
NOT NULL,
NOT NULL);
grupo_nome
grupo_tipo
grupo_id
Deve-se perceber que, para caracterizar uma associao Muitos-para-Muitos entre Usurio e
154
Grupo, foi criada uma nova tabela, chamada tb_usuario_grupo. Essa nova tabela mapeada
no lado dono da associao, o qual, nesse exemplo, foi escolhido como sendo o Usurio.
As classes Usurio e Grupo devem ser anotadas conforme o exemplo a seguir. Primeiro
temos a classe Usurio.
package com.cursojava.model;
// imports
@Entity
@Table (name=tb_usuario)
@SequenceGenerator(name=seq_usuario, sequenceName=seq_usuario_id)
Tabela 8.6
Atributos de
@JoinTable.
public Usuario() {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,
generator=seq_usuario)
return id;
this.id = id;
length=50)
return this.nome;
this.nome = nome;
return this.idade;
this.idade = idade;
}
@ManyToMany(
targetEntity=com.cursojava.model.Grupo.class,
cascade={CascadeType.PERSIST, CascadeType.MERGE},
fetch=FetchType.EAGER
)
@JoinTable(
name=tb_usuario_grupo,
joinColumns={@JoinColumn(name=usuario_id)},
inverseJoinColumns={@JoinColumn(name=grupo_id)}
)
public Collection<Grupo> getGrupos() {
return this.grupos;
}
}
this.grupos = grupos;
Captulo 8 - Replicao
155
public Grupo() {
}
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,
generator=seq_grupo)
return id;
this.id = id;
return this.nome;
this.nome = nome;
return this.tipo;
156
this.tipo = tipo;
}
@ManyToMany(
cascade={CascadeType.PERSIST, CascadeType.MERGE},
mappedBy=grupos,
fetch=FetchType.EAGER)
return this.usuarios;
}
}
this.usuarios = usuarios;
Um exemplo de trecho de cdigo usando esta configurao de associao pode ser visto no
cdigo a seguir.
Session session = HibernateUtil.getSessionFactory()
.openSession();
session.beginTransaction();
Usuario usuario = (Usuario)session.get(Usuario.class, 10);
Grupo grupo = (Grupo)session.get(Grupo.class, 5);
usuario.getGrupos().add(grupo);
grupo.getUsuarios().add(usuario);
session.save(usuario);
session.getTransaction().commit();
Captulo 8 - Replicao
session.close();
157
158
9
objetivos
conceitos
HQL
11 Hibernate Query Language.
w
Mais informaes em:
http://www.hibernate.
org/hib_docs/
reference/en/html/
queryhql.html
O Hibernate traz um nvel de abstrao muito alto para a aplicao, fazendo com que todas
159
Para a execuo dos exemplos que sero apresentados nesta sesso, vamos utilizar as
classes apresentadas na figura 9.1.
Professor
- nome : String
- dataAdmisso : Date
Disciplina
- nome : String
- cargaHoraria : int
Aluno
- nome : String
1
0...1
Sala
- nome : int
- arCondicionado : boolean
O banco de dados representado por essa modelagem pode ser criado com o seguinte cdigo:
create table tb_professor (
prof_id serial primary key,
prof_nm character varying(50),
prof_dt date
);
create table tb_sala (
sala_id serial primary key,
sala_nr integer,
sala_ar boolean
);
create table tb_disciplina (
disc_id serial primary key,
disc_nm character varying(50),
disc_carga integer
);
160
Figura 9.1
Classes.
A API do Hibernate que cria uma query do HQL para execuo o mtodo createQuery() de
session, conforme o exemplo:
Query query = session.createQuery(FROM Aluno);
List<Aluno> resultado = query.list();
Esse trecho de cdigo executa a query FROM Aluno, que retorna todos os objetos de Aluno.
O mtodo list() de query, executa a query e retorna a lista de objetos.
Um lao de exemplo para mostrar os resultados pode ser visto a seguir.
for (Aluno o: resultado) {
System.out.println(o.getNome());
}
No exemplo anterior, o filtro aplicado retorna dez alunos a partir do vigsimo elemento.
Para filtrar os resultados, usa-se a clusula WHERE com parmetros, conforme os exemplos
a seguir.
Query query = session.createQuery(FROM Disciplina WHERE nome = ?);
query.setString(0, Java I);
Disciplina resultado = (Disciplina) query.uniqueResult();
Query query = session.createQuery(FROM Disciplina WHERE nome = :nome);
query.setString(nome, Java II);
Disciplina resultado = (Disciplina) query.uniqueResult();
Nos dois exemplos, espera-se que haja somente um resultado da consulta, portanto, usa-se
o mtodo uniqueResult() em vez de list(). No primeiro exemplo, o parmetro da clusula
sando como parmetro a posio do parmetro, iniciando em zero. No segundo exemplo,
usa-se tambm setString(), mas o parmetro nomeado (:nome) e assim que identificado no mtodo de atribuio de valor.
Alm do setString(), existem outro mtodos, como setInt() e setDate(), dependendo do tipo
do parmetro que est sendo passado.
WHERE feito com interrogao (?) e, para setar o valor, usa-se o mtodo setString(), pas-
161
Parmetros:
Como no foi utilizada a clusula SELECT, o retorno padro das funes list() e uniqueResult()
Object. Se for usado o SELECT, consegue-se mais controle sobre o que ser retornado,
inclusive com a tipagem correta. Um exemplo mais complexo de FROM e WHERE pode ser
visto a seguir.
Clusulas FROM e WHERE
SELECT DISTINCT d
FROM Disciplina d
WHERE d.carga > :carga AND d.nome = :nome
11 Retorna todas as disciplinas conforme critrios dados pelos parmetros :carga e :nome
11 No retorna elementos duplicados.
22 Uso do DISTINCT no SELECT.
Essa consulta retorna todas as disciplinas cuja carga horria seja maior que o parmetro
:carga e cujo nome seja igual ao parmetro :nome. Por conta do DISTINCT na clusula
JAVA Frameworks e Aplicaes Corporativas
162
No WHERE, alm do AND como visto anteriormente, tambm podemos usar o OR para
combinar restries, como no exemplo:
SELECT DISTINCT p
FROM Professor p JOIN p.disciplinas d
WHERE d.carga = 60 OR d.nome=Java III
Essa consulta retorna todas os professores que ministram disciplinas com carga de 60 horas
ou a disciplina de Java III.
Clusula LIKE
SELECT DISTINCT a
FROM Aluno a
WHERE a.nome LIKE A%
Essa consulta retorna todos os professores que no possuem sala (que no nosso caso
nenhum). Nesse caso, se for uma associao, est verificando se h o relacionamento entre
as duas entidades. Deve-se tomar cuidado, pois no equivalente a comparar p.sala = NULL,
visto que pelo padro SQL ANSI, NULL um valor desconhecido e, portanto NULL no
igual a NULL, sendo sempre falso.
Em caso de colees, para verificar se h valores ou no usa-se EMPTY (NOT EMPTY), como
no exemplo a seguir.
SELECT DISTINCT p
FROM Professor p
WHERE p.disciplinas IS NOT EMPTY
Essa consulta retorna todos os professores que possuem disciplinas (uma ou mais).
O atributo disciplinas uma coleo.
As comparaes de datas so anlogas s feitas em SQL, usando BETWEEN e NOT BETWEEN.
SELECT DISTINCT p
FROM Professor p
WHERE p.dataAdmissao BETWEEN :data1 AND :data2
Retorna todos professores cuja data de admisso esto entre data1 e data2. equivalente
a comparar:
p.dataAdmissao >= data1 AND p.dataAdmissao <= data2
FROM Professor p
163
Atualizaes podem ser feitas usando-se UPDATE e DELETE, como nos exemplos a seguir.
UPDATE Disciplina d
SET d.carga = 100
WHERE d.carga = 60
Esse comando altera a carga horria de todas as disciplinas que possuem 60 horas para
100 horas. Para executar esta query, usa-se o seguinte trecho de cdigo:
Query query = session.createQuery(UPDATE Disciplina d SET d.carga = 100 WHERE
d.carga = 60);
int rows = query.executeUpdate();
Joins
Os Joins so usados para se obter, selecionar, restringir etc. elementos que esto associados
a um objeto. Por exemplo, a classe Disciplina possui um Professsor que a ministra e a classe
Professor possui uma coleo de Disciplinas ministradas por ele. Para retornar todas as
disciplinas de um determinado professor, precisa-se fazer uma consulta na classe Disciplina,
restringindo-a de modo a retornar somente as que so do Professor. Isso feito unindo a
Disciplina com seu Professor, atravs da palavra reservada JOIN, como no exemplo a seguir:
SELECT d
164
Esse exemplo retorna todas as disciplinas ministradas pelo professor Pedro. O comando
INNER opcional, e a consulta acima equivale a:
SELECT d
FROM Disciplina d INNER JOIN d.professor p
WHERE p.nome = Pedro
Ambas equivalem a:
SELECT d
FROM Disciplina d, IN(d.professor) p
WHERE p.nome = Pedro
Os Joins podem ser de forma explcita e implcita tambm. As explcitas identificando via
palavra JOIN, como no exemplo a seguir, que retorna todas as disciplinas do professor Pedro:
SELECT d
FROM Disciplina d JOIN d.professor p
WHERE p.nome = Pedro
Os LEFT JOINS so usados para retornar elementos mesmo que no haja relacionamento
entre eles. Usa-se as palavras LEFT JOIN e LEFT OUTER JOIN (outer opcional).
SELECT p.nome, d.nome
FROM Professor p LEFT JOIN p.disciplinas d
Retorna todos os pares Professor e Disciplina, mesmo que no haja disciplina atrelada ao
Professor. Para executar esta query, podemos usar o trecho a seguir.
Query query = session.createQuery(SELECT p.nome, d.nome FROM Professor p LEFT JOIN
p.disciplinas d);
List<Object[]> resultado = query.list();
for (Object[] o: resultado) {
System.out.println(o[0] + : + o[1]);
O retorno de dois dados (p.nome, d.nome) ser discutido adiante, na subseo sobre
Clusula SELECT.
Quando em uma associao, por exemplo: Professor x Disciplina, ao se buscar pela disciplina,
seu professor no retornado automaticamente. Somente consultado quando sua propriedade for acessada (Lazy).
Lazy Fetch:
Efeito colateral:
11 Traz todos os dados das entidades relacionadas;
11 Mesmo que no estejam explicitamente especificados no SELECT.
165
Clusula SELECT
Quando no se usa SELECT, buscamos o objeto como um todo. Ao usar SELECT, podemos indicar
o objeto que se quer recuperar ou podemos buscar somente algumas propriedades desse
objeto. Nos exemplos anteriores, sempre buscava-se um objeto de algum tipo, por exemplo:
SELECT d
FROM Disciplina d
WHERE d.professor.nome = Pedro
A clusula SELECT indica que o resultado da query ser um ou mais objetos do tipo Disciplina.
Se a query no possuir a clusula SELECT, como no exemplo a seguir.
FROM Disciplina d
WHERE d.professor.nome = Pedro
O retorno ser um objeto ou coleo do tipo Object. Os exemplos a seguir so usados para
retornar somente uma parte dos dados dos objetos ou, como no caso do MAX(), uma funo.
SELECT p.nome
FROM Professor p
SELECT max(d.carga)
FROM Disciplina d
SELECT d.nome, d.carga
FROM Disciplina d
No primeiro caso retornada uma Lista de nomes (somente o nome) de todos os professores.
J no segundo caso retornado um nmero, o valor mximo das cargas horrias das disciplinas
e no terceiro caso retornado uma Lista de Object[] (uma lista de arrays de objetos), onde:
11 O primeiro elemento do array o nome da disciplina;
11 O segundo elemento do array a carga horria da disciplina.
Outra maneira de restringir o retorno usando o DISTINCT, que j foi usado em outras
consultas vistas anteriormente. Ele usado para no retornar resultados duplicados.
Por exemplo, a consulta a seguir retorna as disciplinas cursadas por alunos, mas retorna
elementos duplicados.
SELECT d
FROM Disciplina d JOIN d.alunos a
166
SELECT DISTINCT d
FROM Disciplina d JOIN d.alunos a
Esse exemplo retorna todos os alunos, ordenando-os por nome. Podemos ordenar os resultados de forma ascendente ou descendente:
apresenta a lista de professores e a quatidade de disciplinas. Se for usado LEFT JOIN apresenta tambm a lista de professores com nenhuma disciplina. HAVING serve para restringir
a ao do GROUP BY.
SELECT p.nome, AVG(d.carga)
FROM Professor p JOIN p.disciplinas d
GROUP BY p.nome
HAVING AVG(d.carga) >= 40
Criteria
Criteria uma API para criao de queries que podem ser verificadas em tempo de compilao.
Ao contrrio do HQL, cujas queries so verificadas s em tempo de execuo.
Outro benefcio importante quando se necessita construir queries de forma programtica.
em vez de construir uma String em HQL, cria-se um Criteria.
11 API para criao de queries que podem ser verificadas em tempo de compilao
Esse exemplo cria um Criteria para a classe Professor e retorna a lista completa de professores. Um lao de exemplo para mostrar os resultados seria:
for (Professor o: lista) {
}
System.out.println( o.getNome() );
22 Interface da API
167
Descrio
add()
addOrder()
createCriteria()
list()
setFirstResult()
setMaxResult()
Limita os dados retornados, indicando quandos devem ser retornados. Usado em paginaes
setProjection()
uniqueResult()
Tabela 9.1
Alguns mtodos
de Criteria.
Ordenao
Para se fazer ordenao, usa-se o mtodo addOrder() do objeto criteria. Podemos ter uma
ordenao crescente (Order.asc()) e decrescente (Order.desc()). O parmetro o nome do
atributo da classe pelo qual se quer ordenar os resultados. No exemplo a seguir, temos a
ordenao crescente:
Criteria criteria = session.createCriteria(Aluno.class);
criteria.addOrder( Order.asc(nome) );
List<Aluno> lista = criteria.list();
E para decrescente:
Criteria criteria = session.createCriteria(Aluno.class);
criteria.addOrder( Order.desc(nome) );
List<Aluno> lista = criteria.list();
Restries
As restries feitas na clusula WHERE so criadas com Restrictions. As de comparao
simples de valores so:
11 Restrictions.eq: verifica se um campo igual a um valor;
11 Restrictions.lt: verifica se um campo menor que um valor;
11 Restrictions.le: verifica se um campo menor ou igual a um valor;
11 Restrictions.gt: verifica se um campo maior a um valor;
11 Restrictions.ge: verifica se um campo maior ou igual a um valor;
11 Restrictions.like: verifica se um campo parecido com um valor (caracteres coringa).
168
A primeira consulta retorna todas as disciplinas com carga maior que 40. A segunda retorna
todas as disciplinas cujo nome inicia com a string Java.
Para retornar somente um resultado, usa-se uniqueResult(), como no exemplo a seguir:
Criteria criteria = session.createCriteria(Disciplina.class);
criteria.add( Restrictions.eq(nome, Java III) );
Disciplina d = (Disciplina)criteria.uniqueResult();
Nesse exemplo, criado um Criteria para a classe Disciplina e retornada uma disciplina cujo
nome Java III.
Outras restries (WHERE) tambm podem ser criadas, como:
Captulo 9 - Replicao
169
No exemplo a seguir, sero retornadas todas as salas de nmero maior que 202 ou que no
possuam ar-condicionado.
Criteria criteria = session.createCriteria(Sala.class);
Criterion restrNr = Restrictions.gt(numero, 202);
Criterion restrAr = Restrictions.eq(arCondicionado, false);
LogicalExpression restr = Restrictions.or(restrNr, restrAr);
criteria.add(restr);
List<Sala> resultado = criteria.list();
170
Projees
Projees so restries ou agregaes feitas na clusula SELECT. usado para retornar
somente alguns atributos ou fazer funes agregadoras. Usa-e setProjection() e elementos de
Projections para isso. No exemplo a seguir, retorna-se a quantidade de elementos de Aluno
(rowCount()). O resultado nesse caso deve ser obtido com uniqueResult(), que retorna um Long.
Criteria criteria = session.createCriteria(Aluno.class);
criteria.setProjection( Projections.rowCount() );
Long r = (Long)criteria.uniqueResult();
Como esta consulta retorna somente duas informaes, usam-se as posies do vetor para
mostrar os resultados, como a seguir.
System.out.println( dados[0] + - + dados[1] );
JSF e Hibernate
As maneiras de se integrar o Hibernate em aplicaes JSF so muitas e dependem muito da
arquitetura da aplicao que se deseja, dos requisitos do cliente etc.
Levando em conta que uma aplicao JSF composta, basicamente, por duas partes:
11 XHMTL: pginas a serem apresentadas ao usurio;
11 Managed Beans: componentes que tratam as requisies das pginas.
Deve-se adicionar um terceiro elemento, que so as classes persistentes para o Hibernate.
No nosso caso, as classes Sala, Professor, Disciplina e Aluno, que faro parte do modelo de
acesso ao banco de dados e vo ser responsveis por manter os dados persistidos.
Uma forma simples de integrao (sem pensar em conceitos como reuso, manutenibilidade
e modularidade) inserir o cdigo de acesso ao banco, no nosso caso do Hibernate, diretaManaged Bean j pode fazer os acessos ao banco de dados de forma pontual.
Captulo 9 - Replicao
mente em mtodos dos Managed Beans. Assim, quando o cliente interage com a aplicao, o
171
this.aluno = aluno;
172
}
public void salvarAluno() {
Session session = HibernateUtil.getSessionFactory()
.openSession();
session.beginTransaction();
session.save(aluno);
session.getTransaction().commit();
}
}
Percebe-se nesse exemplo que o prprio JSF faz o preenchimento do bean Aluno, pela
ligao do XHTML com o Managed Bean. Assim, o mtodo salvarAluno() do MB precisa
somente chamar o mtodo save(), do Hibernate.
Para se pesquisar um aluno, criam-se dois arquivos XHTML, um para entrada do texto de
pesquisa, outro para listagem dos dados retornados. Alm disso, criam-se dois atributos
no Managed Bean:
11 texto: (String) para conter o texto da pesquisa;
11 lista: (List<Aluno>) para conter o resultado da pesquisa.
Os XHTML podem ficar como a seguir. O primeiro um formulrio para entrada do critrio
de pesquisa. Contm um texto que ser usado no HQL de busca.
<h:form>
Texto: <h:inputText value=#{exemploMB.texto} /> <br/>
<h:commandButton value=Pesquisar
action=#{exemploMB.pesquisarAluno()} />
</h:form>
O segundo arquico contm um dataTable para mostrar os dados retornados, que esto
armazenados no atributo lista do MB.
<h:dataTable var=a value=#{exemploMB.lista}>
<h:column>
<f:facet name=header> Nome </f:facet>
<h:outputText value=#{a.nome} />
</h:column>
</h:dataTable>
A nova verso do Managed Bean pode ser vista a seguir, com os novos atributos e o mtodo
pesquisarAluno().
@Named(value = exemploMB)
@RequestScoped
public class ExemploMB {
private Aluno aluno = new Aluno();
private String texto = ;
private List<Aluno> lista = new ArrayList<Aluno>();
public ExemploMB() {
}
public Aluno getAluno() {
return aluno;
}
public void setAluno(Aluno aluno) {
Captulo 9 - Replicao
this.aluno = aluno;
}
173
174
10
Conhecer conceitos avanados em Java EE e algumas tecnologias disponveis para
o desenvolvimento corporativo.
conceitos
Objetos distribudos; EJB; Singleton; MDB; JMS; Transaes; JTA; CMT; BMT;
web Services; SOAP; REST; SOA; WSDL; UDDI; JSON; JAXB e ESB.
Java EE
O desenvolvimento de sistemas computacionais baseado em requisitos. Esses requisitos
podem ser de dois tipos:
Requisitos funcionais:
Captulo 10 - Java EE
objetivos
Java EE
aos requisitos no funcionais. Assim, surge o Java EE, como uma plataforma para facilitar a
implementao de vrios requisitos no funcionais.
175
O Java EE :
11 Um conjunto de especificaes.
11 Caminho sobre como implementar um software.
11 Uma descrio do uso de servios de infraestrutura j implementados.
Com Java EE, possvel alterar a tecnologia de infraestrutura, sem maiores modificaes
no software.
11 Baixo acoplamento.
O Java EE um conjunto de especificaes de vrias tecnologias que do suporte ao desenvolvimento de sistemas corporativos com requisitos no funcionais complexos. Tambm
uma descrio de uso de servios de infraestrutura j implementados, dos quais o programador pode se beneficiar ao utiliz-los em seus projetos.
Com Java EE, possvel alterar a tecnologia e, muitas vezes, o comportamento da infraestrutura
sem muitas modificaes nas partes de negcio do software, levando a um baixo acoplamento.
O Java EE possui especificaes para:
11 Desenvolvimento web (Servlets, JSP, JSF);
JPA
uma tecnologia do
Java EE que foi baseada
no Hibernate. Hoje, JPA
uma especificao e
Hibernate uma implementao do JPA.
11 Segurana (JAAS);
11 Transaes (JTA);
11 Etc.
Objetos distribudos
Objetos distribudos em Java so implementados atravs de EJBs (Enterprise Java Beans).
Usando EJB, possvel usar objetos distribudos para o desenvolvimento de aplicaes que
possuem esse requisito no funcional.
Benefcios de EJB (Enterprise Java Beans):
11 Uso de transaes: integrado com JTA (Java Transaction API), inclusive com suporte a
transaes remotas;
176
Ou podemos criar uma interface para indicar seus mtodos de negcio e anot-la como:
@Local(NomeDaInterface.class)
Para ser remoto, obrigatria a criao de uma interface para usar a anotao:
@Remote(NomeDaInterface.class)
22 @Local(NomeDaInterface.class)
Quando o Bean Remoto:
11 Acessvel localmente e de outras mquinas
11 necessrio criar uma interface com os mtodos
11 Deve-se anotar com:
@Remote(NomeDaInterface.class)
Captulo 10 - Java EE
177
A anotao @Stateless obrigatria, tanto com interface local como remote. Por exemplo:
@Stateless
public class BibliotecaBean {
public int somar(int a, int b) {
return a + b;
}
public int subtrair(int a, int b) {
return a: b;
}
}
Como todos os Session Beans, o Stateless tambm possui um ciclo de vida gerenciado pelo
178
conteiner.
Os Stateless Session Beans possuem s dois estados:
this.produtos.add(p);
}
public void remover(Produto p) {
this.produtos.remove(p);
}
this.produtos.add(p);
}
public void remover(Produto p) {
Captulo 10 - Java EE
179
this.produtos.remove(p);
}
@Remove
public void finalizar() {
}
}
180
Message-Driven Beans
11 Bean com a capacidade de processar mensagens de forma assncrona.
Captulo 10 - Java EE
181
11 NO EXISTENTE:
22 MDB ainda no foi instanciado e no pode responder requisies ou mensagens.
11 PRONTO:
22 Pode responder requisies ou mensagens.
22 Quando uma mensagem chega, executa o mtodo onMessage()
A seguir, exemplo de um MDB.
@MessageDriven
public class MensagemBean
implements MessageListener {
public void onMessage(Message msg) {
}
}
Transaes
11 Execuo de vrias tarefas diferentes.
182
JTA (Java Transaction API) habilita transaes distribudas, isto , que manipulam informaes em vrios recursos atravs da rede. Basicamente, o gerenciador de transaes
(Transaction Manager), elemento crucial no JTA, tem como tarefa decidir se operaes sero
validadas ou abortadas, isso em um contexto distribudo.
Os passos de uma transao devem ser executados em sequncia. Se com sucesso,
a tarefa como um todo realizada, se algum passo falhar, a tarefa como um todo
abortada.
CMT
11 Servidor Abre, Confirma ou Aborta a transao.
}
}
BMT
11 A aplicao deve controlar a transao.
Captulo 10 - Java EE
183
ut.commit();
}
catch (TarefaException e) {
ut.rollback();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
web Services
Um servio que pode ser acessado diretamente por outro sistema de qualquer
XML ou JSON.
184
SOAP
Em web Services do tipo SOAP (Simple Object Access Protocol), toda a interao feita via
SOAP, que um protocolo de troca de mensagens baseado em XML.
A figura 10.1 mostra os servios de uma arquitetura SOAP e suas interaes.
UDDI
Registro dos
Servios
WSDL
Encontra o servio
WSDL
Publica o servio
SOAP
request
func (a,b)
w
Para saber mais,
acesse: http://www.
soa-manifesto.org/
Requisitante
do Servio
response
Provedor
do Servio
Captulo 10 - Replicao
Figura 10.1
Servios web
Service tipo SOAP.
Web Service
func (a,b)
185
WSDL (web Services Description Language) uma linguagem baseada em XML usada para
descrever e localizar webServices.
WSDL
186
<xsd:schema>
<xsd:import namespace=http://ws.com/ schemaLocation=http://localhost:8080/
ServidorWS/TesteWS?xsd=1/>
</xsd:schema>
</types>
<message name=hello>
<part name=parameters element=tns:hello/>
</message>
<message name=helloResponse>
<part name=parameters element=tns:helloResponse/>
</message>
<message name=mostrar>
<part name=parameters element=tns:mostrar/>
</message>
<message name=mostrarResponse>
<part name=parameters element=tns:mostrarResponse/>
</message>
<portType name=TesteWS>
<operation name=hello>
<input wsam:Action=http://ws.com/TesteWS/helloRequest message=tns:hello/>
<output wsam:Action=http://ws.com/TesteWS/helloResponse
message=tns:helloResponse/>
</operation>
<operation name=mostrar>
<input wsam:Action=http://ws.com/TesteWS/mostrarRequest
message=tns:mostrar/>
<output wsam:Action=http://ws.com/TesteWS/mostrarResponse
message=tns:mostrarResponse/>
</operation>
</portType>
<binding name=TesteWSPortBinding type=tns:TesteWS>
<soap:binding transport=http://schemas.xmlsoap.org/soap/http
style=document/>
<operation name=hello>
<soap:operation soapAction=/>
<input>
<soap:body use=literal/>
</input>
<output>
<soap:body use=literal/>
</operation>
<operation name=mostrar>
<soap:operation soapAction=/>
<input>
<soap:body use=literal/>
</input>
<output>
Captulo 10 - Replicao
</output>
187
<soap:body use=literal/>
</output>
</operation>
</binding>
<service name=TesteWS>
<port name=TesteWSPort binding=tns:TesteWSPortBinding>
<soap:address location=http://localhost:8080/ServidorWS/TesteWS/>
</port>
</service>
</definitions>
UDDI (Universal Description, Discovery and Integration) define mecanismos para publicar e
descobrir web Services.
UDDI
REST
REST: Representational State Transfer.
188
REST define interface web simples, sem abstraes de protocolos ou padres de trocas de
mensagens, usa os mecanismos do HTTP e identificao atravs de URIs.
Os mtodos de acesso a recursos so feitos com mtodos do HTTP, por exemplo:
11 GET, PUT, DELETE idempotentes;
11 POST no idempotente.
Os retornos so feitos atravs dos cdigos de retorno HTML, exemplo: 404, 201, 500 etc.
Por ser basicamente requisies HTML, os servios so acessveis atravs de qualquer
linguagem de programao. Recursos como autenticao, criptografia e autorizao podem
ser usados diretamente do HTML.
Ao contrrio do SOAP, no h necessidade de se codificar as mensagens em XML (e posteriormente decodific-las), visto que o prprio mtodo HTTP de acesso ao recurso j indica
qual a operao a ser efetuada.
GET
PUT
Cliente
Browser
POST
DELETE
Figura 10.2
web Service
RESTful.
http://servidor:porta/servico
Um web Services RESTful implementado com JAX-RS usa anotaes para definir que
Captulo 10 - Replicao
189
@Path(/cliente)
public class ClienteResourse {
@GET
}
@GET
@Path(/{id})
}
}
JAXB (Java Architecture for XML Binding) uma arquitetura de mapeamento entre objetos
Java e XML. Basicamente, transforma objetos Java em texto XML e vice-versa.
Java Architecture for XML Binding
190
SOA
11 Service Oriented Architecture: arquitetura baseada no paradigma de orientao
a servios.
11 Sistemas so construdos por funcionalidades, de forma desacoplada.
11 Favorece Reuso e Governana (alinhamento de estratgias de negcio x TI).
11 Implementado de vrias formas, por exemplo, web Services, SOAP, REST.
O conceito de SOAP e web Services no deve ser confundido com o conceito de SOA (Service
Oriented Architecture). SOA uma arquitetura que se baseia no paradigma de orientao a
servios, onde as funcionalidades dos sistemas so desenvolvidos de forma desacoplada,
favorecendo o reuso e alinhamento dos objetivos de negcio e as estratgias de TI.
Segundo o Gartner Group: SOA uma abordagem arquitetural corporativa que permite a
criao de servios de negcio interoperveis que podem facilmente ser reutilizados e compartilhados entre aplicaes e empresas.
SOA no :
11 Uma tecnologia;
11 web Services.
SOA :
11 Filosofia de TI;
11 Fcil integrao entre sistemas atuais e legados;
11 Baseado no conceito de servios.
Dessa forma, SOAP, web Services e REST so formas ou padres de implementao de
Arquitetura SOA.
Service
provider
Figura 10.3
Ilustrao do ESB.
Service
provider
Service
consumer
ESB
Service
consumer
Service
consumer
Captulo 10 - Replicao
Service
provider
191
SOAP
service
request
(e.g. J2EE, NET)
Portal Service
B2B
interaction
Common
runtime
environment
Service ow
192
Data
Exisiting
applications
New
service Logic
Figura 10.4
Outra ilustrao
de ESB
O curso aborda o uso de frameworks e tecnologias para desenvolvimento de aplicaes corporativas em Java. Este tipo
Java Enterprise Edition - Java EE, tais como JSF (Java Server
Faces), AJAX, Primefaces e Hibernate.
O livro inicia com uma viso geral da Arquitetura do Java
EE e caractersticas dos servidores de aplicao capazes de
suportar as tecnologias/aplicaes corporativas, para em
seguida se aprofundar no JSF e Hibernate.
ISBN 978-85-63630-56-8
9 788563 630568