Você está na página 1de 210

Java

Frameworks
e Aplicaes
Corporativas
Razer Anthom

A RNP Rede Nacional de Ensino


e Pesquisa qualificada como
uma Organizao Social (OS),
sendo ligada ao Ministrio da
Cincia, Tecnologia e Inovao
(MCTI)

responsvel

pelo

Programa Interministerial RNP,


que conta com a participao dos
ministrios da Educao (MEC), da
Sade (MS) e da Cultura (MinC).
Pioneira no acesso Internet no
Brasil, a RNP planeja e mantm a
rede Ip, a rede ptica nacional
acadmica de alto desempenho.
Com Pontos de Presena nas
27 unidades da federao, a rede
tem mais de 800 instituies
conectadas. So aproximadamente
3,5 milhes de usurios usufruindo
de uma infraestrutura de redes
avanadas para comunicao,
computao e experimentao,
que contribui para a integrao
entre o sistema de Cincia e
Tecnologia, Educao Superior,
Sade e Cultura.

JAVA
Frameworks
e Aplicaes
Corporativas
Razer Anthom

JAVA
Frameworks
e Aplicaes
Corporativas
Razer Anthom

Rio de Janeiro
Escola Superior de Redes
2016

Copyright 2016 Rede Nacional de Ensino e Pesquisa RNP


Rua Lauro Mller, 116 sala 1103
22290-906 Rio de Janeiro, RJ

Diretor Geral
Nelson Simes
Diretor de Servios e Solues
Jos Luiz Ribeiro Filho

Escola Superior de Redes


Coordenao
Leandro Marcos de Oliveira Guimares
Edio
Lincoln da Mata
Coordenador Acadmico da rea de Desenvolvimento de Sistemas
John Lemos Forman
Equipe ESR (em ordem alfabtica)
Adriana Pierro, Alynne Pereira, Celia Maciel, Derlina Miranda, Edson Kowask, Elimria
Barbosa, Evellyn Feitosa, Felipe Nascimento, Lourdes Soncin, Luciana Batista, Luiz Carlos
Lobato, Renato Duarte e Yve Marcial.
Capa, projeto visual e diagramao
Tecnodesign
Verso
1.0.0
Este material didtico foi elaborado com fins educacionais. Solicitamos que qualquer erro encontrado ou dvida com relao ao material ou seu uso seja enviado para a equipe de elaborao de
contedo da Escola Superior de Redes, no e-mail info@esr.rnp.br. A Rede Nacional de Ensino e
Pesquisa e os autores no assumem qualquer responsabilidade por eventuais danos ou perdas, a
pessoas ou bens, originados do uso deste material.
As marcas registradas mencionadas neste material pertencem aos respectivos titulares.
Distribuio

Escola Superior de Redes

Rua Lauro Mller, 116 sala 1103


22290-906 Rio de Janeiro, RJ
http://esr.rnp.br
info@esr.rnp.br

Dados Internacionais de Catalogao na Publicao (CIP)


C385m
Anthom, Razer

Java - Frameworks e Aplicaes Corporativas / Razer Anthom. Rio de Janeiro: RNP/ESR,

2016

182 p. : il. ; 28 cm.

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

2. Java Server Faces Introduo


Injeo de Dependncia e Inverso de Controle17
XHTML e Managed Beans21
Aes23
Escopos25
Processamento de uma Requisio28
Process Events29
Restore View29
Apply Request Values30
Process Validations30
Update Model Values30
Invoke Application30
Render Response31
Ciclo de vida simplificado31
Navegao31

3. JSF Componentes visuais


Estrutura bsica33
Formulrios34
Binding e processamento36
Caixas de texto, rtulos e campos ocultos37
Caixas de texto37
Caixas de texto de mltiplas linhas38
Caixas de texto de senha39
Exemplo de caixas de texto40
Rtulos40
Campos ocultos41
Caixas de Seleo42
Exerccios47

4. JSF Componentes visuais


Botes e links59
Boto de Ao <h:commandButton>60
Link de ao: <h:commandLink>60
Boto <h:button>61

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

5. JSF Tratamento de dados e eventos


Pginas e templates77
Incluso de pginas77
Templates78
Conversores80
Converso de nmeros81
Converso de datas ou horas82
Armazenar um objeto em um MB em vez de uma string84
Mensagem de erro de converso87
Validadores88
Bean Validation90
Validador Personalizado91
Eventos92
ValueChangeEvent94
Atributo immediate96

6. JSF Internacionalizao, AJAX e Primefaces


Internacionalizao99
Arquivos de mensagens99
Managed Bean de internacionalizao100
XHTML com Internacionalizao101
AJAX102
Eventos102
Componentes104
Atualizao104
Mtodo Invocado105
Resumo105
Primefaces106
Layout <p:layout>107
DataTable <p:dataTable>111
Calendar <p:calendar>112
InputMask <p:inputMask>114
Editor <p:editor>115
PickList <p:pickList>116
Google Maps <p:gmap>117
Accordion Panel <p:accordionPanel>119
Menus <p:menu>119
Growl <p:growl>124

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

Conceitos e Ciclo de Vida133


Anotaes134
Atributos transientes139
Mtodo de acesso aos atributos139
Interfaces do Hibernate139
vi

8. Hibernate Associaes
Associaes143
Cascateamento143

9. Hibernate HQL e Criteria


HQL159
Joins164
Clusula SELECT166
Ordenao com Order By166
Clusulas Group By e Having167
Criteria167
Ordenao168
Restries168
Combinao de Restries: AND e OR170
Projees171
JSF e Hibernate171

10. Java EE
Java EE175
Objetos distribudos176
Transaes182
CMT183
BMT183
web Services184
SOAP185
REST188
SOA Arquitetura Orientada a Servios191

vii

viii

Escola Superior de Redes


A Escola Superior de Redes (ESR) a unidade da Rede Nacional de Ensino e Pesquisa (RNP)
responsvel pela disseminao do conhecimento em Tecnologias da Informao e Comunicao (TIC). A ESR nasce com a proposta de ser a formadora e disseminadora de competncias
em TIC para o corpo tcnico-administrativo das universidades federais, escolas tcnicas e
unidades federais de pesquisa. Sua misso fundamental realizar a capacitao tcnica do
corpo funcional das organizaes usurias da RNP, para o exerccio de competncias aplicveis ao uso eficaz e eficiente das TIC.
A ESR oferece dezenas de cursos distribudos nas reas temticas: Administrao e Projeto
de Redes, Administrao de Sistemas, Segurana, Mdias de Suporte Colaborao Digital e
Governana de TI.
A ESR tambm participa de diversos projetos de interesse pblico, como a elaborao e
execuo de planos de capacitao para formao de multiplicadores para projetos educacionais como: formao no uso da conferncia web para a Universidade Aberta do Brasil
(UAB), formao do suporte tcnico de laboratrios do Proinfo e criao de um conjunto de
cartilhas sobre redes sem fio para o programa Um Computador por Aluno (UCA).

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

As sesses de aprendizagem onde se do a apresentao dos contedos e a realizao das


atividades prticas tm formato presencial e essencialmente prtico, utilizando tcnicas de
estudo dirigido individual, trabalho em equipe e prticas orientadas para o contexto de atuao do futuro especialista que se pretende formar.
As sesses de aprendizagem desenvolvem-se em trs etapas, com predominncia de tempo
para as atividades prticas, conforme descrio a seguir:
Primeira etapa: : apresentao da teoria e esclarecimento de dvidas (de 60 a 90 minutos).
O instrutor apresenta, de maneira sinttica, os conceitos tericos correspondentes ao tema
da sesso de aprendizagem, com auxlio de slides em formato PowerPoint. O instrutor levanta
questes sobre o contedo dos slides em vez de apenas apresent-los, convidando a turma
reflexo e participao. Isso evita que as apresentaes sejam montonas e que o aluno se
coloque em posio de passividade, o que reduziria a aprendizagem.
Segunda etapa: atividades prticas de aprendizagem (de 120 a 150 minutos).
Esta etapa a essncia dos cursos da ESR. A maioria das atividades dos cursos assncrona e
realizada em duplas de alunos, que acompanham o ritmo do roteiro de atividades proposto no
livro de apoio. Instrutor e monitor circulam entre as duplas para solucionar dvidas e oferecer
explicaes complementares.
Terceira etapa: : discusso das atividades realizadas (30 minutos).
O instrutor comenta cada atividade, apresentando uma das solues possveis para resolv-la,
devendo ater-se quelas que geram maior dificuldade e polmica. Os alunos so convidados a
comentar as solues encontradas e o instrutor retoma tpicos que tenham gerado dvidas,
estimulando a participao dos alunos. O instrutor sempre estimula os alunos a encontrarem
solues alternativas s sugeridas por ele e pelos colegas e, caso existam, a coment-las.

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.

Convenes utilizadas neste livro


As seguintes convenes tipogrficas so usadas neste livro:
Itlico
Indica nomes de arquivos e referncias bibliogrficas relacionadas ao longo do texto.

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, JCP, EJB, JSF; Servidores de Aplicao; Conteiner;


Front Controller e MVC.

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-

caes web, componentes que respondem a requisies HTTP;


11 JSF (JavaServer Faces): framework baseado em Servlets usado para simplificar o
desenvolvimento de aplicaes web;
11 JPA (Java Persistence API): tecnologia de mapeamento objeto-relacional, usada para
criar componentes de persistncia;
11 EJB (Enterprise Java Beans): componentes de negcio que podem ser executados de
forma distribuda, portvel, baseados em transaes etc.;
11 Web Services: servios disponibilizados na internet, com invocao padronizada, que
podem ser acessados por qualquer componente de software.

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

Bean validation 1.1


JSR 349

Concurrent Utilities
JSR 236

Figura 1.1
Tecnologias Java EE.

O Java EE um conjunto de especificaes, mantido pela JCP (Java Community Process


http://www.jcp.org), nas quais todas as tecnologias so descritas. O JCP formado por especialistas, empresas e comunidade de desenvolvedores, e tem como objetivo padronizar a
tecnologia Java, criando as JSRs (Java Specification Requests) para definir a evoluo destas.
As tecnologias com foco em aplicaes corporativas (enterprise) no incio eram
conhecidas como J2EE, mas com a alterao de nomenclatura a partir da verso 1.5
do Java, passaram a se chamar Java EE.

Verses do Java EE:


11 J2EE 1.2 12/12/1999;
11 J2EE 1.3 24/9/2001;
11 J2EE 1.4 11/11/2003;
11 Java EE 5 11/5/2006;

JAVA Frameworks e Aplicaes Corporativas

11 Java EE 6 10/12/2009;

11 Atualmente: Java EE 7 5/4/2013.


A tabela 1.1 apresenta as tecnologias presentes na especificao Java EE 71.
Web Application Technologies
Java API for WebSocket: protocolo que permite comunicao full-duplex entre dois
pontos sobre TCP.
Java API for JSON Processing: API para intercmbio de dados com base na JavaScript
Object Notation: jSON
Java Servlet: Invocao de classes via HTTP
JavaServer Faces (JSF): Framework para desenvolvimendo de aplicaes web

Web Application Technologies


JavaServer Pages (JSP): tecnologia para inserir scriptlets Java em pginas HTML
Expression Language (EL): linguagem de expresses para manipulao de dados em
JSP e JSF
Standard Tag Library for JavaServer Pages (JSTL): biblioteca de tags para uso com JSP
Enterprise Application Technologies
Batch Applications for the Java Platform: tarefas que podem ser executadas sem a
interao do usurio
Concurrency Utilities for Java EE: API que prov funcionalidade assncrona para
componentes Java EE
Contexts and Dependency Injection for Java: servios padro de gesto de contexto e
injeo de dependncias
Dependency Injection for Java: conjunto de anotaes para classes injetveis
Bean Validation: modelo para validao de dados dentro de beans
Enterprise JavaBeans (EJB): componentes gerenciados e distribudos
Interceptors: interceptao de chamadas a mtodos de EJBs
Java EE Connector Architecture: API para integrao de sistemas
Java Persistence API (JPA): soluo padro do Java para persistncia
Common Annotations for the Java Platform: anotaes para programao
declarativa em Java
Java Message Service API: API de mensagens, para comunicao entre componentes
Java Transaction API (JTA): soluo Java para controle e delimitao de transaes
JavaMail API: API para envio de e-mails
Web Services Technologies
Java API for RESTful web Services (JAX-RS): API para web Services usando REST
Implementing Enterprise web Services: modelo programtico e em tempo de execuo
para implantao e busca de web Services
Java API for XML-Based web Services (JAX-WS): suporte para web Services usando
a API JAXB
Web Services Metadata for the Java Platform: anotaes de metadados de web Services
para fcil definio
Java API for XML-based RPC (JAX-RPC) (Opcional): API de construo de web Services
usando RPC

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

Management and Security Technologies


Java Authorization Contract for Containers (JACC): define um contrato entre aplicao
Java EE e servidor de polticas de autorizao
Java EE Application Deployment (Opcional): gesto dos recursos de uma aplicao entre
implantaes e atualizaes da aplicao
J2EE Management: mapeamento de padres de gerenciamento para Java, como o SNMP
Debugging Support for Other Languages: ferramentas padronizadas para relacionamento do bytecode com outras linguagens que no Java
Java EE-related Specs in Java SE
Java Architecture for XML Binding (JAXB): arquitetura para ligar um XML a uma representao em programa Java
Java API for XML Processing (JAXP): processamento de arquivos XML

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.

Mais frente so apresentados alguns modelos de programao em uso atualmente, bem


como servidores de aplicaes corporativas, indispensveis para executar aplicaes Java EE
(p.e. Glassfish ou JBoss). importante saber que existem servidores web, como o Tomcat,
que tambm suportam aplicaes web, mas no aplicaes Java EE.
O Java EE demanda um servidor web para executar as aplicaes.

11 Aplicaes somente web:


22 Servidor WEB;
22 Conteiner Servlet.
33 Servlet, JSP, JSTL, JSF.
JAVA Frameworks e Aplicaes Corporativas

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.

Antigamente XML Hell:

11 Muitos arquivos XML para serem configurados (deployment descriptors).


Hoje:
11 XML opcional na maioria dos casos;
11 Usam-se anotaes (@) para configurar os componentes, configurando-os em tempo
de deploy e em tempo de execuo.
Vantagem:
11 A configurao est prxima do componente a que se refere.
Vejamos a seguir alguns componentes e frameworks utilizados em Java EE e que sero detalhados ao longo deste curso.

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:

11 Distribudos: que podem ser executados em containers ou servidores diferentes,


fazendo parte do mesmo sistema;
11 Reusveis: podemos aproveit-los em outros projetos ou subsistemas do mesmo
projeto;
11 Produtividade: seu desenvolvimento fcil, rpido e componentizado, sendo que os
servidores fazem toda a gesto de seu ciclo de vida.
Atualmente, a verso oficial do EJB a 3.2, especificada pela JSR 345. Entre suas contribuies
temos o maior uso de anotaes para configuraes de componentes e seus comportamentos
Cloud computing

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:

11 Stateless Session Beans (@Stateless): componente negocial que no guarda o


estado de seus atributos entre uma requisio e outra;
11 Stateful Session Beans (@Stateful): componente negocial que guarda o estado de
seus atributos entre requisies;
11 Singleton Session Beans (@Singleton): componente negocial que possui a restrio
de somente haver uma instncia na aplicao (padro de projeto singleton);
11 Message-Driven Beans (@MessageDriven): componente baseado em mensagens,
onde o processamento feito de forma assncrona.
Captulo 1 - Introduo

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.

11 Funciona via requisio e resposta:


22 O processamento de uma requisio se d atravs de um ciclo de vida bem definido;
22 Resolve o problema de no manuteno de estado de componentes.
Duas tecnologias so fundamentais para o JSF:
11 Facelets
22 Tecnologia de templates para telas em JSF (), sem usar o tradicional JSP;
22 Integrao com EL Expression Language ( #{bean.propriedade} );
22 Arquivos XHTML.
11 Managed Beans
22 classes Java (POJOs);
22 Beans gerenciados (ciclo de vida) pelo framework (CDI);
22 Componentes que armazenam informaes e executam aes.
Outra grande vantagem em se usar JSF a integrao com bibliotecas de componentes
ricos, como o PrimeFaces, que traz uma vasta coleo de componentes baseados em jQuery
(http://www.jquery.org) e totalmente integrados com o JSF.
Requisitos JSF.

JAVA Frameworks e Aplicaes Corporativas

11 Executa sobre um Conteiner:


22 GlassFish 4.0 com JDK 7;
22 GlassFish 3.1+ com JDK 6;
22 Tomcat 7 (necessrio adicionar CDI);
Pode integrar bibliotecas de componentes ricos.
11 PrimeFaces http://www.primefaces.org.

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 Container

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

11 Implementao de Referncia: https://glassfish.java.net/


11 Servidor de aplicao: implementa toda a especificao Java EE.
11 Para inici-lo em linha de comando:

22 Executar:./asadmin start-domain --verbose domain1


11 Estar disponvel em: http://localhost:8080
A figura 1.3 apresenta o painel administrativo do GlassFish, que possui diversas configuraes,
visto ser uma implementao completa da especificao Java EE.

Captulo 1 - Introduo

22 Ir at: <Diretrio do GLASSFISH>/bin

Figura 1.3
Painel Administrativo
do GlassFish.

Para iniciar o GlassFish em linha de comando, com o prompt ou shell, demos ir at o


diretrio de instalao, subdiretrio bin, e executar o seguinte comando:
./asadmin start-domain --verbose domain1

O servidor estar disponvel no navegador no endereo: http://localhost:8080. Ao ser requisitada,


uma tela inicial ser apresentada com um link para o Administration Console (o painel administrativo do GlassFish, como mostrado na figura 1.3. No menu Aplicaes, podem ser visualizadas
todas as aplicaes instaladas ou implantadas que esto sendo servidas pelo domnio. Um boto
Implantar disponibilizado e consegue-se fazer a implantao (deploy) de uma nova aplicao
por essa opo, mesmo no tendo acesso ao diretrio de instalao do servidor.
Para implantao de uma nova aplicao, necessrio seu arquivo de empacotamento com
extenso .war (de web ARchive). Para acessar a aplicao recm-instalada, usamos o endereo
http://localhost:8080/HelloWorld, onde HelloWorld o nome do arquivo .war instalado.
Outros servidores compatveis com Java EE so:

11 Apache Tomcat Servlet Container

JAVA Frameworks e Aplicaes Corporativas

22 8.0.x (Java 7) Servlet 3.1 / JSP 2.3 / EL 3.0;


22 7.0.x (Java 6) Servlet 3.0 / JSP 2.2 / EL 2.2.
11 Oracle Glassfish Application Server (web e EJB)
22 3.1.x Java EE 6.
11 RedHat Jboss
22 Enterprise 6.2 Java EE 6.

Padres de Projeto Front Controller e MVC


Front Controller um padro de projeto usado em aplicaes web, usado para fornecer um
ponto central de entrada para todas as requisies que so feitas para a aplicao.
Uma grande vantagem no seu uso o controle centralizado de navegao, acesso, permisses,
log etc., fazendo com que configuraes externas ou mesmo a programao no fique
diluda ao longo de muitas pginas, tornando a manuteno do software mais produtiva.

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:

11 Sun/Oracle Mojarra 2.2.6;


11 Apache MyFaces 2.2.2;
11 Oracle ADF Faces.
As ferramentas IDE mais comumente utilizadas (Netbeans e Eclipse) j possuem suporte ao
JSF atravs de plug-ins. O Netbeans j traz nativamente essa integrao, enquanto que no
Eclipse deve-se instal-lo. A documentao do Java EE e do JSF muito ampla, mas est toda

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.

Interao entre um cliente


e uma aplicao Web

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

JAVA Frameworks e Aplicaes Corporativas

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

Em relao s aplicaes tradicionais usando Servlets/JSP, percebe-se que o JSP possui


muito mais funcionalidades embutidas, que tornam o desenvolvimento mais eficiente, como
por exemplo:
11 Recuperao de dados da requisio: enquanto em uma aplicao tradicional deve-se
efetuar vrias chamadas a request.getParameter(), em JSF os dados so automaticamente atribudos a atributos de um Managed Bean;
11 Converso automtica de dados da requisio: a chamada a request.getParameter()
sempre retorna uma String, que deve ser convertida para o tipo correto dentro da aplicao. Em JSF essa converso feita de forma automtica;
11 Navegao implcita: em uma aplicao tradicional deve-se efetuar forward ou redirect
para se navegar entre JSPs e Servlets. Em JSF, usando-se navegao implcita. O retorno
de um mtodo do Managed Bean j indica para aonde a aplicao deve ser redirecionada,
sem que nenhum cdigo seja necessrio.
Aplicao Tradicional x JSF

11 JSF possui muitas funcionalidades implcitas, por exemplo:


22 Recuperao de dados da requisio;
22 Converso automtica de dados da requisio;

Os componentes arquiteturais de uma aplicao web usando JSF so:


11 FacesServlet: servlet principal, que recebe todas as requisies do JSF. Padro
FrontController;
11 Renderer: componente responsvel por traduzir uma entrada de componente em
representao interna e tambm por exibir um componente;
11 XHTML: arquivo que descreve como as pginas sero renderizadas, usando Facelets;
11 Conversor: componentes usados para converter elementos de String para Objeto (na

Captulo 1 - Introduo

22 Navegao implcita.

requisio) e de Objeto para String (na resposta);


11

11 Validador: componentes usados para validar se um componente possui um valor vlido;

11 Managed Bean: bean que executa a lgica do negcio e controla a navegao


entre pginas;
11 Modelo: beans de representao de dados. Exemplo: entidades mapeadas usando
ferramentas para persistncia de dados.
A figura 1.6 apresenta a estrutura de diretrios de uma aplicao JSF (encapsulada dentro de
um arquivo .war).
app
Pginas HTML, XHTML, CSS, JS,
pode-se criar subdiretrios

Pginas HTML, XHTML, CSS, JS


WEB-INF
web.xml

Congurao app web

faces-cong.xml

Congurao JSF, vazio no uso de Anotaes

beans.xml

Ativao do CDI, arquivo vazio

classes

Diretrio contendo Servlets,


classes, beans, DAOs, etc

Arquivos.class
lib

Diretrio contendo os JARS


das bibliotecas
Bibliotecas

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;

JAVA Frameworks e Aplicaes Corporativas

4. Pressionar Prximo;

12

5. Alterar o nome do projeto para TesteJSF;


6. Pressionar Prximo;
7. Escolher o Servidor GlassFish Server;
8. Pressionar Prximo;
9. Escolher o Framework JavaServer Faces;
10. Pressionar Finalizar;
11. Executar o Projeto.

Figura 1.7
Estrutura de uma
Aplicao JSF.

Comparao Servlets e JSF


A seguir, sero apresentadas duas implementaes de um sistema simples, que recebe
um nmero e um texto entrados pelo usurio para em seguida apresentar o quadrado do
nmero e o texto em caixa-alta (letras maisculas). O objetivo comparar as duas principais
tecnologias usadas no desenvolvimento de sistemas: servlets/JSP e 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

<c:out value=${numeroRequerido} />

13

<td><input type=submit value=Processar /></td>


<td></td>
</tr>
</table>
</form>

A seguir o cdigo Serlvet Processar.java do sistema.


@WebServlet(name = Processar, urlPatterns = {/Processar})
public class Processar extends HttpServlet {
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String texto = request.getParameter(texto);
String numero = request.getParameter(numero);
if (texto == null || .equals(texto.trim())) {
request.setAttribute(textoRequerido,
Texto obrigatrio);
RequestDispatcher rd = getServletContext().
getRequestDispatcher(/index.jsp);
rd.forward(request, response);
}
if (numero == null || .equals(numero.trim())) {
request.setAttribute(numeroRequerido,
Nmero obrigatrio);
RequestDispatcher rd = getServletContext().
getRequestDispatcher(/index.jsp);
rd.forward(request, response);
}
int nr = 0;
try {
nr = Integer.parseInt(numero);
}
catch (NumberFormatException e) {
request.setAttribute(numeroRequerido, Nmero invlido);
RequestDispatcher rd = getServletContext().
JAVA Frameworks e Aplicaes Corporativas

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

risco de propagao de erros em tarefas bsicas (como converso e validao) e esforo de

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.

Escopos; Requisies; Componentes; Navegao.

conceitos

Injeo de Dependncia; Inverso de Controle; CDI; Managed Beans; POJO; Aes;

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.

Injeo de Dependncia e Inverso de Controle


O modelo de programao usado em aplicaes Java EE evoluiu muito desde seu lanamento.
Hoje em dia se faz muito pouco uso de arquivos XML para configurao de aplicaes e
descritores de implantao. O advento das anotaes (como padro no Java 5) trouxe uma
grande flexibilidade no desenvolvimento, bem como uma clareza maior na configurao de

Captulo 2 - Java Server Faces Introduo

objetivos

Java Server Faces Introduo

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;

public void operacao() {


b = new ComponenteB();
c = new ComponenteC();
// efetua operao que depende de B e C
b.algumaCoisa();
c.outraCoisa();
}
}

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

mente como criar (ou obter) B e C, com todas as suas particularidades.

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.

Inverso de Controle IoC:


11 Princpio de Hollywood: No nos ligue, ns ligaremos.;
11 Envolve dependncia de componentes;
11 Ocorre em tempo de execuo;
11 Em vez de o objeto dependente conseguir as referncias, encontrar um meio de
preench-las de forma desacoplada;
11 Componente no precisa saber detalhes de como criar as dependncias.
A inverso de controle pode acontecer de vrias formas, conforme veremos a seguir.
A Procura por Dependncia, onde o componente implementa uma maneira genrica de
se obter as dependncias, pode ser de dois tipos: Dependency Pull (DP) e Contextualized
Dependency Lookup (CDL).
Dependency Pull (DP)

Onde as dependncias so obtidas atravs de um registro central, como um repositrio no


servidor, por exemplo:
public class Teste {

public void testar() {


Registry registro = getRegistry();
InterfaceDependencia I =
registro.getInstance(dependencia);
}
}

Contextualized Dependency Lookup (CDL)


O componente implementa uma interface especfica, indicando ao continer que uma
dependncia deve ser obtida atravs da chamada de um mtodo especfico (da interface)
por exemplo:
public interface ManagedComponent {
public void performLookup(Conteiner conteiner);
}
public class Teste implements ManagedComponent {
private Dependencia dep;
this.dep = (Dependencia)conteiner.
getDependency(minhaDependencia);
}
}

J a Injeo de Dependncias, onde o componente no se preocupa com as dependncias,


essas precisam ser injetadas de alguma forma. Se feita de forma correta, conseguem-se
mdulos plugveis e extensveis na aplicao. No exemplo a seguir os componentes b e c
so usados sem se preocupar com sua criao ou obteno.

Captulo 2 - Java Server Faces Introduo

public void performLookup(Conteiner conteiner) {

19

public class ComponenteA {


private ComponenteB b;
private ComponenteC c;

public void operacao() {


// efetua operao que depende de B e C
// B e C j existem
b.algumaCoisa();
c.outraCoisa();
}
}

Trs tipos de Injeo de Dependncia (Dependency Injection DI):

11 Via Construtor: passa-se os recursos como parmetro no construtor da classe que


necessita deles (so injetadas pelo continer);
11 Via atributo: atravs do mtodo set de algum atributo da classe, assim o conteiner
pode injetar as dependncias;
11 Via Interface: o componente implementa uma interface indicando que o continer
deve injetar uma dependncia.
At a verso Java EE 5 era possvel, de forma automtica, se fazer injeo de recursos em
uma aplicao: eJBs, DataSources, Persistence Units etc. A partir da verso Java EE 6, foi
introduzido o CDI (Contexts and Dependency Injection), que uma especificao para
controle de injeo de dependncias de forma geral (no s de recursos), de forma padronizada. O CDI definido pela JSR 299.
CDI Injeo de Dependncia e Contextos:

11 Contextos: a capacidade de ligar um componente a um ciclo de vida, bem como a


comportamentos de estado nesse ciclo de vida;
11 Injeo de Dependncias: capacidade de injetar instncias de componentes, tipadas,
de forma padronizada.
O CDI trata injeo de dependncias de forma geral, onde qualquer componente pode ser
injetado. O uso da anotao @Inject facilita a legibilidade do cdigo e a sua flexibilidade,
deixando decises de o que deve ser injetado para o continer.

JAVA Frameworks e Aplicaes Corporativas

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 e Managed Beans


Os Beans Gerenciados (do ingls: Managed Beans: MB) so componentes fundamentais
dentro da arquitetura do JSF. So eles que fornecem dados que sero exibidos nas pginas,
recebem os dados enviados em requisies e executam tarefas referentes a aes do usurio.
Os MBs so classes Java que no herdam nem implementam nenhum tipo de biblioteca, portanto conhecidas como POJO (Plain-Old Java Objects). Para definir uma classe como um MB,
deve-se anot-la com @Named (pacote javax.inject.Named), indicando que estar disponvel
no XHTML atravs de expresses EL (Expression Language).
O ciclo de vida desses objetos controlado pelo Servidor/Framework e esse mais um
aspectos que torna atrativo o uso do JSF, pois no deixa a responsabilidade de criao e
remoo dos objetos para o programador.
import javax.inject.Named;
@Named
@RequestScoped
public class ExemploBean {
private String texto;
public String getTexto() {
return texto;

XHTML

}
public void setTexto(String texto) {
this.texto = texto;
}
}

Para disponibilizar os dados de um MB na tela e tambm para interagir com o usurio,


escreve-se um arquivo XHTML. Esse arquivo possui tags HTML e tambm tags do JSF. Tudo
que estiver ligado ao JSF ser processado dentro do ciclo de vida da requisio.
Esse processo de padronizao do XHTML prov a exibio de uma pginawebnesse
formato por diversos dispositivos (televiso,palm,celular etc.), alm da melhoraria daacessibilidadedo contedo. A principal diferena entre XHTML e HTML que o primeiro XML
vlido, enquanto o segundo possui sintaxe prpria. Ambos possuem sentido semntico.
A seguir temos o XHTML usado para apresentar os dados do MB anterior.
<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>
</html>

Captulo 2 - Java Server Faces Introduo

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

JSF obtm os dados da


requisio e preenche o MB

JSF preenche os dados do MB


na representao do XHTML

JSF envia a tela


para o browser
XHTML
Como exerccio, podemos criar uma nova aplicao de nome ExemploJSF1 (no esquecer de
adicionar o Framework JavaServer Faces no projeto). Os passos para a criao do projeto so:
11 Abrir o Netbeans;
11 Menu ARQUIVO | NOVO PROJETO;
11 Escolher Categoria JAVA WEB;
JAVA Frameworks e Aplicaes Corporativas

11 Escolher Projetos APLICAO WEB;

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.

Para criar um Managed Bean, deve-se:


11 Clicar com o boto direito do mouse sobre o Projeto;
11 Escolher Menu NOVO | BEAN GERENCIADOJSF;
11 Escolher o NOME DA CLASSE;
11 Escolher o NOME DO PACOTE;
11 Clicar em FINALIZAR.
Neste exerccio, deve-se criar um Managed Bean (Bean Gerenciado JSF) de nome ExemploBean, com o cdigo a seguir.
import javax.inject.Named;
@Named
@RequestScoped
public class ExemploBean {
private String texto;
public String getTexto() {
return texto;
}
public void setTexto(String texto) {
this.texto = texto;
}
}

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>

Aps, clicamos em EXECUTAR e testamos a aplicao.

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

Captulo 2 - Java Server Faces Introduo

</html>

requisio;
23

11 Retorno String: o valor da String (concatenado com.xhtml) o nome da prxima pgina a


ser renderizada.
No exemplo a seguir, o MB possui um mtodo chamado caixaAlta(), que retorna void, indicando que a prxima pgina a ser mostrada a mesma que originou a requisio.
import javax.inject.Named;
@Named
@RequestScoped
public class ExemploBean {
private String texto;
public String getTexto() {
return texto;
}
public void setTexto(String texto) {
this.texto = texto;
}

// setter/getter de texto
public void caixaAlta() {
this.texto = this.texto.toUpperCase();
}

O XHTML necessrio para invocar o mtodo caixaAlta() do MB est mostrado no cdigo a


seguir. Perceba que o atributo action contm o nome do mtodo a ser invocado. Esse novo
ciclo de vida pode ser visto na figura 2.3. Antes de a ao ser chamada, todos os dados do
MB provenientes da requisio (digitados na tela pelo cliente) so preenchidos e a prxima
tela s processada aps a execuo da ao.
<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
action=#{exemploBean.caixaAlta} />
JAVA Frameworks e Aplicaes Corporativas

</h:form>

24

</h:body>
</html>

Cliente / Browser

Servidor / JSF

XHTML

JSF obtm representao


interna do XHTML

Usurio digita
Dados

Usurio pressiona
Alterar

JSF obtm
instncia do MB

JSF obtm os dados da


requisio e preenche o MB

Executa o mtodo do MB que


foi invocado no formulrio

JSF preenche os dados do MB


na representao do XHTML

JSF envia a tela


para o browser
XHTML

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;

Captulo 2 - Java Server Faces Introduo

Figura 2.3
Ciclo de Vida
Simples com Invocao de Ao.

11 Conversacional: @ConversacionalScoped;
25

Escopo do JSF: importados de javax.faces.view.ViewScoped;

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

JAVA Frameworks e Aplicaes Corporativas

servidores podem armazenar dados de sesso em arquivos. O cdigo a seguir mostra um

26

exemplo de MB com escopo da sesso.


import javax.enterprise.context.SessionScoped;
@Named
@SessionScoped
public class TesteMB implements Serializable {
}

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.

Captulo 2 - Java Server Faces Introduo

@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.

Processamento de uma Requisio


Quando uma requisio feita, recebida pelo FacesServlet. Esse responsvel pelo processamento completo dessa requisio, desde seu recebimento at que a nova tela possa
JAVA Frameworks e Aplicaes Corporativas

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,

Captulo 2 - Java Server Faces Introduo

recuperada e reconstruda. Conversores, Validades ou Renderizadores customizados, quando

somente de leitura etc.).


29

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

Apply Request Values


Nesta fase, com a rvore de componentes recuperada (ou criada), todos os componentes
so varridos e seus dados decodificados (obtidos da requisio). Os valores obtidos so
armazenados localmente, no prprio componente.
Se foram enviadas aes, como cliques de links ou botes, essas so identificadas e enfileiradas para serem tratadas na fase Invoke Application.

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.

JAVA Frameworks e Aplicaes Corporativas

Update Model Values


Nesta fase, todo os dados decodificados, convertidos e validados so armazenados em
propriedades do MB. Essa fase s ocorre depois da validao, o que garante que seus dados
esto validados, em nvel de tela.

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-

tante para o cliente.

Ciclo de vida simplificado


Os ciclos de vida simplificados apresentados anteriormente so uma maneira de entender,
de forma construtiva, o ciclo de vida de uma aplicao JSF. Mesmo que o formulrio
(<h:commandButton>, por exemplo) no contenha a indicao de execuo de um mtodo do

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>

e <h:link>. Para se definir o outcome nos primeiros (<h:commandButton> e <h:commandLink>),


usa-se o atributo action. Nos segundos (<h:button> e <h:link>),
o atributo outcome.

Componentes visuais:

22 Outcome definido no atributo action.


11 De redirecionamento: <h:button>, <h:link>
22 Outcome definido no atributo outcome.
11 Por exemplo:
<h:form>
<h:commandButton value=Pgina Teste
action=teste/>
</h:form>

Captulo 2 - Java Server Faces Introduo

11 De ao: <h:commandButton>, <h:commandLink>

31

Ao ser clicado o componente <h:commandButton>, o usurio levado para a pgina teste.xhtml.


Se um outcome inicia com /, ento o caminho da pgina destino inicia na raiz da aplicao,
caso contrrio ser relativo ao diretrio da pgina atual.
O retorno de mtodos de um Managed Bean, como mostrado anteriormente, tambm usa o
mesmo princpio, retornando um outcome. As regras de navegao podem ser definidas no
arquivo de configurao faces-config.xml, mas geralmente usa-se a navegao implcita.
A navegao implcita nada mais do que o retorno do mtodo do MB ser considerado o
nome da pgina, sem o.xhtml. Se iniciar com /, ser usado o caminho absoluto da raiz da
aplicao, se no, ser o caminho relativo pgina atual. Se o mtodo retonar um outcome
contendo faces-redirect=true, ser feito um redirect em vez de um forward.
Redirect x Forward:
11 Por default, o JSF efetua forward para redirecionamento;
11 Para garantir o uso de redirect, deve-se indicar no outcome com:
?faces-redirect=true.
11 Por exemplo:
import javax.inject.Named;
@Named
@RequestScoped
public class ExemploBean {
public String testar() {
//...
return segundaPagina?faces-redirect=true
}

JAVA Frameworks e Aplicaes Corporativas

32

3
Conhecer os componentes visuais para confeco de telas em JSF, usando formulrios
e manipulao de dados para apresentao.

conceitos

Componentes visuais; Propriedade xmlns; Namespaces; Binding; @PostConstruct;


@PreDestroy; Opes Estticas x Dinmicas e seleo nica x mltipla.

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:

11 Core: representado pela URI http://xmlns.jcp.org/jsf/core


11 HTML: representado pela URI http://xmlns.jcp.org/jsf/html
11 Facelets: representado pela URI http://xmlns.jcp.org/jsf/facelets
Estas tags so includas como atributos de namespace (espao de nomes, para que no haja
ambiguidade) na tag HTML, conforme o exemplo a seguir:
<?xml version=1.0 encoding=UTF-8 ?>
<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd >
<html xmlns=http://www.w3.org/1999/xhtml
xmlns:ui=http://java.sun.com/jsf/facelets
xmlns:h=http://java.sun.com/jsf/html
xmlns:f=http://java.sun.com/jsf/core>

Captulo 3 - JSF Componentes visuais

objetivos

JSF Componentes visuais

33

<h:head>
<title>JSF</title>
</h:head>
<h:body>
<h:outputText value=Estrutura bsica de uma tela JSF />
</h:body>
</html>

Nesse exemplo, os atributos xmlns: representam:


11 xmlns:ui=http://java.sun.com/jsf/facelets: indica que todas as tags com prefixo ui
sero tags do facelets;
11 xmlns:h=http://java.sun.com/jsf/html: indica que todas as tags com prefixo h sero
tags html;
11 xmlns:f=http://java.sun.com/jsf/core: indica que todas as tags com prefixo f sero
tags do ncleo jsf (core).
As tags so prefixadas, como no exemplo:
<h:outputText value=Estrutura ... />

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 As bibliotecas so importadas pela propriedade xmlns;


11 xmlns define os namespaces;
11 Namespaces so usados para evitar conflitos de nomes nos elementos;
11 Define prefixos para serem usados nos elementos.
Dentro de <html> temos:
11 H:HEAD
JAVA Frameworks e Aplicaes Corporativas

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.

Entre os elementos possveis destacamos:

11 Caixas de Texto e Rtulos;


11 Campos Ocultos;
11 Caixas de Seleo;
11 Botes e Links;
11 Textos e Imagens;
11 Componentes de Organizao;
11 Tabelas;
11 Mensagens;
11 JavaScript e CSS;
11 Repetio.
A seguir, mostrado um cdigo XHTML para apresentar um formulrio, esse mesmo formulrio em HTML e, finalmente, como o formulrio apresentado no navegador (figura 3.1).
Cdigo em JSF
<?xml version=1.0 encoding=UTF-8 ?>
<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd>
<html xmlns=http://www.w3.org/1999/xhtml
xmlns:h=http://xmlns.jcp.org/jsf/html
xmlns:ui=http://xmlns.jcp.org/jsf/facelets>
<h:head>
<title>Exemplo</title>
</h:head>
<h:body>

<h:form>
<h:outputLabel value=Nome: for=nome />
<h:inputText value=#{exemploMB.nome} id=nome />
<h:commandButton value=Enviar />

</h:form>

</h:body>

Captulo 3 - JSF Componentes visuais

</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} />

nesse caso, o componente preenchido pela propriedade nome (String) de pessoaMB


(executa getNome()) e, quando o formulrio submetido, seu contedo inserido em
nome (executa setNome());
11 Componente: faz-se com que o elemento visual tenha um componente correspondente (da API Facelets) com todos os atributos e mtodos, j que faz parte da rvore
de componentes da viso construda. Usa-se o atributo binding:
<h:inputText binding=#{pessoaMB.inputNome} />

JAVA Frameworks e Aplicaes Corporativas

nesse caso, o MB precisa de uma propriedade inputNome do tipo HtmlInputText (que

36

um componente da API do JSF).


Processamento:
11 Quando mostra a tela, chama getNome() para preencher o inputText na fase de
Render Response;
11 Quando efetua a submisso, obtm o dado do inputText e executa o setNome() na
fase de Update Model Values.

Caixas de texto, rtulos e campos ocultos


As caixas de texto so usadas para entrada de dados digitados pelo usurio.
So de trs tipos:

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

Valor do componente, pode ligar a um MB com EL ( #{...} )

readonly

true/false somente leitura

disabled

true/false elemento desabilitado (no recebe foco)

required

true/false se o elemento requerido

requiredMessage

Texto mensagem se no preenchido

maxlength

Nmero quantidade mxima de caracteres

size

Tamanho em caracteres do componente

title

tool tip text

style

Estilos CSS aplicados ao componente

styleClass

Lista de classes de CSS aplicados ao componente (renderizados


como atributo class)

Eventos do DOM

onfocus, onclick etc.

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 />

Captulo 3 - JSF Componentes visuais

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 />

Caixas de texto de mltiplas linhas

Figura 3.2
Apresentao do
<h:inputText />
em JSF, renderizado
em HTML e no
navegador.

A tabela 3.2 mostra alguns atributos do <h:inputTextarea />.


Atributo

Descrio

id

Identificador do componente

cols

Nmero de linhas

rows

Nmero de colunas

value

Valor do componente, pode ligar a um MB com EL ( #{...} )

readonly

true/false somente leitura

disabled

true/false elemento desabilitado (no recebe foco)

required

true/false se o elemento requerido

requiredMessage

texto mensagem se no preenchido

maxlength

Nmero quantidade mxima de caracteres

title

tool tip text

style

Estilos CSS aplicados ao componente

styleClass

Lista de classes de CSS aplicados ao componente (renderizados


como atributo class)

Eventos do DOM

onfocus, onclick etc.

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

JAVA Frameworks e Aplicaes Corporativas

<h:outputLabel value=Descrio: for=descricao />

38

<h:inputTextarea value=#{exemploMB.descricao} id=descricao />

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.

Caixas de texto de senha


A tabela 3.3 mostra alguns atributos do <h:inputSecret />.
Atributo

Descrio

id

Identificador do componente

redisplay

(true/false) por default no recarregado o valor do bean. Setando para true, o valor
trazido

value

Valor do componente, pode ligar a um MB com EL ( #{...} )

readonly

true/false somente leitura

disabled

true/false elemento desabilitado (no recebe foco)

required

true/false se o elemento requerido

requiredMessage

Texto mensagem se no preenchido

maxlength

Nmero quantidade mxima de caracteres

size

Tamanho em caracteres do componente

title

tool tip text

style

Estilos CSS aplicados ao componente

styleClass

Lista de classes de CSS aplicados ao componente (renderizados como atributo class)

Eventos do DOM

onfocus, onclick etc.

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.

Captulo 3 - JSF Componentes visuais

<input id=j_idt5:senha type=password name=j_idt5:senha value= />

39

Exemplo de caixas de texto


Os trechos de cdigo a seguir mostram um exemplo de projeto contendo os trs tipos de
caixa de entrada.
<h:form>
<h:panelGrid columns=2>
<h:outputLabel value=Nome: for=nome />
<h:inputText value=#{exemploMB.nome} id=nome />
<h:outputLabel value=Senha: for=senha />
<h:inputSecret value=#{exemploMB.senha}
id=senha />
<h:outputLabel value=Descrio:
for=descricao />
<h:inputTextarea value=#{exemploMB.descricao}
id=descricao />
<h:commandButton value=Enviar />
</h:panelGrid>
</h:form>

@Named(value = exemploMB)
@RequestScoped
public class ExemploMB {
private String nome;
private String senha;
private String descricao;
// setters/getters
}

A seguir, o formulrio renderizado.

JAVA Frameworks e Aplicaes Corporativas

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

Estilos CSS aplicados ao componente

styleClass

Lista de classes de CSS aplicados ao componente (renderizados como atributo class)

Eventos do DOM

onfocus, onclick etc.

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 />

Captulo 3 - JSF Componentes visuais

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.

JAVA Frameworks e Aplicaes Corporativas

A figura 3.7 mostra um exemplo com todas as caixas de seleo renderizadas.

42

Figura 3.7
Todas as Caixas
de Seleo.

Caixa de Seleo: checkbox nico


O componente <h:selectBooleanCheckbox> renderiza um checkbox para seleo do tipo SIM/
NO, que poder ser vinculada a uma propriedade booleana de um Managed Bean.
Ele renderiza um componente em HTML <input type=checkbox />. A tabela 3.6 apresenta
seus principais atributos.

Atributo

Descrio

id

identificador do componente

value

(true/false) valor do componente, pode ligar a uma propriedade booleana de um MB

readonly

true/false somente leitura

Disabled

true/false elemento desabilitado (no recebe foco)

title

tool tip text

style

estilos CSS aplicados ao componente

styleClass

lista de classes de CSS aplicados ao componente (renderizados como atributo class)

Eventos do DOM

onfocus, onclick etc.

Tabela 3.6
Atributos de
<h:selectBoolean
Checkbox>.

O cdigo a seguir mostra como um <h:selectBooleanCheckbox> escrito em JSF, como


renderizado em HTML e como apresentado no navegador.
Cdigo em JSF
<h:selectBooleanCheckbox id=teste value=true />
<h:outputLabel value=Teste for=teste />

Renderizado em HTML
<label for=j_idt5:teste>Teste</label>
<input id=j_idt5:teste type=checkbox name=j_idt5:teste checked=checked />

Os cdigos a seguir mostram o XHTML exemplo de uso e o Managed Bean usado.


<h:form>
<h:panelGrid columns=2>
<h:outputLabel value=Fumante for=fumante />
<h:selectBooleanCheckbox id=fumante
value=#{exemploMB.fumante} />
<h:outputLabel value=Cardaco for=cardiaco />
<h:selectBooleanCheckbox id=cardiaco
value=#{exemploMB.cardiaco} />
<h:outputLabel value=Teste for=teste />
<h:selectBooleanCheckbox id=teste value=true />
<h:commandButton value=Enviar />
</h:panelGrid>
</h:form>
@Named(value = exemploMB)
@RequestScoped
public class ExemploMB {
private boolean fumante;
private boolean cardiaco;
// setters/getters
}

Captulo 3 - JSF Componentes visuais

Figura 3.8
<h:selectBoolean
Checkbox> em
JSF, renderizado
em HTML e no
navegador.

43

Caixa de Seleo: comboBox de Seleo nica


O componente <h:selectOneMenu> renderiza um ComboBox contendo uma lista de opes
para seleo, que pode ser vinculada a uma propriedade de um Managed Bean. Ele renderiza um componente <select> do HTML com atributo size com valor 1 e sem o atributo
multiple. A tabela 3.7 apresenta seus principais atributos.

Tabelaa 3.7
Atributos de
<h:selectOneMenu>.

Atributo

Descrio

id

identificador do componente

value

valor do componente, pode ligar a uma propriedade de um MB

readonly

true/false somente leitura

disabled

true/false elemento desabilitado (no recebe foco)

title

tool tip text

style

estilos CSS aplicados ao componente

styleClass

lista de classes de CSS aplicados ao componente (renderizados como atributo class)

Eventos do DOM

onfocus, onclick etc.

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

Texto apresentado para esta opo

itemValue

Valor a ser submetido quando esta opo estiver selecionada

itemDisabled

true/false, flag indicando se o item est desabilitado (default false)

noSelectionOption

true/false, flag indicando se o item no selecionvel e, em caso de campo requerido,


gera erro se estiver selecionado (default false)

O cdigo a seguir mostra como um <h:selectOneMenu> escrito em JSF, como renderizado


em HTML e como apresentado no navegador.

Tabela 3.8
Atributos de
<f:selectItem>.

Cdigo em JSF
<h:outputLabel value=Sexo: for=sexo />
JAVA Frameworks e Aplicaes Corporativas

<h:selectOneMenu id=sexo >

44

<f:selectItem id=M itemLabel=Masculino itemValue=M />


<f:selectItem id=F itemLabel=Feminino itemValue=F />
</h:selectOneMenu>

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.

O cdigo a seguir mostra o XHTML e o Managed Bean usados no exemplo.


<h:form>
<h:panelGrid columns=2>
<h:outputLabel value=Sexo: for=sexostr />
<h:outputText value=#{exemploMB.sexo}
id=sexostr />
<h:outputLabel value=Sexo: for=sexo />
<h:selectOneMenu id=sexo
value=#{exemploMB.sexo} >
<f:selectItem id=M itemLabel=Masculino
itemValue=M />
<f:selectItem id=F itemLabel=Feminino
itemValue=F />
</h:selectOneMenu>
<h:commandButton value=Enviar />
</h:panelGrid>
</h:form>
@Named(value = exemploMB)
@RequestScoped
public class ExemploMB {
private String sexo;
// setters/getters
}

Caixa de Seleo: listBox de Seleo Mltipla


O componente <h:selectManyListbox> renderiza um ListBox contendo uma lista de opes
para seleo mltipla (pressionando-se a tecla CTRL ou CMD), que pode ser vinculada a uma
propriedade de um Managed Bean. Ele renderiza um compnente <select> do HTML com
atributo size igual ao nmero de opes e com o atributo multiple. A tabela 3.9 apresenta

Tabela 3.9
Atributos de
<h:selectMany
Listbox>.

Atributo

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.

size

Quantidade de elementos a serem mostrados, se no for especificado,


todos sero (igual ao nmero de opes). Se houver necessidade, um
scrollbar mostrado

readonly

true/false somente leitura

disabled

true/false elemento desabilitado (no recebe foco)

title

tool tip text

style

estilos CSS aplicados ao componente

Captulo 3 - JSF Componentes visuais

seus principais atributos.

45

Atributo

Descrio

styleClass

lista de classes de CSS aplicados ao componente (renderizados como


atributo class)

Eventos do DOM

onfocus, onclick etc.

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.

Os cdigos a seguir mostram o XHTML e o Managed Bean usados no exemplo.


<h:form>
<h:panelGrid columns=2>
<h:outputLabel value=Estados: for=estadostr />
<h:outputText value=#{exemploMB.estados} id=estadostr />
<h:outputLabel value=Estados: for=estados />
<h:selectManyListbox id=estados value=#{exemploMB.estados}

JAVA Frameworks e Aplicaes Corporativas

size=3 >

46

<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>
<h:commandButton value=Enviar />
</h:panelGrid>
</h:form>

@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;
}
}

3.1.4 @PostConstruct e @PreDestroy


No cdigo acima foi usado uma anotao especial do CDI no Managed Bean, o @PostConstruct (javax.annotation.PostConstruct). Um mtodo anotado dessa forma chamado aps
a construo do objeto e aps todas as injees serem feitas, mas antes do objeto ser
disponibilizado para operao. Assim, prefere-se iniciar os objetos dessa forma, pois todas
as dependncias j foram resolvidas e tambm porque h garantia de que esse mtodo
chamado somente uma vez, o que no ocorre com o construtor, por causa do mecanismo de
Proxy usado pelo CDI.
O mtodo init() foi usado para inicializar alguns checkboxes, trazendo-os j marcados na
primeira vez que a tela for mostrada ao usurio.
Analogamente, podemos anotar um metodo com @PreDestroy (javax.annotation.PreDestroy), que invocando antes da instncia ser destruda.
Somente pode haver um mtodo anotado com @PostConstruct e um com @PreDestroy.
11 @PostConstruct.

22 O mtodo anotado invocado logo aps a criao do objeto;


22 Todas as injees j foram feitas;

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

Captulo 3 - JSF Componentes visuais

22 Sempre usado para inicializar o bean, ao invs do construtor.

47

Bean. A tabela 3.10 apresenta seus principais atributos.


Atributo

Descrio

id

identificador do componente

value

(true/false) valor do componente, pode ligar a uma propriedade lista de um MB

layout

Aparncia da tabela renderizada:

11lineDirection: para mostrar os elementos horizontalmente


11pageDirection: para mostrar os elementos verticalmente

border

Tamanho (px) da borda da tabela renderizada

readonly

true/false somente leitura

disabled

true/false elemento desabilitado (no recebe foco)

title

tool tip text

style

estilos CSS aplicados ao componente

styleClass

lista de classes de CSS aplicados ao componente (renderizados como atributo class)

Eventos do DOM

onfocus, onclick etc.

O cdigo a seguir mostra como um <h:selectManyCheckbox> escrito em JSF, como


renderizado em HTML e como apresentado no navegador.
Cdigo em JSF
<h:selectManyCheckbox id=teste layout=pageDirection >
<f:selectItem id=sc itemLabel=Santa Catarina
itemValue=SC />
<f:selectItem id=pr itemLabel=Paran itemValue=PR />
<f:selectItem id=rs itemLabel=Rio Grande do Sul
itemValue=RS />

JAVA Frameworks e Aplicaes Corporativas

</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.

Os cdigos a seguir mostram o XHTML e o Managed Bean usados no exemplo.


<h:form>
<h:panelGrid columns=2>
<h:outputLabel value=Estados for=estados />
<h:selectManyCheckbox id=estados
value=#{exemploMB.escolhidos}
layout=pageDirection>
<f:selectItem id=sc itemLabel=Santa Catarina
itemValue=SC />
<f:selectItem id=pr itemLabel=Paran
itemValue=PR />
<f:selectItem id=rs
itemLabel=Rio Grande do Sul
itemValue=RS />
</h:selectManyCheckbox>
<h:commandButton value=Enviar />
</h:panelGrid>
</h:form>

@Named(value = exemploMB)
@RequestScoped
public class ExemploMB {
private List<String> escolhidos = new ArrayList<>();
@PostConstruct
public void init() {
escolhidos.add(PR);
escolhidos.add(SC);
}

Caixa de Seleo: botes de Rdio


O componente <h:selectOneRadio> renderiza uma tabela contendo uma lista de botes de
rdio para seleo mutuamente exclusiva (somente um pode estar selecionado em cada
momento) do tipo SIM/NO, que poder ser vinculada a uma propriedade booleana de um

Captulo 3 - JSF Componentes visuais

// setters/getters

49

Managed Bean. A tabela 3.12 apresenta seus principais atributos.


Atributo

Descrio

id

identificador do componente

value

valor do componente, pode ligar a uma propriedade de um MB

layout

Aparncia da tabela renderizada:

11lineDirection: para mostrar os elementos horizontalmente


11pageDirection: para mostrar os elementos verticalmente

border

Tamanho (px) da borda da tabela renderizada

readonly

true/false somente leitura

disabled

true/false elemento desabilitado (no recebe foco)

title

tool tip text

style

estilos CSS aplicados ao componente

styleClass

lista de classes de CSS aplicados ao componente (renderizados como atributo class)

Eventos do DOM

onfocus, onclick etc.

O cdigo a seguir mostra como um <h:selectOneRadio> escrito em JSF, como renderizado

Tabela 3.11

em HTML e como apresentado no navegador.

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

<label for=j_idt5:sexo:1> Feminino</label></td>

50

</tr>
</table>
Figura 3.12
<h:selectOneRadio>
em JSF, renderizado
em HTML e no
navegador.

O cdigo a seguir mostra o XHTML e o Managed Bean usados no exemplo.


<h:form>
<h:panelGrid columns=2>
<h:outputLabel value=Sexo: for=sexostr />
<h:outputText value=#{exemploMB.sexo}
id=sexostr />
<h:outputLabel value=Sexo: for=sexo />
<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>
<h:commandButton value=Enviar />
</h:panelGrid>
</h:form>

@Named(value = exemploMB)
@RequestScoped
public class ExemploMB {
private String sexo;
// setters/getters
}

3.1.7 Caixa de Seleo: listBox de Seleo nica


O componente <h:selectOneListbox> renderiza um ListBox contendo uma lista de opes
para seleo, que poder ser vinculada a uma propriedade de um Managed Bean. Ele
renderiza um componente <select> do HTML com atributo size igual ao nmero de opes
sem o atributo multiple. A tabela 3.13 apresenta seus principais atributos.

Atributo

Descrio

id

identificador do componente

value

valor do componente, pode ligar a uma propriedade de um MB

Size

Quantidade de elementos a serem mostrados, se no for especificado, todos sero (igual


ao nmero de opes). Se houver necessidade, um scrollbar mostrado

readonly

true/false somente leitura

disabled

true/false elemento desabilitado (no recebe foco)

title

tool tip text

style

estilos CSS aplicados ao componente

styleClass

lista de classes de CSS aplicados ao componente (renderizados como atributo class)

Eventos do DOM

onfocus, onclick etc.

Captulo 3 - JSF Componentes visuais

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.

Os cdigos a seguir mostram o XHTML e o Managed Bean usados no exemplo anterior.


<h:form>
<h:panelGrid columns=2>
<h:outputLabel value=Estado: for=estadostr />
<h:outputText value=#{exemploMB.estado}
id=estadostr />
<h:outputLabel value=Estado: for=estado />
<h:selectOneListbox id=estado
value=#{exemploMB.estado}
size=3 >
<f:selectItem id=pr itemLabel=Paran
itemValue=PR />
<f:selectItem id=sc itemLabel=Santa Catarina
itemValue=SC />

JAVA Frameworks e Aplicaes Corporativas

<f:selectItem id=rs

52

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:selectOneListbox>
<h:commandButton value=Enviar />
</h:panelGrid>
</h:form>

@Named(value = exemploMB)
@RequestScoped
public class ExemploMB {
private String estado;
// setters/getters
}

Caixa de Seleo: comboBox de Seleo Mltipla


O componente <h:selectManyMenu> renderiza um ListBox contendo uma lista de opes para
seleo mltipla (pressionando-se a tecla CTRL ou CMD), que poder ser vinculada a uma
propriedade de um Managed Bean. Ele renderiza um compnente <select> do HTML com atributo size igual 1 e com o atributo multiple. A tabela 3.14 apresenta seus principais atributos.
Atributo

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

true/false somente leitura

disabled

true/false elemento desabilitado (no recebe foco)

title

tool tip text

style

estilos CSS aplicados ao componente

styleClass

lista de classes de CSS aplicados ao componente (renderizados como atributo class)

Eventos do DOM

onfocus, onclick etc.

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>

<label for=j_idt5:cor>Cor: </label>


<select id=j_idt5:cor name=j_idt5:cor multiple=multiple size=1>
<option value=V>Verde</option>
<option value=A>Azul</option>
</select>
Figura 3.14
<h:selectMany
Listbox> em
JSF, renderizado
em HTML e no
navegador..

Captulo 3 - JSF Componentes visuais

Renderizado em HTML

53

Os cdigos a seguir mostram o XHTML e o Managed Bean usados no exemplo.


<h:form>
<h:panelGrid columns=2>
<h:outputLabel value=Estados: for=estadostr />
<h:outputText value=#{exemploMB.estados} id=estadostr />
<h:outputLabel value=Estados: for=estados />
<h:selectManyMenu id=estados value=#{exemploMB.estados} >
<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:selectManyMenu>
<h:commandButton value=Enviar />
</h:panelGrid>
</h:form>

@Named(value = exemploMB)
@RequestScoped
public class ExemploMB {
private List<String> estados;
// setters/getters
}

Opes Estticas x Dinmicas


Os componentes que renderizam listas de opes podem ser carregados de forma esttica
e dinmica e a seleo pode ser nica ou mltipla.
Opes Estticas
11 Coloca opes atravs de tags <f:selectItem>
11 Para cada ocorrncia um iten renderizado
11 Por exemplo:

JAVA Frameworks e Aplicaes Corporativas

22 <h:selectOneMenu value=#{pessoaMB.estado}>

54

22

<f:selectItem itemValue=PR itemLabel=Paran />

22

<f:selectItem itemValue=SC itemLabel=Santa Catarina />

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

Nome da varivel que receber um item da lista a cada iteraao do lao

itemLabel

O texto (rtulo) de cada opo

itemValue

Valor do item que ser submetido, quando esta opco estiver selecionada

itemDisabled

(true/false) Se o elemento dever estar desabilitado

noSelectionValue

Se o elemento pode ser selecionado ou somente um descritivo

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.

Captulo 3 - JSF Componentes visuais

A tabela 3.15 mostra os atributos de <f:selectItems>.

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

public class Estado {


private String sigla;
private String nome;
// setters/getters
}

Deve-se notar no exemplo anterior que a inicializao do Managed Bean foi feita no mtodo
init(), anotado com @PostConstruct.

Armazenar String x Objeto


No exemplo anterior o estado escolhido setado no MB pela sua sigla, mas possvel
tambm armazenar diretamente o objeto do tipo Estado selecionado. Para isso necessrio
um Conversor Customizado que efetua duas operaes bsicas:
11 Converte String (da requisio) para Objeto;
11 Converte Objeto para String (para resposta).
Esses converses sero vistas futuramente.

Seleo nica x Seleo Mltipla


Os componentes de seleo tambm podem ser divididos naqueles que permitem seleo
nica e seleo mltipla, como mostra a tabela 3.16.
Seleo nica
<h:selectBoolanCheckbox>

<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

Captulo 3 - JSF Componentes visuais

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

JAVA Frameworks e Aplicaes Corporativas

itemValue=#{estado.sigla}

58

itemLabel=#{estado.nome} />
</h:selectOneMenu>

4
Aprender sobre os demais componentes visuais, para criar interfaces grficas em JSF.

conceitos

objetivos

JSF Componentes visuais

Botes e links; Textos; Imagens; Biblioteca de recursos; Versionamento: Javascript


e CSS; Mensagens.

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.

11 <h:outputLink>: renderiza um link externo para uma URL completa.


A tabela 4.1 mostra um comparativo entre os componentes de botes e links, no que diz
respeito ao tipo, mtodo de submisso e destino das pginas.

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

Captulo 4 - JSF Componentes visuais

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

Contm o texto do boto

action

Contm o mtodo do MB a ser invocado. Exemplo: #{mb.acao}

actionListener

Contm o mtodo de um ActionListener, que ser invocado quando o boto for pressionado. Exemplo: #{mb.acaoListener}

type

O tipo do boto renderizado (submit/button/reset). Por default, gera um boto do tipo


submit

image

A URL ou caminho da imagem que ser renderizada como um boto de submit (renderiza
um <input type=image src=... />)

disabled

(true/false) Se o boto estar desabilitado

style

Estilos CSS aplicados ao componente

styleClass

Lista de classes de CSS aplicados ao componente (renderizados como atributo class)

Eventos do DOM

onfocus, onclick etc.

A figura a seguir mostra como um <h:commandButton> escrito em JSF, como renderizado

Tabela 4.2

em HTML e como apresentado no navegador.

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 />

JAVA Frameworks e Aplicaes Corporativas

Boto de Comando

60

Link de ao: <h:commandLink>


O componente <h:commandLink> um link com ao de submisso, para um formulrio via
POST. Ele renderiza um <a href= >, mas com scripts especficos para submisso do formulrio. A tabela 4.3 apresenta seus principais atributos.
Atributos

Descrio

value

Contm o texto do boto

action

Contm o mtodo do MB a ser invocado. Exemplo: #{mb.acao}

actionListener

Contm o mtodo de um ActionListener, que ser invocado quando


o boto for pressionado. Exemplo: #{mb.acaoListener}

Figura 4.1
<h:command
Button> JSF,
HTML e imagem
renderizada.

Tabela 4.3
Atributos de
<h:commandLink>.

Atributos

Descrio

type

Tipo do recurso do link. Exemplo: stylesheet

disabled

(true/false) Se o boto estar desabilitado

style

Estilos CSS aplicados ao componente

styleClass

Lista de classes de CSS aplicados ao componente (renderizados


como atributo class)

Eventos do DOM

onfocus, onclick etc.

A figura a seguir mostra como um <h:commandLink> escrito em JSF, como renderizado em


HTML e como apresentado no navegador.
Cdigo em JSF
<h:commandLink action=#{exemploMB.acaoLink}
value=Link de Comando/>

Renderizado em HTML
<script type=text/javascript src=/BotoesLinks/faces/javax.faces.resource/jsf.
js?ln=javax.faces&amp;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.

idt11:j_idt5:j_idt11},);return false>Link de Comando</a>

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

Contm o texto do boto

outcome

O nome da pgina (sem .xhtml) para aonde a aplicao ser direcionada

disabled

(true/false) Se o boto estar desabilitado

image

A URL ou caminho da imagem que ser renderizada como um boto de submit (renderiza
um <input type=image src=... />)

style

Estilos CSS aplicados ao componente

styleClass

Lista de classes de CSS aplicados ao componente (renderizados como atributo class)

Eventos do DOM

onfocus, onclick etc.


O cdigo a seguir mostra como um <h:button> escrito em JSF, como renderizado em
HTML e como apresentado no navegador.

Captulo 4 - JSF Componentes visuais

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

Contm o texto do boto

outcome

O nome da pgina (sem .xhtml) para aonde a aplicao ser direcionada

disabled

(true/false) Se o boto estar desabilitado

style

Estilos CSS aplicados ao componente

styleClass

Lista de classes de CSS aplicados ao componente (renderizados como atributo class)

Eventos do DOM

onfocus, onclick etc.

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>

JAVA Frameworks e Aplicaes Corporativas

Link

62

Link Externo: <h:outputLink>


O componente <h:outputLink> um link que direciona para uma pgina externa aplicao,
no JSF. Ele renderiza um <a href=>, e seu redirecionamento um mtodo GET. O texto do
link deve ser colocado dentro do outputLink. A tabela 4.6 apresenta seus principais atributos.

Figura 4.4
<h:link> JSF,
HTML e imagem
renderizada.

Atributos

Descrio

value

Para aonde ser redirecionado

disabled

(true/false) Se o boto estar desabilitado

style

Estilos CSS aplicados ao componente

styleClass

Lista de classes de CSS aplicados ao componente (renderizados como atributo class)

Eventos do DOM

onfocus, onclick etc.

Tabela 4.6
Atributos de
<h:outputLink>.

A figura a seguir mostra como um <h:outputlink> escrito em JSF, como renderizado em


HTML e como apresentado no navegador.
Cdigo em JSF
<h:outputLink value=http://www.google.com.br>

<h:outputText value=Google />

</h:outputLink>

Renderizado em HTML
<a href=http://www.google.com.br>Google</a>

Google

Exemplo com botes e links


Os cdigos a seguir apresentam um exemplo com os cinco tipos de botes e links.
Index.xhtml
<h:form>
<h:panelGrid columns=2>
<h:outputLabel value=Ao: for=txtacao/>
<h:outputText id=txtacao value=#{exemploMB.acao} />
<h:outputLabel value=Texto Antigo: for=txtantigo/>
<h:outputText id=txtantigo value=#{exemploMB.texto} />
<h:outputLabel value=Texto Novo: for=txtnovo/>
<h:inputText id=txtnovo value=#{exemploMB.texto} />
<h:commandButton action=#{exemploMB.acaoBotao} value=Ok />
<h:commandLink action=#{exemploMB.acaoLink} value=Ok/>
<h:button outcome=teste value=Ok/>
<h:link outcome=teste value=Ok/>
<h:outputLink value=http://www.google.com.br>
<h:outputText value=Google />
</h:outputLink>
</h:panelGrid>
</h:form>

Captulo 4 - JSF Componentes visuais

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;

11 <h:outputFormat>: o atributo value um texto formatado onde se pode inserir


fragmentos via parmetros.

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

JAVA Frameworks e Aplicaes Corporativas

senha. A figura a seguir traz um exemplo simples utilizando <h:outputText>.

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

Dado a ser inserido na string

Tabela 4.7
Atributos de
<f:param>.

O cdigo a seguir mostra como um <h:outputFormat> apresentado.


Cdigo em JSF
<h:outputFormat value=Meu nome {0} e tenho {1} anos.
styleClass=classecss >
<f:param value=Maria />
<f:param value=20 />
</h:outputFormat>

Renderizado em HTML
<span class=classecss>Meu nome Maria e tenho 20 anos.</span>
Figura 4.7
<h:outputFormatt>
JSF, HTML e texto
renderizado.

Meu nome Maria e tenho 20 anos.

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

Sobrescreve o atributo de largura

height

Sobrescreve o atributo de altura

usemap

O nome do mapa que foi criado no HTML

alt

Texto alternativo se a imagem no for encontrada

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

Captulo 4 - JSF Componentes visuais

Tabela 4.8
Atributos de
<h:graphicImage>.

65

O cdigo a seguir mostra como o <h:graphicImage> apresentado.


Cdigo em JSF
<h:graphicImage value=http://docs.oracle.com/javaee/6/tutorial/doc/graphics/
javalogo.png />

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 />

No exemplo, a imagem foto.jpg obtida de dentro da biblioteca fotos (diretrio /resources/


fotos). A figura 4.9 mostra como uma biblioteca de imagens fica no sistema de arquivos.
No caso, mostrado o diretrio do projeto do Netbeans. A biblioteca se chama tema1 e a
imagem img/tux.jpg, e poderia ser carregada com o seguinte comando:

JAVA Frameworks e Aplicaes Corporativas

<h:graphicImage library=tema1 name=img/tux.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.

Para acessar a biblioteca de nome default, usamos:


11 <h:graphicImage library=default name=img/tux.png />
11 Os recursos da verso 2_0 sero mostrados;
11 No possvel escolher a verso dos recursos a ser utilizado, sendo que o JSF sempre
utiliza a ltima verso.

Captulo 4 - JSF Componentes visuais

temos a biblioteca default (verses 1_0 e 2_0) e tema1 (sem versionamento).

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:

11 Atributo name: nome do script sendo adicionado;


11 Atributo library: nome da biblioteca (subdiretrio) onde o script se encontra;
11 Atributo target: onde o script deve ser colocado: head ou body.
<h:outputStyleSheet>: inclui um CSS, usa o mesmo esquema de bibliotecas:

11 Atributo name: nome do CSS sendo adicionado;


11 Atributo library: nome da biblioteca (subdiretrio) onde o CSS se encontra.
Por exemplo:
<h:outputScript name=teste.js library=js
target=head />
<h:outputStyleSheet name=estilo.css
library=css />

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

<f:param value=#{alunoMB.media} />

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)

Assim, pode-se escrever:


<h:outputText value=Oi
rendered=#{(alunoMB.media ge 7.0 and alunoMB.mostrarAluno) or alunoMB.media lt
7.0} />

Os cdigos a seguir mostram um exemplo para testar o atributo rendered.

<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

coloca a quantidade de colunas na tabela, cada componente do JSF ser colocado em


uma coluna. Renderiza uma tabela com os elementos dentro;
11 <h:panelGroup>: permite que vrios componentes sejam tratados visualmente como
um s, na tabela.
O cdigo a seguir mostra como um <h:panelGrid> apresentado.
Cdigo em JSF
<h:panelGrid columns=2>
<h:outputLabel value=Nome: for=nome />
<h:inputText value=Joo id=nome/>
<h:outputLabel value=Idade: for=idade />
<h:inputText value=18 id=idade/>
</h:panelGrid>

<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.

Captulo 4 - JSF Componentes visuais

Renderizado em HTML

69

O cdigo a seguir mostra um exemplo de <h:panelGroup>.


<h:panelGrid columns=2>
<h:outputLabel value=Nome: for=nome />
<h:inputText value=#{exemploMB.nome} id=nome />
<h:panelGroup>
<h:selectBooleanCheckbox

/>

<h:outputLabel value=Idade: for=idade />


</h:panelGroup>
<h:inputText value=#{exemploMB.idade} id=idade />
<h:commandButton value=Enviar />
</h:panelGrid>

A seguir, mostrado como o <h:panelGroup> renderizado. Sua funo inserir todos os


componentes no mesmo <td> da tabela gerada pelo <h:panelGrid>.
<table>
<tbody>
<tr>
<td><label for=j_idt5:nome>Nome: </label></td>
<td><input id=j_idt5:nome type=text name=j_idt5:nome /></td>
</tr>
<tr>
<td><input type=checkbox name=j_idt5:j_idt9 /><label for=j_idt5:idade>Idade:
</label></td>
<td><input id=j_idt5:idade type=text name=j_idt5:idade value=0 /></td>
</tr>
<tr>
<td><input type=submit name=j_idt5:j_idt11 value=Enviar /></td>
</tr>
</tbody>
</table>

A figura 4.12 mostra como fica a tabela.

JAVA Frameworks e Aplicaes Corporativas

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>.

Os cdigos a seguir mostram um exemplo de <h:dataTable> e como a tabela renderizada


em HTML. A figura 4.13 mostra como apresentada no navegador.
Index.xhtml
<h:dataTable value=#{alunoMB.alunos} var=aluno>
<h:column>
#{aluno.nome}
</h:column>
<h:column>
#{aluno.idade}
</h:column>
<h:column>
#{aluno.email}
</h:column>
</h:dataTable>

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
}

Captulo 4 - JSF Componentes visuais

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

footer. Os cdigos a seguir mostram um exemplo de tabela com cabealhos e rodaps, e


como a renderizao fica em HTML. A figura 4.14 mostra como apresentado no navegador.
<h:dataTable value=#{alunoMB.alunos} var=aluno border=1>
<f:facet name=header>Lista de Alunos</f:facet>
<h:column>
<f:facet name=header>Nome</f:facet>
<f:facet name=footer>x</f:facet>
#{aluno.nome}
</h:column>
<h:column>
<f:facet name=header>Idade</f:facet>
#{aluno.idade}
</h:column>

JAVA Frameworks e Aplicaes Corporativas

<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>

<th scope=col>Nome</th><th scope=col>Idade</th>


<th scope=col>E-mail</th>

</tr>

</thead>
<tfoot>
<tr>

<td>x</td> <td></td> <td></td> </tr>

<tr><td colspan=3>Fim da Lista</td></tr>


</tfoot>
<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>

Lista de Alunos
Nome

Idade

email

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);

O mtodo addMessage(), que faz a adio da mensagem, tem dois parmetros:


11 String: no exemplo est sendo passado null. o ID do componente usando-se a
sintaxe de formulrio: formId:componentId;
11 FacesMessage: a mensagem propriamente dita.
Em um XHTML, para mostrar Mensagens, usamos:
<h:messages />

Captulo 4 - JSF Componentes visuais

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

public void criarMensagem() {


FacesMessage mensagem = new FacesMessage(Aluno Removido, O aluno foi
removido com sucesso);
mensagem.setSeverity(FacesMessage.SEVERITY_ERROR);
FacesContext.getCurrentInstance().addMessage(
null, mensagem);
}
}

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>

22 Atributo value: coleo de elementos a serem varridos;


22 Atributo var: varivel que recebe cada um dos elementos em cada passo da iterao.
Exemplo:
XHTML
<h:outputText value=Alunos />
<ul>
<ui:repeat value=#{alunosMB.alunos} var=aluno>
<li>
<h:outputText value=#{aluno.nome} />
</li>
</ui:repeat>
</ul>

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
}

Captulo 4 - JSF Componentes visuais

a = new Aluno();

75

76

JAVA Frameworks e Aplicaes Corporativas

5
Conhecer o tratamento de dados e eventos no JSF com recursos disponveis e atravs
de customizao.

conceitos

Templates; Conversores; Validadores; Eventos; Atributo Immediate.

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;

11 Templates: definio de um modelo de tela (ou parte).


22 Esqueleto para as telas;
22 Define elementos fixos Exemplo: imagem de cabealho;
22 Evita a redefinio de pginas similares;
22 Incentiva o reuso de pginas;
22 Ajuda a manter um padro de aparncia no sistema como um todo.
11 Duas alternativas para reuso: incluso de pginas e templates.

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

Captulo 5 - JSF Tratamento de dados e eventos

objetivos

JSF Tratamento de dados e eventos

usados em vrias partes do sistema podem ser isolados.


77

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>

<h:graphicImage library=tema1 name=cabecalho.jpg />


</div>

</ui:composition>

Templates
Para definir um template em JSF, deve-se escrever um arquivo XHTML que contm a poro

JAVA Frameworks e Aplicaes Corporativas

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.

Os cdigos a seguir mostram o arquivo de template (template.xhtml) contendo as pores


fixas e a posio onde so inseridas as pores dinmicas das pgina e uma pgina da apliao (index.xhtml) que usa o template.
template.xhtml
<?xml version=1.0 encoding=UTF-8 ?>
<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd>
<html xmlns=http://www.w3.org/1999/xhtml
xmlns:h=http://xmlns.jcp.org/jsf/html
xmlns:ui=http://xmlns.jcp.org/jsf/facelets>
<h:head><title>JSF</title></h:head>
<h:body>
<div id=header>
<h:graphicImage library=tema1 name=cabecalho.jpg />
</div>
<hr/>
<ui:insert name=corpo>Contedo da tela</ui:insert>
<hr/>
<div id=footer style=text-align: center>Rodap</div>
</h:body>
</html>

Para usar um template:

11 Escreve-se os arquivos com elementos dinmicos;


11 Em geral, um arquivo para cada pgina que usa o template;
11 Usa-se a tag <ui:composition> para que o template seja carregado.
22 O atributo template indica qual o arquivo de template a ser usado.
11 Dentro deve-se criar trechos com <ui:define>
22 Esses trechos sero colocados nas posies dinmicas do template;
22 O local a ser inserido depende do atributo name.
tela.xhtml

<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/


TR/xhtml1/DTD/xhtml1-transitional.dtd>
<ui:composition template=/template.xhtml
xmlns=http://www.w3.org/1999/xhtml
xmlns:h=http://java.sun.com/jsf/html
xmlns:ui=http://java.sun.com/jsf/facelets>
<ui:define name=corpo>
<h:form>
<h:outputLabel for=nome value=Nome: />
<h:inputText id=nome value=#{exemploMB.nome} />
<h:commandButton value=Salvar
action=#{exemploMB.salvar} />
</h:form>

Captulo 5 - JSF Tratamento de dados e eventos

<?xml version=1.0 encoding=UTF-8 ?>

</ui:define>
</ui:composition>

79

lO atributo name usado

Na definio do template, podemos ter vrios pontos de insero de contedo dinmico e


eles so identificados pelo atributo name da tag <ui:insert>. Ao criar uma pgina usando

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 Dados que trafegam de um formulrio para a aplicao so sempre texto:


22 Na aplicao, deve-se converter para o tipo desejado;
22 Deve-se fazer uma validao para saber se o dado segue o padro desejado
(exemplo: tamanho de uma string).
11 Dados que so obtidos da aplicao nem sempre esto no formato certo a ser
apresentado:
22 Deve-se converter para apresentar ao usurio.
O JSF j traz diversos conversores padro, que no precisam ser assinalados na aplicao. Basta
que o MB tenha um atributo daquele tipo para que a converso seja feita automaticamente.
Conversores aplicados Automaticamente:

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;

JAVA Frameworks e Aplicaes Corporativas

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

possvel personalizar os conversores atravs das tags:

11 <f:convertNumber />: para personalizar converso para java.lang.Number;


11 <f:convertDateTime />: para personalizar converso para java.util.Date ou java.sql.Date.

Converso de nmeros
Descrio

maxFractionDigits

Com quantas casas decimais, no mximo, o nmero apresentado

minFractionDigits

Com quantas casas decimais, no mnimo, o nmero apresentado

maxIntegerDigits

Nmero mximo de nmeros em sua poro inteira

minIntegerDigits

Nmero mnimo de nmeros em sua poro inteira

pattern

Padro de formatao do nmero (definido no DecimalFormat)

type

Tipo como o nmero apresentado (number, percent, currency)

currencySymbol

Smbolo a ser usado quando o tipo (type) do nmero for currency

Os cdigos a seguir apresentam um primeiro exemplo de converso de nmeros.


index.xhtml
Normal: <h:outputText value=#{exemploMB.decimal} /><br/>
Convertido: <h:outputText value=#{exemploMB.decimal} >
<f:convertNumber maxFractionDigits=2 />
</h:outputText>
<h:form>
<h:inputText value=#{exemploMB.decimal} >
<f:convertNumber maxFractionDigits=4 />
</h:inputText> <br/>
<h:commandButton value=Alterar />
</h:form>

ExemploMB
@Named
@RequestScoped
public class ExemploMB {
private double decimal;
// setters/getters
}

Os cdigos a seguir apresentam um segundo exemplo de converso de nmeros. O cdigo


o mesmo, mas foi mudada a converso do nmero decimal para currency.
index.xhtml
Normal: <h:outputText value=#{exemploMB.decimal} /><br/>
Convertido: <h:outputText value=#{exemploMB.decimal} >
<f:convertNumber type=currency />
</h:outputText>
<h:form>

Captulo 5 - JSF Tratamento de dados e eventos

Tabela 5.1
Atributos da tag
<f:convert
Number />.

Atributo

<h:inputText value=#{exemploMB.decimal} >

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$).

Converso de datas ou horas

JAVA Frameworks e Aplicaes Corporativas

A tabela 4.2 mostra os atributos da tag <f:convertDateTime>.

82

Atributo

Descrio

pattern

Padro para apresentao da data (definido em SimpleDateFormat) (exemplo: dd/MM/yyyy)

type

Para especificar se a data, a hora ou os dois sero apresentados (date (default), time, both)

dateStyle

Estilo da data a ser apresentada (default, short, medium, long, full)

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)

Os cdigos a seguir mostram um exemplo de uso da converso de data ou hora.


index.xhtml
Normal: <h:outputText value=#{exemploMB.data} /><br/>
Padro dd.MM.yy: <h:outputText value=#{exemploMB.data} >
<f:convertDateTime pattern=dd.MM.yy />
</h:outputText><br/>
Estilo Long: <h:outputText value=#{exemploMB.data} >
<f:convertDateTime dateStyle=long />

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)

Assim, o conversor atribudo automaticamente classe Telefone. Tambm possvel


definir o conversor da seguinte forma:
@FacesConverter(value=telefoneConverter)

Onde o atributo value indica o id do conversor, a ser usado no XHTML.


4. Implementar os mtodos: getAsObject() e getAsString().
22 getAsObject(): transforma uma STRING em OBJETO (nesse exemplo Telefone);
22 getAsString(): transforma um OBJETO em STRING.
5. Se a string recebida em getAsObject() no respeita as regras de converso, deve-se criar

Captulo 5 - JSF Tratamento de dados e eventos

Figura 5.2
Exemplo com
data de entrada
10/01/2015.

uma mensagem de erro e uma exceo.

83

FacesMessage mensagem = new FacesMessage(


Telefone Invlido);
mensagem.setSeverity(
FacesMessage.SEVERITY_ERROR);
throw new ConverterException(mensagem);

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>

Dica: o ambiente de desenvolvimento facilita a criao dessa classe.


@FacesConverter(value=estadoConverter, forClass=Estado.class)
public class EstadoConverter implements Converter {
public Object getAsObject(FacesContext context,
UIComponent component,
String value) {
return Estado.buscar(value);
}

JAVA Frameworks e Aplicaes Corporativas

public String getAsString(FacesContext context,

84

UIComponent component,
Object value) {
return ((Estado) value).getSigla();
}
}

Armazenar um objeto em um MB em vez de uma string


Nos exemplos mostrados de entrada de dados em formulrio, principalmente para os componentes de seleo, quando o usurio selecionava um elemendo de uma lista, sempre era
armazenado uma string correspondendo ao elemento.

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>

managedbeans.ExemploMB: MB que contm a lista de estados a serem mostrados e um


estado selecionado pelo usurio.
package managedbeans;
// imports
@Named
@RequestScoped
private Estado selecionado;
private List<Estado> listaEstados;
@PostConstruct
public void init() {
// busca todos os estados
listaEstados = Estado.buscarTodos();
}
// setters/getters
}

Captulo 5 - JSF Tratamento de dados e eventos

public class ExemploMB {

85

beans.Estado : setters/getters, mtodos de acesso ao banco de dados, Serializable,


hashCode() e equals().
package beans;
import java.util.ArrayList;
import java.util.List;
public class Estado {
private String sigla;
private String nome;
public Estado() { }
public Estado(String s, String n) {
this.sigla = s;
this.nome = n;
}
// setters/getters
public boolean equals(Object e) {
return (this.sigla.equalsIgnoreCase(
((Estado)e).getSigla()));
}
public int hashCode() {
return this.sigla.hashCode();
}
// simulando uma busca no banco de dados
public static Estado buscar(String sigla) {
if (sigla.equals(PR))
return new Estado(PR, Paran);
if (sigla.equals(SC))
return new Estado(SC, Santa Catarina);
if (sigla.equals(RS))
return new Estado(RS, Rio Grande do Sul);
if (sigla.equals(MG))
return new Estado(MG, Minas Gerais);
return null;
}
// Simulando uma busca no banco de dados
public static List<Estado> buscarTodos() {
List<Estado> listaEstados = new
JAVA Frameworks e Aplicaes Corporativas

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

converter.EstadoConverter: usado para converter:


11 String(sigla) > Estado;
11 Estado > String.
package converter;
// imports
import beans.Estado;
@FacesConverter(value=estadoConverter, forClass=Estado.class)
public class EstadoConverter implements Converter {
public Object getAsObject(FacesContext context,
UIComponent component,
String value) {
return Estado.buscar(value);
}
public String getAsString(FacesContext context,
UIComponent component,
Object value) {
return ((Estado) value).getSigla();
}
}

Mensagem de erro de converso


Se o dado preenchido pelo usurio no for adequado, no permitindo a converso,
podemos apresentar mensagem para avisar o usurio do problema ocorrido. Para tal,
usa-se <h:message> para mostrar a mensagem especfica de um campo da tela:
<h:inputText value=#{pessoaMB.idade} id=idade />
<h:message for=idade/>

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 />

Podemos tambm alterar globalmente as mensagens de converso, criando-se um arquivo


de mensagens contendo todas as mensagens personalizadas. Esse arquivo precisa ser registrado no faces-config.xml.

Captulo 5 - JSF Tratamento de dados e eventos

de showSummary e showDetails true e false, respectivamente

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 />

As validaes podem ser feitas atravs das tags:


<f:validateLongRange>: nmero inteiro entre uma faixa de valores.

JAVA Frameworks e Aplicaes Corporativas

id=idade required=true >


<f:validateLongRange minimum=18
maximum=150 />

</h:inputText>

<h:message for=idade />

<f:validateDoubleRange>: nmero real entre uma faixa de valores.


<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}

<h:message for=preco />

<f:validateLength>: string com uma determinada quantidade de caracteres.


<h:inputText value=#{alunoMB.nome} id=nome


required=true >

<f:validateLength minimum=4
maximum=12 />

</h:inputText>

<h:message for=nome />

<f:validateRegex>: validar se um texto segue uma expresso regular. No exemplo a seguir,

verifica se a string possui de 6 a 20 caracteres e formado somente por letras.


<h:inputText value=#{alunoMB.codigo}
id=codigo required=true >

<f:validateRegex pattern=[a-zA-Z]{6,20} />

</h:inputText>

<h:message for=codigo />

A seguir, exemplo de validao de e-mail com Expresso Regular:


index.xhtml
<h:body>
<h:messages />
E-mail: <h:outputText value=#{exemploMB.email}/>
<h:form>
<h:inputText value=#{exemploMB.email} >
<f:validateRegex pattern=^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z09-]+)*(\.[a-z]{2,6})$ />
</h:inputText>
<h:commandButton value=Atualizar/>
</h:form>
</h:body>

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.

Captulo 5 - JSF Tratamento de dados e eventos

private String e-mail;

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>

Onde com.app.mensagens o nome do arquivo mensagens.properties, que est no pacote


com.app.

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;
}

Podemos desabilitar a validao por bean de um determinado componente, na tela, usando:


<f:validateBean disabled=true />

Por exemplo:
<h:inputText value=#{alunoMB.nome} >
<f:validateBean disabled=true />

JAVA Frameworks e Aplicaes Corporativas

</h:inputText>

As validaes definidas so:


11 @AssertFalse: verifica se possui valor false;
11 @AssertTrue: verifica se possui valor true;
11 @DecimalMax: define o valor real mximo:
@DecimalMax(value=300.5)
11 @DecimalMin: define o valor real mnimo:
@DecimalMin(value=13.8)
11 @Digits: define a quantidade de dgitos da parte inteira (integer) e da fracionria
(fraction): @Digits(integer=3, fraction=2)
11 @Future: verifica se a data posterior data atual;
11 @Past: verifica se a data anterior data atual;

90

11 @Max: nmero inteiro mximo:

@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 {

@NotNull(message=Nome no pode ser nulo)

private String nome;

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:

1. Criar uma classe que implementa a interface javax.faces.validator.Validator;


2. Anotar a classe com @FacesValidator(com.curso.EmailValidator);
3. Sobrescrever o mtodo validate().
Para usar o validador nas tags de tela, usa-se:
<h:inputText value=#{alunoMB.email} >
<f:validator
validatorId=com.curso.EmailValidator />

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);

Se forem necessrias mais informaes para a validao, passa-se parmetros do campo


com <f:attribute />:
<h:inputText value=#{alunoMB.data} >
<f:attribute name=inicio value=10/10/2010 />
<f:attribute name=fim value=11/11/2011 />
</h:inputText>

Captulo 5 - JSF Tratamento de dados e eventos

</h:inputText>

91

No mtodo validate() pegamos esses valores usando:


String strInicio = (String)component.getAttributes()
.get(inicio);
String strFim = (String)component.getAttributes()
.get(fim);

Os cdigos a seguir mostram um exemplo de validador customizado.


<h:outputLabel for=email value=E-mail: />
<h:inputText id=email
value=#{pessoaMB.pessoa.email}
required=true
requiredMessage=E-mail obrigatrio>
<f:validator validatorId=emailValidator/>
</h:inputText>

@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

11 Eventos gerados pelo prprio JSF.

92

Trs categorias de eventos podem ser observados e tratados:


11 FacesEvent: principalmente eventos de controles;
11 PhaseEvent: interceptam as diversas fases do JSF;
11 SystemEvent: eventos em outros pontos, que no so cobertos pelos PhaseEvents.
A seguir, ser detalhada apenas a categoria FacesEvent. As demais categorias podem ter
seus detalhes consultados no material adicional do AVA.

FacesEvent
Os eventos do tipo FacesEvent so:

11 ActionEvent: ocorre quando um boto ou link pressionado;


22 <h:commandButton>
22 <h:commandLink>
11 ValueChangeEvent: ocorre quando um valor de uma caixa de texto ou de uma caixa
de seleo alterado.
Botes ou links, ao serem clicados, automaticamente disparam o submit do formulrio.
Podemos associar um mtodo de um MB, que ser invocado quando esse evento ocorrer.
Para isso, usa-se os atributos action ou actionListener dos componentes <h:commandButton>
e <h:commandLink> para atribuir os mtodos.
O atributo action associado a um mtodo pblico de um MB que retorna void ou String:

11 Se retornar String, o resultado indica a navegao entre telas;


11 Se retornar void (ou se o mtodo for String e retornar null), permanece na mesma tela.
Por exemplo, no XHTML:
<h:commandButton value=Inserir
action=#{alunoMB.salvar} />

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();

Por exemplo, no XHTML:


<h:commandButton value=Inserir
actionListener=#{alunoMB.mudar} />

E no Managed Bean:
@Named
@RequestScoped
public class AlunoMB {
public void mudar(ActionEvent e) {
UICommand c = (UICommand)e.getComponent();
c.setValue(Alterado);
}

Captulo 5 - JSF Tratamento de dados e eventos

Obtm-se o componente que gerou o evento com:

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);
}
}

Os mtodos associados a um evento de ao so executados na seguinte ordem:


1. Mtodo associado com o atributo actionListener;
2. Mtodos associados com <f:actionListener>, de acordo com a ordem em que aparecem
no XHTML;
3. Mtodo associado com o atributo action.
Esses mtodos so chamados na fase Invoke Application, como pode ser observado na
figura a seguir.
Response
complete
Faces Request

JAVA Frameworks e Aplicaes Corporativas

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.

Por exemplo, no XHTML:


<h:outputLabel value=Preo: for=preco />
<h:inputText valueChangeListener=
#{produtoMB.mudarPreco}
id=preco />

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: +
}
}

Os mtodos so executados na seguinte ordem:


11 Mtodo associado com o atributo valueChangeListener;
11 Mtodos associados com a tag <f:valueChangeListener>, na ordem em que aparecem
no XHTML.
Esses mtodos so executados na fase Process Validations, conforme pode ser observado
na figura a seguir.

Captulo 5 - JSF Tratamento de dados e eventos

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

JAVA Frameworks e Aplicaes Corporativas

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

O atributo immediate pode alterar esse comportamento. Se immediate=true:


11 Converso e Validao ocorrem na fase Apply Request Values;
11 Eventos de mudana de valor tambm ocorrem nessa fase;
11 Botes e Links: eventos de ao ocorrem no final da fase Apply Request Values.
A seguir, alguns exemplos de uso:

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

Captulo 5 - JSF Tratamento de dados e eventos

antes dos demais, reduzindo o nmero de mensagens de erro mostradas.

97

98

JAVA Frameworks e Aplicaes Corporativas

6
Conhecer conceitos de internacionalizao; Aprender sobre o uso de Javascript com
XML de forma assncrona; Entender biblioteca Primefaces.

conceitos

Managed Bean de Internacionalizao, requisies, eventos e componentes em Ajax;


Componentes ricos, tais como layout de pginas, datatable, picklist, growl e outros.

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:

11 Arquivos de mensagens em vrios idiomas;


11 XHTML preparado para apresentar mensagens internacionalizadas;
11 Managed Bean na sesso que contm a configurao atual do idioma.
A seguir, cada um desses mecanismos ser examinado com mais detalhes.

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.

Captulo 6 - JSF Internacionalizao, AJAX e Primefaces

objetivos

JSF Internacionalizao, AJAX


e Primefaces

A tabela 6.1 mostra os arquivos messages_pt_BR.properties e messages_en_US.properties,


com as strings para o portugus e ingls.
99

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.

Para que esses arquivos de mensagens estejam disponveis na aplicao configura-se o


arquivo faces-config.xml para indicar:
11 Qual o idioma padro (default);
11 Quais so os idiomas disponveis;
11 Qual varivel ser usada para apresentar as mensagens na tela.
A figura 6.1, a seguir, apresenta as configuraes necessrias no faces-config.xml para disponibilizar a internacionalizao na aplicao.
<application>
<resource-bundle>
<base-name>
com.cursojava.messages.messages
</base-name>
<var>msgs</var>
</resource-bundle>
<locale-config>
<default-locale>pt_BR</default-locale>
<supported-locale>en_US</supported-locale>
</locale-config>
<message-bundle>
com.cursojava.messages.messages
</message-bundle>
</application>

Managed Bean de internacionalizao


JAVA Frameworks e Aplicaes Corporativas

O mecanismo de utilizar um MB para internacionalizao exige que este tenha escopo da

100

seo, para que todas as pginas e componentes da aplicao possam referenci-lo.


A seguir, figura 6.2 mostra como um MB pode ser usado para internacionalizao de aplicaes. Este MB possui um atributo currentLocale, que guarda a configurao atual. Possui
tambm dois mtodos, (englishLocale() e portugueseLocale()), usados para alterar o idioma
em tempo de execuo.

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;
}
}

XHTML com Internacionalizao


Todos os XHTML que forem usar o recurso da internacionalizao precisam ser preparados
para tal. So dois pontos a serem observados:
11 Usar <f:view> para indicar a internacionalizao e qual o idioma padro. Por exemplo:

<f:view locale=#{localeMB.currentLocale}>

11 Todas as mensagens a serem apresentadas devem estar no arquivo de mensagens


configurado no faces-config.xml. Por exemplo:
<h:outputText value=#{msgs.name} />

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.

Captulo 6 - JSF Internacionalizao, AJAX e Primefaces

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:

11 Atualizao de trechos da pgina sem recarregar toda a tela.


11 Realizao de requisies sem interromper a navegao dos usurios.
Usando AJAX com JSF, podemos definir:
11 O evento de um componente para fazer a requisio.
JAVA Frameworks e Aplicaes Corporativas

11 Que componentes da tela sero avaliados no servidor.

102

11 Que componentes da tela sero atualizados aps a requisio.


11 Que mtodo do MB ser invocado na requisio.
A tag usada para invocar uma requisio AJAX <f:ajax>, e cada um dos elementos citados
pode ser configurado atravs de atributos especficos.

Eventos
Uma requisio AJAX deve ser invocada atravs de um evento, geralmente relacionado aos
eventos visuais, de tela, invocados pelo usurio.

Exemplo de requisio AJAX:


<h:inputText >
<f:ajax />
</h:inputText>

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.

Uma outra situao configurar um componente, por exemplo, <h:commandButton>, para


realizar algo somente quando ocorrer um evento de ao. No prximo exemplo, a ao do
commandButton (invocao do action) ser executada via AJAX quando o boto for clicado
(onclick, que o evento default).
<h:commandButton action=...>
<f:ajax />
</h:commandButton>

Os eventos default (quando event no especificado) so:

11 Para componentes de Entrada de Dados: valueChange


11 Para componentes de Ao: action
O AJAX do JSF Suporta todos os eventos do DOM:
11 Os eventos do DOM so todos suportados com os mesmos nomes, mas sem o
prefixo on;

Mais informaes sobre


o DOM: http://en.
wikipedia.org/wiki/
DOM_events

11 action: para elementos de ao, por exemplo, botes, ao efetuada.


Para agrupar vrios componentes, usa-se a tag <f:ajax> ao redor de todos os componentes
agrupados.
Exemplo de agrupamento de componentes:
<f:ajax >
<h:inputText />
<h:inputSecret />
<h:commandButton value=OK />
</f:ajax>

Nesse caso, os eventos recm-tratados so os defaults:


11 inputText e inputSecret valueChange (onchange);
11 commandButton action (onclick).

Captulo 6 - JSF Internacionalizao, AJAX e Primefaces

11 valueChange: para elementos de entrada de dados, alterao de valor;

103

lPode-se usar o padro

Componentes
atributo execute. Esse atributo pode conter uma lista com todos os IDs dos campos que sero

de ids para campos de


formulrio: id1:id2.
como por exemplo:

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:

11 Determina quais componentes devem ser avaliados no servidor;


11 Forma de uso:
22 Lista com todos os IDs dos campos que sero avaliados.
33 Default o prprio elemento;
33 Podemos usar o padro de IDs para campos de formulrio: id1:id2.
O exemplo a seguir mostra o envio de tudo: o formulrio, o componente de formulrio e
todos os seus filhos. Todos sero avaliados no ciclo de vida do JSF, aps a requisio AJAX.
<h:form id=formulario>
<h:inputText />
<h:inputSecret />
<h:commandButton value=Enviar>
<f:ajax event=click execute=formulario />
</h:commandButton>
</h:form>

O execute indica quais valores (componentes) sero enviados para processamento via

AJAX e pode ter os seguintes valores:


11 @all: todos os componentes da tela sero enviados;
11 @none: nenhum componente da tela ser enviado;
11 @this: somente o componente que disparou a requisio AJAX ser enviado;
11 @form: todos os componentes do formulrio que contm o componente que disparou a requisio AJAX sero enviados.
Tambm pode ser atribudo com:
11 Lista de IDs, separados por espao;
11 Expresso EL, que resulta em uma coleo de Strings contendo os IDs dos elementos

JAVA Frameworks e Aplicaes Corporativas

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} />

O render pode receber os seguintes valores:

11 @all: todos os componentes da tela sero atualizados;


11 @none: nenhum componente da tela ser atualizado;
11 @this: somente o componente que disparou a requisio AJAX ser atualizado;
11 @form: todos os componentes do formulrio que contm o componente que disparou a requisio AJAX sero atualizados.
Tambm pode ser atribudo com:
11 Lista de IDs, separados por espao;
11 Expresso EL que resulta em uma coleo de Strings, contendo os IDs dos elementos
a serem processados.

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.

Captulo 6 - JSF Internacionalizao, AJAX e Primefaces

</h:commandButton>

105

Palavras-chave associadas a grupos de componentes que podem ser usadas nos atri-

butos render e execute:


11 @all: todos os componentes da tela;
11 @none: nenhum componente da tela;
11 @this: componente que disparou a requisio AJAX;
11 @form: todos os componentes do formulrio que contm o componente que disparou a requisio AJAX;
11 Lista de IDs, separados por espao;
11 Expresso EL que resulta em uma coleo de Strings.
Por exemplo:
<h:form id=formulario>
<h:inputText />
<h:inputSecret />
<h:commandButton value=Enviar>
<f:ajax event=click execute=@form />
</h:commandButton>
</h:form>

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-

nentes mais elaborados ou sofisticados:


11 PrimeFaces: PrimeTek Informatics;
11 RichFaces: Jboss/Red Hat;
11 IceFaces: IceSoft.
O Primefaces pode ser encontrado no site http://primefaces.org, e a biblioteca que
JAVA Frameworks e Aplicaes Corporativas

contm o maior conjunto de componentes entre as bibliotecas mencionadas.

106

Neste curso, vamos analisar alguns dos componentes disponveis no Primefaces


Caractersticas do Primefaces:
11 OpenSource;
11 Suporte nativo a AJAX;
11 Mais de 100 componentes JSF;
11 Baseado em jQuery;
11 Suporte a HTML5;
11 Site: http://primefaces.org.

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>

So vrios componentes disponveis no Primefaces, os quais destacamos:

11 Layout: elemento que define um leiaute de pgina;


11 DataTable: um componente para criar tabelas de dados que suporta paginao, filtro,
ordenao;
11 Calendar: entrada de datas em forma de calendrio;
11 InputMask: entrada de dados formatados, com mscara;
11 Editor: entrada de um texto com formatao;
11 PickList: seleo de elementos usando transferncia entre ListBoxes;
11 Gmap: apresentao de um mapa do Google Maps;
11 Accordion: elementos mostrados em abas de um accordion;
11 Menu: definio de menus;
11 ItemMenu: itens de menu;
22 SubMenu: submenus, agrupando opes;
22 MenuBar: barra de menus;
22 MenuButton: boto de menu, com vrias opes;
11 Growl: mensagens no estilo de notificaes.
Cada um dos componentes acima listados ser apresentado a seguir.

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

Captulo 6 - JSF Internacionalizao, AJAX e Primefaces

Layout <p:layout>

107

Atributo

Descrio

rendered

Se o componente ser mostrado

fullPage

(true/false) se o componente ocupar toda a pgina

style, styleClass

CSS usado no componente

onResize

script JS chamado quando uma Layout Unit redimensionada

onClose

script JS chamado quando uma Layout Unit fechada

onToggle

script JS chamado quando uma Layout Unit escondida/mostrada

Atributo

Descrio

header

Texto do cabealho da unidade

rendered

Se o componente ser mostrado

position

Posio da unidade: north, west, east, south, center

resizable

(true/false) se a unidade redimensionvel

closable

(true/false) se a unidade pode ser fechada

collapsible

(true/false) se a unidade pode ser escondida/mostrada

style, styleClass

CSS usado na unidade de layout

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>

JAVA Frameworks e Aplicaes Corporativas

108

<p:layoutUnit position=north size=50>

</p:layoutUnit>

<h:outputText value=Top content. />

<p:layoutUnit position=south size=100>

</p:layoutUnit>

<h:outputText value=Bottom content. />

<p:layoutUnit position=west size=300>

</p:layoutUnit>

<p:layoutUnit position=east size=200>

</p:layoutUnit>

<p:layoutUnit position=center>

<h:outputText value=Left content />

<h:outputText value=Right Content />

</p:layoutUnit>

</p:layout>
</h:body>

<h:outputText value=Center Content />

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

No Exemplo de Layout 2, podemos ver que no obrigatria a declarao de todas as


regies, podendo-se criar combinaes diferentes, conforme a necessidade do sistema. No
cdigo a seguir, vemos uma configurao sem a coluna da esquerda e sem rodap, com o
resultado da renderizao mostrado na figura 6.6.
<h:body>
<p:layout fullPage=true>
<p:layoutUnit position=north>
Topo
</p:layoutUnit>
<p:layoutUnit position=west>
Esquerdo
</p:layoutUnit>
<p:layoutUnit position=center>
Centro
</p:layoutUnit>
</p:layout>
</h:body>

Esquerdo

Centro

Figura 6.6
Renderizao do
Exemplo de
Layout 2 (Parcial).

Finalmente, tambm possvel programar pginas mais sofisticadas aninhando elementos


do tipo layout. Nesse caso, os elementos de layout internos devem conter o atributo fullPage
como false. No cdigo do Exemplo de Layout 3, temos dois layouts aninhados, com a renderizao sendo mostrada na figura 6.7.

Captulo 6 - JSF Internacionalizao, AJAX e Primefaces

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

JAVA Frameworks e Aplicaes Corporativas

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

Se o componente ser mostrado

value

Dados a serem apresentados

var

Nome da varivel que receber os dados na iterao usada para preencher a tabela

rows

Nmero de linhas a serem mostradas por pgina

paginator

(true/false) se haver paginao

style, styleClass

CSS usado na tabela

Figura 6.8
Exemplo de
DataTable.

O cdigo fonte a seguir exemplifica o uso de <p:dataTable>, com a definio de alguns de


seus atributos. No o cdigo utilizado para montar a dataTable da figura 6.8.

Captulo 6 - JSF Internacionalizao, AJAX e Primefaces

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

JAVA Frameworks e Aplicaes Corporativas

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

Se o calendrio ser mostrado

mindate

Data mnima mostrada no calendrio

maxdate

Data mxima mostrada no calendrio

pattern

Padro das datas, como elas so representadas

showOn

inline: o calendrio renderizado na prpria pgina, ocupando espao considervel


popup: ao clicar no componente (ou imagem), o calendrio apresentado em uma nova janela

Figura 6.9
Exemplo de
Calendar.

O cdigo a seguir traz um exemplo de uso de usando <p:calendar>.


<h:form id=form>
<h3>Inline</h3>
<p:calendar value=#{exemploMB.date1}
mode=inline id=inlineCal/>
<h3>Popup</h3>
<p:calendar value=#{exemploMB.date2}
id=popupCal />
<h3>Popup Button</h3>
<p:calendar value=#{exemploMB.date3}
id=popupButtonCal showOn=button />
</h:form>

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,

Captulo 6 - JSF Internacionalizao, AJAX e Primefaces

weekHeader: Semana,

allDayText : Todo Dia


};

113

E no componente usa-se o atributo locale, conforme a seguir:


<h:form id=form>
<h3>Inline</h3>
<p:calendar value=#{exemploMB.date1}
locale=pt_BR
mode=inline id=inlineCal/>
</h:form>

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

Se o componente ser mostrado

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

O valor do campo, que pode ser ligado a um atributo de um MB

A seguir um exemplo de uso do InputMask.


<p:inputMask value=#{exemploMB.data}
mask=99/99/9999/>

As mscaras so formadas por caracteres pr-definidos que indicam o padro permitido.


Caracteres utilizados em mscaras:

11 # indica um nmero de 0-9


11 A indica um caractere alfanumrico: 0-9, a-Z

JAVA Frameworks e Aplicaes Corporativas

11 ? indica um caractere: a-Z

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/>

<h:outputText value=Phone: />


<p:inputMask value=#{maskController.phone}
mask=(999) 999-9999/>
<h:outputText value=Phone with Ext: />
<p:inputMask
value=#{maskController.phoneExt}
mask=(999) 999-9999? x99999/>
<h:outputText value=taxId: />
<p:inputMask value=#{maskController.taxId}
mask=99-9999999/>
<h:outputText value=SSN: />
<p:inputMask value=#{maskController.ssn}
mask=999-99-9999/>
<h:outputText value=Product Key: />
<p:inputMask
value=#{maskController.productKey}
mask=a*-999-a999/>
<p:commandButton value=Reset
type=reset />
<p:commandButton value=Submit
update=display
oncomplete=PF(dlg).show()/>
</h:panelGrid>
</p:panel>
</h:form>

O componente <p:editor> usado para que o usurio possa entrar textos com formatao
rica: negrito, fonte, cores etc.
Atributo

Descrio

rendered

Se o componente ser mostrado

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

CSS usado no componente

Tabela 6.7
Atributos de
<p:editor>.

Um editor inserido em um formulrio atravs da tag <p:editor>, como no exemplo a seguir.

Captulo 6 - JSF Internacionalizao, AJAX e Primefaces

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

JAVA Frameworks e Aplicaes Corporativas

exibe um exemplo do mesmo renderizado.

116

Tabela 6.8
Atributos de
<p:pickList>.

Atributo

Descrio

rendered

Se o componente ser mostrado

value

Valor do componente, com as opes a serem mostradas e a lista de elementos escolhidos. Usa a
interface DualListModel.

itemLabel

O texto que ser mostrado para cada item

itemValue

O valor que ser submetido para cada item

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);

Quando o formulrio submetido, essas listas so atualizadas no MB e podem ser acessadas


com os mtodos:
11 getSource(): obtm a lista de origem dos dados (lista esquerda);
11 getTarget(): obtm a lista de destido (escolha) dos dados (lista direita).
O cdigo a seguir apresenta um exemplo de Managed Bean que instancia uma DualListModel e preenche a lista da esquerda com vrias strings.
@Named
public class PickListBean {
private DualListModel<String> cities;
@PostConstruct
public void init() {
List<String> source = new ArrayList<String>();
List<String> target = new ArrayList<String>();
source.add(Istanbul);
source.add(Ankara);
source.add(Izmir);
source.add(Antalya);
source.add(Bursa);
cities = new DualListModel<String>(source,
target);
}
public DualListModel<String> getCities() {
return cities;
}
public void setCities(DualListModel<String> cities) {
this.cities = cities;
}
}

Google Maps <p:gmap>


O componente <p:gmap> usado para apresentar uma localizao no Google Maps exibido
na tela do usurio. Com esse componente possvel mostrar localizaes, criar marcas, usar
o street view, entre outras facilidades.
A tabela 6.9 apresenta alguns atributos do <p:gmap>, enquanto a que figura 6.12 mostra
como este apresentado ao usurio, assim como trecho de cdigo exemplificando o uso

Captulo 6 - JSF Internacionalizao, AJAX e Primefaces

Figura 6.11
Renderizao de
um <p:pickList>.

Istanbul
Ankara
Izmir
Antalya
Bursa

do componente.
117

Atributo

Descrio

rendered

Se o componente ser mostrado

center

Define em que local o mapa estar centralizado

model

Atributo que define a propriedade do MB que receber a localizao

zoom

Define o zoom inicial

streetView

(true/false) se vai ser habilitado o street view neste mapa

type

Tipo do mapa (hybrid, satellite, terrain)

style, styleClass

CSS aplicado ao componente

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.

JAVA Frameworks e Aplicaes Corporativas

@Named

118

@RequestScoped
public class ExemploMB {

private MapModel localizacao = new DefaultMapModel();

@PostConstruct

public void init() {

localizacao = new DefaultMapModel();

}

}

// setters/getters

Accordion Panel <p:accordionPanel>


O Accordion Panel um componente usado para mostrar diversas informaes em formatos de abas, com efeito de acordeo.
Usa-se o componente <p:accordionPanel> para definir o Accordion Panel, e suas abas so
definidas com o componente <p:tab>. Os principais atributos de cada um desses componentes so mostrados, respectivamente, nas tabelas 6.10 e 6.11, a seguir.

Tabela 6.10
Atributos de
<p:accordion
de Panel>.

Tabela 6.11
Atributos de
<p:tab>.

Atributo

Descrio

rendered

Se o componente ser mostrado

onTabChange

script (JS) usado para tratar a mudana de abas pelo cliente

style, styleClass

CSS usado no componente

Atributo

Descrio

rendered

Se a aba ser mostrada

title

Ttulo da aba

tooltip

Texto de ajuda da aba

titleStyle, titleStyleClass

CSS usado para para a aba

disable

(true/false) se a aba est desabilitada

closable

(true/false) torna a aba fechvel

A figura 6.13 mostra como um Accordion Panel apresentado ao usurio.


Teste 1
Teste 2
Teste 2
Teste 3
O cdigo a seguir corresponde ao Accordion Panel, apresentado na figura anterior.
<p:accordionPanel>
<p:tab title=Teste 1>
Teste1
</p:tab>
<p:tab title=Teste 2>
Teste2
</p:tab>
<p:tab title=Teste 3>

Teste3

</p:tab>
</p:accordionPanel>

Menus <p:menu>
O componente <p:menu> usado para criar menus de navegao. Os itens de menu so

Captulo 6 - JSF Internacionalizao, AJAX e Primefaces

Figura 6.13
Exemplo de
Accordion Panel.

criados com <p:menuItem>. Os atributos de cada um desses componentes so apresentados


nas tabelas 6.12 e 6.13 respectivamente.
119

Atributo

Descrio

rendered

Se o componente ser mostrado

style, styleClass

CSS usado no componente

Tabela 6.12
Atributos de
<p:menu>.

Atributo

Descrio

rendered

Se o item ser mostrado

value

O texto do item

action, actionListener

Mtodos a serem invocados quando o item pressionado

disabeld

Se o item estar desabilitado

url

URL para onde a aplicao ser redirecionada quando o item for pressionado

icon

Imagem do item de menu

style, styleClass

CSS usado no componente

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:menuitem value=Google url=http://www.google.com />

<p:menuitem value=Hotmail url=http://www.hotmail.com />

<p:menuitem value=Youtube url=http://www.youtube.com />

<p:menuitem value=Facebook url=http://www.facebook.com />

</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.

JAVA Frameworks e Aplicaes Corporativas

Top content

120

Google

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 />

Para personalizar uma imagem a ser utilizada em um Item de Menu, devemos:


11 Ter um CSS com uma classe, que ser usada no item, exemplo, estilo.css, com a classe .teste;
.teste {
background-image:
url(#{resource[img/pessoa.gif]})
!important;
background-size: 16px 16px;
}

11 Ter criado o diretrio resources contendo: css e img;


11 Dentro de css, colocar estilo.css que contm o CSS para a imagem;
11 Dentro do diretrio img, colocar a imagem, por exemplo, pessoa.gif;
11 Adicionar o CSS na pgina XHTML com <h:outputStylesheet>;
<h:head>
<title>Facelet Title</title>
<h:outputStylesheet name=estilo.css

11 Usar o nome da classe CSS no atributo icon de <p:menuitem>


<p:menuitem value=Gmail
url=http://www.google.com
icon=teste />

A figura 6.16 mostra um item de menu com imagem personalizada.


Gmail
Figura 6.16
Exemplo de Item de
Menu com imagem
personalizada.

Hotmail
Yahoo Mail

Captulo 6 - JSF Internacionalizao, AJAX e Primefaces

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

Se o componente ser mostrado

label

O ttulo do submenu

icon

cone para o submenu, nos mesmos moldes de menu item

style, styleClass

CSS usado no componente

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.

Barra de Menus <p:menubar>


Para a criao de uma barra de menus horizontal, usa-se o componente <p:menubar>.
A Tabela 6.15 mostra alguns atributos de MenuBar.
Atributo

Descrio

rendered

Se o componente ser mostrado

autoDisplay

(true/false) se o primeiro nvel de menus ser mostrado automaticamente quando o mouse


passa por cima

style, styleClass

CSS usado no componente

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>

Mail

Vdeos

Gmail
Hotmail
Yahoo Mail

Boto de Menus <p:menuButton>


Para se criar um Boto de Menu, usa-se o componente <p:menuButton>. Dentro, coloca-se
componentes do tipo <p:menuitem> para as opes clicveis. A tabela 6.16 mostra alguns
atributos do Boto de Menu.

Tabela 6.16
Atributos de
Boto de Menu.

Atributo

Descrio

rendered

Se o componente ser mostrado

value

O texto do boto

disabled

Para desabilitar o boto

style, styleClass

CSS usado no componente

Captulo 6 - JSF Internacionalizao, AJAX e Primefaces

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 />

E no ManagedBean podemos usar:


FacesContext context =
FacesContext.getCurrentInstance();
context.addMessage(mensagens1, facesMessage1);
context.addMessage(mensagens1, facesMessage2);
context.addMessage(mensagens2, facesMessage3);

Nesse exemplo, facesMessage1 e facesMessage2 sero apresentados no <p:messages> e


facesMessage3 no <p:growl>.

JAVA Frameworks e Aplicaes Corporativas

A figura 6.20 mostra como Growl apresentado.

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

Mapeamento Objeto/Relacional; Ciclo de Vida de Persistncia; Unidade de Trabalho;


Contexto de Persistncia; Estados, atributos transientes e interfaces do Hibernate.

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;

11 Transforma dados das tabelas em um grafo de objetos;


11 Mascara o acesso ao banco, facilitando a interface com ele;
11 Aumenta a velocidade de desenvolvimento;
11 Mascara o uso de SQL;
11 Indicado para aplicaes com uma modelagem rica de Objetos.
Um de seus principais objetivos mascarar o acesso ao banco, facilitando a interface com
ele, aumentando a velocidade de desenvolvimento, evitando o uso de SQL. Por suas caractersticas e funcionalidades, fortemente indicado para aplicaes com uma modelagem rica
de Objetos.
Basicamente o que se quer transformar:

11 Um registro de uma tabela no banco de dados em Objeto do sistema; ou


11 Objetos do sistema em registros no BD.
Em geral, se pensa em:
11 Corresponder cada tabela a uma classe;
11 Corresponder cada registro da tabela a um objeto.

Captulo 7 - Hibernate

objetivos

Hibernate

125

Problemas podem ocorrer:


11 Herana;
11 Objetos com coleo de outros objetos.
11 Etc.
A figura 7.1 mostra uma correspondncia simples.
Veiculo

Veiculo

Veiculo

- String modelo - Gol;


- String cor - Preto;
- int ano - 2002;

- String modelo - Uno;


- String cor - Branco;
- int ano - 2005;

- String modelo - Plio;


- String cor - vermelho;
- int ano - 2006;

tb_veiculo
Modelo

Cor

Ano

Gol

Preto

2002

Uno

Branco

2005

Plio

Vermelho

2006

Para usar o Hibernate, precisa-se:

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

JAVA Frameworks e Aplicaes Corporativas

esse Framework na criao do projeto, juntamente com a adio do Framework JSF.


1. Criar o Projeto, adicionando o framework Hibernate;

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.

As principais anotaes so:


11 @Entity: indica que persistente;
11 @Id: indica que uma propriedade Primary Key;
11 @Table: indica a tabela correspondente;
11 @SequenceGenerator/@GeneratedValue: indicam atributos autoincrementveis.
Sero vistos em seo especfica no decorrer do material.
O cdigo a seguir implementa a classe persistente Aluno.java.
@Entity
@Table (name=tb_aluno)
@SequenceGenerator(name=sequencia, sequenceName=seq_id)
public class Aluno {

private Long id;

private String nome;

public Aluno() {

}
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,

generator=sequencia)

public Long getId() {

return id;

public void setId(Long id) {

this.id = id;

public String getNome() {

return this.nome;

public void setNome(String nome) {

this.nome = nome;

JAVA Frameworks e Aplicaes Corporativas

Essa classe pode estar relacionada seguinte tabela, definida pelo seu DDL:
CREATE TABLE tb_aluno (
id

integer NOT NULL,

nome

character varying(30),

CONSTRAINT pk_id PRIMARY KEY (id)


)
CREATE SEQUENCE seq_id
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 10
CACHE 1;

128

Acesso simples ao banco de dados: insero e consulta


Para se fazer uma insero em uma base de dados usando hibernate, deve-se seguir uma
sequncia simples de passos:
1. Cria-se um objeto (se no existir) de uma classe persistente;

2. Obtm-se a sesso hibernate corrente, ou abre-se uma nova;


3. Cria-se uma transao;
4. Salva-se o objeto;
5. Efetiva-se a transao (commit);
6. Fecha-se a sesso.
O cdigo a seguir mostra os passos para insero.
// Criao do objeto
Aluno aluno = new Aluno();
aluno.setNome(nomeAluno);
// Obter sesso hibernate corrente
Session session = HibernateUtil.getSessionFactory()
.openSession();
// Inicializao da transao
session.beginTransaction();
// Salvamento do Objeto
session.save(aluno);
// Efetivao da transao
session.getTransaction().commit();
session.close();

Para se fazer uma consulta, seguimos os seguintes passos:


1. Obtm-se a sesso hibernate corrente ou abre-se uma nova;

2. Cria-se uma transao;


3. Consulta-se a base via HQL ou Criteria;
4. Efetiva-se a transao (commit);
5. Fecha-se a sesso.
O cdigo a seguir apresenta um exemplo de consulta.
// Obtem-se sesso corrente do hibernate
Session session = HibernateUtil.getSessionFactory()
.openSession();
// Inicia-se a transao
session.beginTransaction();
Query select = session.createQuery(from Aluno);
List objetos = select.list();
// Efetiva-se a transao
session.getTransaction().commit();
session.close();

Captulo 7 - Hibernate

// Efetua-se a consulta (aqui em HQL)

129

Managed Bean e XHTMLs


Dependendo da arquitetura escolhida para o desenvolvimento do sistema, o acesso s
classes anotadas pode ser feito de vrias formas. Nesse material ser mostrada a maneira
mais simples, onde o Managed Bean possui um atributo do tipo da classe persistente e, em
mtodos especficos para acesso ao banco, essa classe persistida ou recuperada, usando-se
a API do Hibernate.
A seguir, apresentado o Managed Bean AlunoMB, que gerencia os dados das telas.
@Named(value = alunoMB)
@RequestScoped
public class AlunoMB {
private Aluno aluno;
private List<Aluno> listaAlunos;
public AlunoMB() {
}
@PostConstruct
public void init() {
this.aluno = new Aluno();
}

Nesse MB, o mtodo salvar() usa a API do Hibernate para salvar a classe persistente aluno
que j est preenchida no MB.

public String salvar() {


// salva o aluno
Session session = HibernateUtil.getSessionFactory()

.openSession();
session.beginTransaction();
session.save(this.aluno);
session.getTransaction().commit();
session.beginTransaction();
// lista todos os alunos
Query query = session.createQuery(from Aluno);

JAVA Frameworks e Aplicaes Corporativas

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.

public String listar() {


Session session = HibernateUtil.getSessionFactory()

.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;

}
}

O indexemplo:xhtml um formulrio com dois botes. Quando o boto Salvar pressionado,


o mtodo salvar() invocado. Quando o boto Listar pressionado, o mtodo listar()
invocado. A seguir, o arquivo indexemplo:xhtml.
<h:body>
<h:form>
Nome: <h:inputText value=#{alunoMB.aluno.nome} />
<h:commandButton action=#{alunoMB.salvar()}
value=Salvar />
<h:commandButton action=#{alunoMB.listar()}
value=Listar />
</h:form>
</h:body>

<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().

<f:facet name=header >

131

<h:outputText value=ID />


</f:facet>
#{a.id}
</h:column>
<h:column>
<f:facet name=header >
<h:outputText value=NOME />
</f:facet>
#{a.nome}
</h:column>
</h:dataTable>
<h:link outcome=index value=Incio />
</h:body>

Arquivo de Configurao: hibernate.cfg.xml


O arquivo hibernate.cfg.xml o arquivo que contm as configuraes de acesso ao banco de
dados e informaes sobre as classes que so persistentes. um arquivo XML, onde tags
especficas indicam informaes como: banco de dados, usurio, senha, dialeto SQL etc.
A seguir, um exemplo de arquivo hibernate.cfg.xml, que configura a conexo com um banco
de dados.
<?xml version=1.0 encoding=utf-8?>
<!DOCTYPE hibernate-configuration PUBLIC -//Hibernate/Hibernate Configuration DTD
3.0//EN
http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd>
<hibernate-configuration>
<session-factory>

<property name=hibernate.connection.driver_class>

org.postgresql.Driver

</property>
<property name=hibernate.connection.url>

jdbc:postgresql://localhost:5432/curso

</property>

JAVA Frameworks e Aplicaes Corporativas

<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>

Contedo de uma aplicao


A figura 7.2 mostra os diretrios e seus contedos para uma aplicao usando Hibernate.
app
Pginas HTML, XHTML, CSS, JS,
pode-se criar subdiretrios

Pginas HTML, XHTML, CSS, JS


WEB-INF
web.xml

Congurao app web

faces-cong.xml

Congurao JSF, vazio no uso de Anotaes

beans.xml

Ativao do CDI, arquivo vazio

classes
hibernate.cfg.xml

Diretrio contendo Servlets,


classes, beans, DAOs, etc
Arquivo de congurao do Hibernate

Arquivos.class
lib

Diretrio contendo os JARS


das bibliotecas
Bibliotecas

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.

Conceitos e Ciclo de Vida


Alguns conceitos so de extrema importncia para o entendimento do Hibernate:
11 Ciclo de Vida de Persistncia: estados e transies de estados que dizem respeito

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;

11 Persistentes: objetos que possuem um correspondente na base e j esto persistidos;


11 Removidos: objeto marcado para remoo no final do processo corrente;
11 Desligados: objetos persistidos, mas que esto fora de um contexto de persistncia.
Exemplo: objetos que ainda existem depois que uma sesso foi fechada. No h
garantia de sincronismo desses com a base.

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,

JAVA Frameworks e Aplicaes Corporativas

usa-se @Id, como no exemplo a seguir:

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;
}

Alguns atributos de @Column so:

11 length: limita a quantidade de caracteres em uma string;


11 nullable: se o campo pode ter null ou no;
11 unique: se a coluna pode ter campos repetidos ou no;
11 precision: quantidades de dgitos de um nmero decimal;
11 scale: quantidade de casas decimais de um nmero decimal.
E seu uso pode ser observado no exemplo a seguir.
@Entity
public class Pessoa {
@Id
private Long id;
@Column(length=30, nullable=false, unique=true)
private String nome;
@Column(precision=3, scale=2)
private BigDecimal altura;
}

Deve-se manter a consistncia entre os tamanhos na anotao e nas tabelas. O Hibernate


possui ferramentas de Engenharia Reversa que conseguem crias as classes persistentes a
partir de um banco de dados j criado, e vice-versa.
11 Deve-se manter a consistncia entre o banco de dados e as anotaes;

22 Dado uma Base de Dados, gera todas as Classes Persistentes;


22 Dadas as Classes Persistentes, gera o Banco de Dados.

Captulo 7 - Replicao

11 Hibernate tem ferramentas de Engenharia Reversa.

135

Chaves primrias
Para chaves primrias simples, anota-se com @Id o atributo cujo campo a chave.
So tipos permitidos para chaves primrias:

11 Tipos primitivos (e seus wrappers);


11 String;
11 java.util.Date;
11 java.sql.Date;
11 java.math.BigDecimal;
11 java.math.BigInteger.
Para chaves autogeradas, usa-se tipos discretos (inteiros). Para chaves compostas,
cria-se uma classe contendo as respectivas chaves:
11 Classe que contm as chaves deve ser anotada com @Embeddable. Deve implementar os mtodos equals() e hashCode();
11 Na entidade, anota-se o atributo contendo a classe das chaves com @EmbeddedId
(javax.persistence.EmbeddedId).
Os exemplos a seguir mostram o uso de chave composta.
@Embeddable
public class PessoaPK implements Serializable {
@Column(name=pess_idade)
protected Integer idade;
@Column(name=pess_cpf)
protected String CPF;
public PessoaPK() {}
// equals, hashCode
}
@Entity
public class Pessoa implements Serializable {
@EmbeddedId
private PessoaPK pessoaPK;
private String endereco;

JAVA Frameworks e Aplicaes Corporativas

// setters/getters
}

Caractersticas de uma Classe de Chave Primria (composta):


11 Classe deve ser pblica;
11 Propriedades devem ser pblicas ou protegidas;
11 Deve ter um construtor pblico, sem argumentos;
11 Deve implementar hashCode() e equals(Object other);
11 Deve implementar Serializable;
11 Deve representar mltiplos atributos da classe de entidade;
11 Os nomes da classe de chave primria e dos atributos na entidade que so chaves
primria, devem coincidir;

136

Para gerao automtica de chaves primrias, usa-se @GeneratedValue, que possui os


seguintes atributos:
strategy: maneira de gerar a chave primria, que pode ser:

11 GenerationType.AUTO: (default) usa o tipo de gerao definido no banco de


dados subjacente;
11 GenerationType.IDENTITY: atribui uma chave primria usando o campo identity
da tabela;
11 GenerationType.SEQUENCE: atribui uma chave primria usando uma sequence;
11 GenerationType.TABLE: usa uma tabela criada para manter as chaves primrias.
Quando a estratgia definida via o uso de uma sequncia, preciso utilizar a anotao
@SequenceGenerator e alguns atributos especficos.
@GeneratedValue(strategy=GenerationType.SEQUENCE)

11 Cria um sequenciador que atribui valores chave primria na hora da persistncia


(antes do commit());
11 Pode ser um contador ou um elemento sequence do banco;
11 global aplicao: vrias entidades podem us-lo.
Atributos de @SequenceGenerator:
11 name: nome da sequence, usado internamente pelas entidades na anotao
@GeneratedValue;
11 initialValue: (default 1) valor inicial das sequncias geradas;
11 allocationSize: (default 50) incremento usado na gerao dos nmeros;
11 sequenceName: o nome do elemento Sequence no banco de dados.
Os exemplos a seguir mostram dois tipos de sequenciadores. O primeiro inicia seu valor em 1
e retorna valores espaados em 100.
@Entity
@SequenceGenerator(name=seq, initialValue=1,
allocationSize=100)
public class Pessoa {
@GeneratedValue(strategy=GenerationType.SEQUENCE,

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:

11 TemporalType.DATE: armazena apenas data;


11 TemporalType.TIME: armazena apenas horrio;
11 Temporal.TIMESTAMP: (default) armazena data e hora.
O exemplo a seguir mostra o uso de datas.
@Entity
public class Pessoa {
@Id
@GeneratedValue
private Long id;
@Temporal(TemporalType.DATE)
private Calendar nascimento;
}

LOB: Large Objects


Para persistncia de objetos grandes (Large Objects: lOB), anota-se o atributo com @Lob.
So tipos permitidos:
11 String;
11 byte[];
11 Byte[];
11 char[];
11 Character[].

JAVA Frameworks e Aplicaes Corporativas

O exemplo a seguir mostra um exemplo de uso de LOB.

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;
}

Mtodo de acesso aos atributos


O JPA, e portanto o Hibernate, fornece dois tipos de acesso aos atributos de uma entidade.
Tipos de Acesso:

11 Field Access: quando as anotaes so colocadas nos atributos; Hibernate acessa


os dados direto, via reflection. No usa os mtodos getters/setters (so ignorados
pelo Hibernate)
11 Property Access: quando as anotaes so colocadas nos mtodos get().
O Hibernate usa os mtodos getters/setters para acessar os dados que devem estar
obrigatoriamente implementados
O Hibernate usa o acesso definido pela anotao @Id para definir qual o tipo que ser
usado na classe persistente. O programador deve usar sempre o mesmo tipo de acesso,
durante a mesma classe, sob a pena de o Hibernate ignorar determinadas consistncias que
estejam atreladas a acessos diferentes do determinado pelo @Id.

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:

11 Operaes CRUD: inseres, Atualizaes, Remoes e Consultas;


11 Execuo de Queries: consultas via HQL ou Criteria;
11 Controle de Transaes: commit/Rollback;

dos objetos.

Captulo 7 - Replicao

11 Gerenciamento do Contexto de Persistncia: manuteno e gerncia dos estados

139

Em termos de cdigo, temos as seguintes interfaces:


Interfaces do Hibernate:

11 Session: interface principal. Mantm o contexto de persistncia.


22 Automatic Dirty Checking: s atualiza objetos alterados;
22 Cache: mantm um cache com os objetos persistentes.
11 Query: efetua consultas via HQL;
11 Criteria: efetua consultas programaticamente;
11 Transaction: controla as transaes.

Iniciando uma Unidade de Trabalho


Usa-se um SessionFactory, por exemplo:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

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:

11 SessionFactory: caro de criar e portanto no deve ser criada a cada requisio;


11 Session: um objeto leve que no obtm uma conexo de imediato, por isso mesmo
podendo ser criada a cada conexo.
Todas as operaes ocorrem dentro de uma transao (Transaction) (tanto leitura
como escrita).

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();

JAVA Frameworks e Aplicaes Corporativas

Serializable pessoaId = session.save(p);


tx.commit();
session.close();

O mtodo save() retorna o Id do objeto persistido. O objeto sincronizado com o banco na


chamada do commit().

Recuperando um objeto persistente


Usa-se ou o mtodo get() ou o load(), como no exemplo a seguir:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Pessoa p = session.load(Pessoa.class, new Long(1));
// Pessoa p = session.get(Pessoa.class, new Long(1));
tx.commit();
session.close();

140

Diferenas entre get() e load():

11 get(): retorna o NULL se o objeto no existe;


11 load(): lana ObjectNotFoundException se o objeto no existe.
O objeto ficar em estado persistente at que a sesso seja fechada (entra em estado desligado).

Modificando um objeto persistente


Basta alterar uma propriedade de um objeto persistente e efetuar o commit() para sincronizar com o banco de dados.
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Pessoa p = session.get(Pessoa.class, new Long(1));
p.setNome(Maria);
tx.commit();
session.close();

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.

Religar um objeto desligado


Religar um objeto desligado se refere a objetos que j esto na base de dados, mas no
esto na sesso do hibernate (portanto desligados). Por exemplo, isso ocorre quando um
objeto, que j est na base de dados, alterado e entregue para um procedimento abrir
a sesso do hibernate e realizar as alteraes na base de dados. Como o objeto alterado
(seu Id) j est na base de dados e uma nova sesso do hibernate est sendo aberta, esse
objeto precisa ser religado na sesso para que haja um agendamento de um UPDATE na
base de dados.
Deve ser feito quando:

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

11 Tem-se um objeto que j est na base de dados;

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.

Removendo objeto Desligado


Um objeto Desligado passa a ser Transiente atravs do uso do mtodo delete(), como
no exemplo:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.delete(p);
tx.commit();
session2.close();

O delete(), nesse caso, religa o objeto com o contexto de persistncia e agenda a deleo do

JAVA Frameworks e Aplicaes Corporativas

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 Um-para-Um, Um-para-Muitos, Muitos-para-Um e Muitos-para-Muitos;


Cascateamento e Lazy Fetch.

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-

tence a somente uma pessoa;


11 um-para-muitos (@OneToMany): uma pessoa tem vrios endereos. Um endereo
pertence a somente uma pessoa;
11 muitos-para-um (@ManyToOne): uma pessoa tem somente um endereo. Um endereo pode ser de vrias pessoas. Basicamente uma inverso da um-para-muitos;
11 muitos-para-muitos (@ManyToMany): uma pessoa tem vrios endereos. Um endereo pode ser de vrias pessoas.
Para entender as associaes, dois conceitos so importante: cascateamento e Lazy Load.

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;

Captulo 8 - Hibernate Associaes

objetivos

Hibernate Associaes

143

11 CascadeType.REFRESH: cascateia a operao de refresh;

11 CascadeType.DETACH: cascateia a operao que desliga um objeto do contexto


de persistncia;
11 CascadeType.ALL: cascateia todas as operaes.

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 FetchType.EAGER: ao carregar um objeto, carrega todas as associaes imediatamente;


11 FetchType.LAZY: ao carregar um objeto, no carrega as associaes imediatamente,
somente nas chamadas dos getters.
Em toda associao @OneToOne, @OneToMany e @ManyToMany, podemos definir o tipo de
Fetch, sendo que o default FecthType.LAZY. Para trocar o tipo de Fetch em uma associao,
usa-se o atributo fetch das anotaes.
11 Em toda associao: @OneToOne, @OneToMany e @ManyToMany;

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;
}

A escolha de qual estratgia usar depende do sistema sendo desenvolvido e de requisitos de


desempenho e tempo de codificao. Eager demanda pouca codificao porque o prprio
hibernate j busca todos os dados dos objetos associados. O problema o desempenho,
pois podemos ter vrias associaes e podem ser buscados dados que no sero usados no
processo. J Lazy demanda um pouco mais de codificao, mesmo em HQL (que ser visto
em outra sesso) ou na manuteno da sesso, mas mais eficiente, pois as buscas so

JAVA Frameworks e Aplicaes Corporativas

feitas sob demanda, explicitamente. Preferencialmente os sistemas usam Lazy Fetch.

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

Nesta notao, as caixas representam as classes (e portanto so modelos para os objetos) e


a conexo entre elas representa a associao. O nmero perto da classe Endereo indica que
uma Pessoa pode ter um (1) Endereo. O nmero perto de Pessoa indica que um Endereo
pode ser de uma (1) Pessoa.
Uma associao pode ser bidirecional e, nesse caso, um dos lados deve ser o proprietrio
da associao. No proprietrio, a propriedade da associao anotada com @OneToOne
e responsvel por manter a coluna de associao. nessa classe que se declara a coluna
de ligao, que torna a associao existente no banco de dados. No lado oposto usada a
anotao @OneToOne, com um atributo chamado mappedBy, para indicar a propriedade do
lado inverso, que representa a associao.
Um dos lados deve ser o dono ou proprietrio da associao.

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

Opcional. O tipo de cascateamento entre as operaes.

fetch

Opcional. Se a associao ser carregada ou no (lazy) ao se buscar um objeto desse tipo.

mappedBy

Opcional. O campo que dono do relacionamento. Esse atributo s configurado do lado


inverso da associao (o que no o dono).

optional

Opcional. Se a associao opcional (pode ser nula).

orphanRemoval

Opcional. Se a operao de remoo deve ser aplicada na associao tambm.

targetEntity

Opcional. A classe da entidade alvo da associao

Captulo 8 - Hibernate Associaes

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

Opcional. Nome da coluna de ligao entre as tabelas.

nullable

Opcional. Se a coluna pode ser NULL.

table

Opcional. Nome da tabela onde est a coluna de ligao.

unique

Opcional. Se a propriedade uma chave nica.

As classes da figura 8.1 podem ser mapeadas para as seguintes tabelas:


create table tb_pessoa (
id

integer

NOT NULL PRIMARY KEY,

pess_nome character varying(30)

NOT NULL);

create table tb_endereco (


id

integer NOT NULL PRIMARY KEY,

end_rua

character varying(30) NOT NULL,

end_numero integer NOT NULL);


alter table tb_pessoa add end_id integer not null REFERENCES tb_endereco(id);
CREATE SEQUENCE seq_pess_id
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 11
CACHE 1;
CREATE SEQUENCE seq_end_id
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 11
CACHE 1;

A classe Pessoa deve ser anotada conforme o trecho de cdigo a seguir:


package com.cursojava.model;
JAVA Frameworks e Aplicaes Corporativas

// imports

146

@Entity
@Table (name=tb_pessoa)
@SequenceGenerator(name=sequencia, sequenceName=seq_pess_id)
public class Pessoa implements Serializable {

private Long id;

private String nome;

private Endereco endereco;

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,
generator=sequencia)

public Long getId() {

return id;

Tabela 8.2
Atributos de
@JoinColumn.

public void setId(Long id) {

this.id = id;

@Column(updatable=true, name=pess_nome, nullable=false, length=30)

public String getNome() {

return this.nome;

public void setNome(String nome) {

this.nome = nome;

}
@OneToOne(cascade=CascadeType.ALL)

@JoinColumn(name=end_id, updatable=true)

public Endereco getEndereco() {

return this.endereco;

public void setEndereco(Endereco 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{

private Long id;

private String rua;

private Integer numero;

private Pessoa pessoa;

@Id

@GeneratedValue(strategy=GenerationType.SEQUENCE, generator=seq_end)

public Long getId() {

return id;

}
public void setId(Long id) {

this.id = id;

@Column(updatable=true, name=end_rua, nullable=false, length=30)

public String getRua() {

return this.rua;

public void setRua(String rua) {

this.rua = rua;

@Column(updatable=true, name=end_numero, nullable=false)

public Integer getNumero() {

Captulo 8 - Hibernate Associaes

147

return this.numero;

public void setNumero(Integer numero) {

this.numero = numero;

@OneToOne(mappedBy = endereco)

public Pessoa getPessoa() {

return this.pessoa;

public void setPessoa(Pessoa pessoa) {

this.pessoa = pessoa;

}
}

Por fim, apresentamos um trecho de cdigo usando esta configurao de associao:


Pessoa pessoa = new Pessoa();
pessoa.setNome(Joo);
Endereco endereco = new Endereco();
endereco.setRua(Rua XV de Novembro);
endereco.setNumero(500);
pessoa.setEndereco(endereco);
endereco.setPessoa(pessoa);
Session session = HibernateUtil.getSessionFactory()
.openSession();
session.beginTransaction();
session.save(pessoa);
session.getTransaction().commit();
session.close();

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

ligao entre as duas entidades, usando a notao UML.

148

Professor
- nome : String
- salario : double
- dataAdmissao : Date

Disciplina

- nome : String
- carga : int

Como no primeiro exemplo, as caixas representam as classes (e portanto so modelos para


os objetos), e a conexo entre elas representa a associao. O asterisco perto da classe
Disciplina indica que um professor pode ministrar nenhuma ou vrias (*, ou 0..*) Disciplinas.
O nmero perto de Professor indica que uma Disciplina pode ser ministrada por somente
um (1) Professor.

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

Opcional. O tipo de cascateamento entre as operaes.

fetch

Opcional. Se a associao ser carregada ou no (lazy) ao se buscar um objeto desse tipo.

mappedBy

Opcional. O campo que dono do relacionamento. Esse atributo s configurado do lado


inverso da associao (o que no o dono).

orphanRemoval

Opcional. Se a operao de remoo deve ser aplicada na associao tambm.

targetEntity

Opcional. A classe da entidade alvo da associao

Atributos

Descrio

cascade

Opcional. O tipo de cascateamento entre as operaes.

fetch

Opcional. Se a associao ser carregada ou no (lazy) ao se buscar um objeto desse tipo.

optional

Opcional. Se a associao opcional (pode ser nula)

Tabela 8.4
Atributos de
@ManyToOne.

As classes da figura 8.2 podem ser mapeadas para as seguintes tabelas:


create table tb_professor (
id

integer

NOT NULL PRIMARY KEY,

prof_nome character varying(30)


prof_salario numeric(10, 2)
prof_dtadmissao date

NOT NULL,

NOT NULL,

NOT NULL);

Captulo 8 - Hibernate Associaes

A tabela 8.4 mostra os atributos de @ManyToOne.

149

create table tb_disciplina (


id

integer NOT NULL PRIMARY KEY,

disc_nome

character varying(30) NOT NULL,

disc_cargainteger NOT NULL);


alter table tb_disciplina add prof_id integer not null REFERENCES tb_professor(id);
CREATE SEQUENCE seq_prof_id
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 11
CACHE 1;
CREATE SEQUENCE seq_disc_id
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 11
CACHE 1;

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 {

private Long id;

private String nome;

private Double salario;

private Date dataAdmissao;

private List<Disciplina> disciplinas;

@Id
JAVA Frameworks e Aplicaes Corporativas

@GeneratedValue(strategy=GenerationType.SEQUENCE,generator=seq_prof)

150

public Long getId() {

return id;

public void setId(Long id) {

this.id = id;

@Column(updatable=true, name=prof_nome, nullable=false, length=30)

public String getNome() {

return this.nome;

public void setNome(String nome) {

this.nome = nome;

@Column(updatable=true, name=prof_salario, nullable=false)

public Double getSalario() {

return this.salario;

public void setSalario(Double salario) {

this.salario = salario;

@Column(updatable=true, name=prof_dtadmissao, nullable=false)

public Date getDataAdmissao() {

return this.dataAdmissao;

public void setDataAdmissao(Date dataAdmissao) {

this.dataAdmissao = dataAdmissao;

@OneToMany(mappedBy=professor, cascade=CascadeType.ALL,

fetch=FetchType.EAGER)

public List<Disciplina> getDisciplinas() {

return this.disciplinas;

public void setDisciplinas(List<Disciplina> disciplinas) {

this.disciplinas = disciplinas;

}
}

Temos agora as anotaes na classe Disciplina.


package com.cursojava.model;
// imports
@Entity
@Table (name=tb_disciplina)
@SequenceGenerator(name=seq_disc, sequenceName=seq_disc_id)
public class Disciplina implements Serializable{

private Long id;

private String nome;

private Integer carga;

private Professor professor;

@Id
generator=seq_disc)

public Long getId() {

return id;

public void setId(Long id) {

this.id = id;

@Column(updatable=true, name=disc_nome, nullable=false, length=30)

public String getNome() {

return this.nome;

Captulo 8 - Hibernate Associaes

@GeneratedValue(strategy=GenerationType.SEQUENCE,

151

public void setNome(String nome) {

this.nome = nome;

@Column(updatable=true, name=disc_carga, nullable=false)

public Integer getCarga() {

return this.carga;

public void setCarga(Integer carga) {

this.carga = carga;

}
@ManyToOne
@JoinColumn(name=prof_id)

public Professor getProfessor() {

return this.professor;

public void setProfessor(Professor 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);

JAVA Frameworks e Aplicaes Corporativas

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();

As associaes do tipo Muitos-para-Um so feitas da mesma forma que as Um-para-Muitos,


basicamente alterando a ordem da associao. Mesmo nesse tipo de associao, no lado
many, isto , na anotao @ManyToOne, que deve ser declarado o campo de ligao.

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

Como no exemplos anteriores, as caixas representam as classes (e portanto so modelos para


os objetos), e a conexo entre elas representa a associao. O asterisco perto da classe Grupo
indica que um Usurio pode participar de nenhum ou de vrios (*, ou 0..*) Grupos. O asterisco
perto de Usurio indica que um Grupo pode conter nenhum ou vrios (*, ou 0..*) Usurios.
Como nos outros tipos de associaes, um dos lados deve ser o proprietrio da associao.
O proprietrio responsvel por manter uma tabela de associao, visto que somente um
campo em um dos lados no suficiente para denotar uma associao Muitos-para-Muitos.
No lado oposto, usado um atributo chamado mappedBy para indicar a propriedade do
lado inverso, que representa a associao.
11 Um dos lados deve ser o proprietrio da associao.

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

Opcional. O tipo de cascateamento entre as operaes.

fetch

Opcional. Se a associao ser carregada ou no (lazy) ao se buscar um objeto desse tipo.

mappedBy

Opcional. O campo que dono do relacionamento. Esse atributo s configurado do lado


inverso da associao (o que no o dono).

targetEntity

Opcional. A classe da entidade alvo da associao

Captulo 8 - Replicao

Tabela 8.5
Atributos de
@ManyToMany.

153

A tabela 8.6 mostra os atributos de @JoinTable.


Atributos

Descrio

joinColumns

Opcional. Lista de @JoinColumns indicando as colunas que referenciam a tabela que


dona da associao.

inverseJoinColumns

Opcional. Lista de @JoinColumns indicando as colunas que referenciam a tabela que no


dona da associao.

name

Opcional. Nome da tabela de ligao.

As classes da figura 8.3 podem ser mapeadas para as seguintes tabelas:


create table tb_usuario (
id

integer

NOT NULL PRIMARY KEY,

usuario_nome

character varying(50)

usuario_idade

integer

NOT NULL,

NOT NULL);

create table tb_grupo (


id

grupo_nome

integer NOT NULL PRIMARY KEY,


grupo_tipo

character varying(50) NOT NULL,


character varying(50) NOT NULL);

create table tb_usuario_grupo (


usuario_id integer NOT NULL REFERENCES tb_usuario(id),

grupo_id

integer NOT NULL REFERENCES tb_grupo(id));

CREATE SEQUENCE seq_usuario_id


INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 11
CACHE 1;
CREATE SEQUENCE seq_grupo_id
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 11
CACHE 1;

JAVA Frameworks e Aplicaes Corporativas

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 class Usuario implements Serializable {


private Long id;

private String nome;

private Integer idade;

private Collection<Grupo> grupos;

public Usuario() {

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,
generator=seq_usuario)

public Long getId() {

return id;

public void setId(Long id) {

this.id = id;

@Column(updatable=true, name=usuario_nome, nullable=false,

public String getNome() {

length=50)

return this.nome;

public void setNome(String nome) {

this.nome = nome;

@Column(updatable=true, name=usuario_idade, nullable=false)

public Integer getIdade() {

return this.idade;

public void setIdade(Integer 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;

public void setGrupos(Collection<Grupo> grupos) {


}
}

this.grupos = grupos;

Captulo 8 - Replicao

155

Aqui apresentamos as anotaes da classe Grupo.


package com.cursojava.model;
// imports
@Entity
@Table (name=tb_grupo)
@SequenceGenerator(name=seq_grupo, sequenceName=seq_grupo_id)
public class Grupo implements Serializable{

private Long id;

private String nome;

private String tipo;

private Collection<Usuario> usuarios;

public Grupo() {

}
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,

generator=seq_grupo)

public Long getId() {

return id;

public void setId(Long id) {

this.id = id;

@Column(updatable=true, name=grupo_nome, nullable=false, length=50)

public String getNome() {

return this.nome;

public void setNome(String nome) {

this.nome = nome;

@Column(updatable=true, name=grupo_tipo, nullable=false, length=50)

public String getTipo() {

return this.tipo;

public void setTipo(String tipo) {

JAVA Frameworks e Aplicaes Corporativas

156

this.tipo = tipo;

}
@ManyToMany(

cascade={CascadeType.PERSIST, CascadeType.MERGE},

mappedBy=grupos,

fetch=FetchType.EAGER)

public Collection<Usuario> getUsuarios() {

return this.usuarios;

public void setUsuarios(Collection<Usuario> 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

JAVA Frameworks e Aplicaes Corporativas

9
objetivos

Hibernate HQL e Criteria


Conhecer a linguagem HQL para construo de consultas similares s feitas
com SQL; Aprender sobre a biblioteca Criteria, usada para gerar consultas de forma
programtica, com validao de tipos e queries de forma segura.

conceitos

Consultas; HQL; JPQL; Criteria.

HQL
11 Hibernate Query Language.

11 Nvel alto de abstrao.


11 Consultas a objetos e classes (no em tabelas e registros).
11 Filtros so feitos em atributos (no em campos).
11 Baseada em SQL.
11 Orientada a objetos (herana, polimorfismo e associaes).
JPQL.
11 Linguagem do Java Persistence API.
11 Baseada em HQL.

as manipulaes sejam em classes e objetos, e no mais em tabelas e registros. Assim,


faz-se necessria uma linguagem de consulta, similar ao SQL, mas que manipule elementos
de orientao a objetos (e no elementos relacionais) e que implemente herana de forma
transparente, bem como polimorfismo e associaes.
Essa linguagem o HQL (Hibernate Query Language). Com ela possvel fazer consultas a
objetos de classes (e no registros de tabelas), filtrando os elementos por valores de atributos
(e no por valores de campos).
Toda a sintaxe HQL baseada no SQL, mas levando em conta os elementos de orientao a
objetos. A linguagem JPQL (JPA Query Language) a linguagem oficial do JPA (Java Persistence
API: Java EE), baseada no HQL.

Captulo 9 - Hibernate HQL e Criteria

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

O entendimento desta sesso pressupem que o aluno j esteja familiarizado com o


SQL e que o tenha utilizado anteriormente.

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
);

JAVA Frameworks e Aplicaes Corporativas

create table tb_aluno (

160

aluno_id serial primary key,


aluno_nm character varying(50)
);
create table tb_disciplina_aluno (
disc_id integer references tb_disciplina(disc_id),
aluno_id integer references tb_aluno(aluno_id)
);
alter table tb_professor add sala_id integer null REFERENCES tb_sala(sala_id);
alter table tb_disciplina add prof_id integer not null REFERENCES tb_
professor(prof_id);

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());
}

Para filtrar uma quantidade de resultados, normalmente usados em paginao de resultados,


usam-se os mtodos setFirstResult() e setMaxResults():
Filtrando Resultados:

11 setFirstResult(): a partir de qual resultado retornar;


11 setMaxResults(): a quantidade mxima de resultados retornados.
Query query = session.createQuery(FROM Aluno);
query.setFirstResult(20);
query.setMaxResults(10);
List<Aluno> resultado = query.list();

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.

Captulo 9 - Hibernate HQL e Criteria

WHERE feito com interrogao (?) e, para setar o valor, usa-se o mtodo setString(), pas-

161

Parmetros:

11 Com?: posio comea em 0;


11 Nomeado: usa-se o nome do parmetro;
11 Para preench-los:
22 setString()
22 setInt()
22 setDate()
Para retornar somente um elemento:
11 uniqueResult(): retorna um Object, e deve ser feito type cast para o tipo desejado
No FROM podemos usar alias para nomear as classes, como no exemplo:
FROM Disciplina as d
WHERE d.nome = Java III

Onde d usado para referenciar um objeto do tipo Disciplina. A palavra resevada AS


opcional e a query poderia ser escrita assim:
FROM Disciplina d
WHERE d.nome = Java III

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

SELECT, no so retornados elementos duplicados.

162

O IN, na clusula WHERE, verifica se o elemento est dentro de um conjunto de outros


elementos. Por exemplo:
SELECT DISTINCT p
FROM Professor p, IN(p.disciplinas) d

Retorna todos os professores que possuem disciplinas. Equivale a:


SELECT DISTINCT p
FROM Professor p JOIN p.disciplinas d
SELECT DISTINCT p
FROM Professor p
WHERE p.disciplinas IS NOT EMPTY

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%

11 Retorna todos os alunos cujo nome comeam com A.


11 Os caracteres coringa que podem ser usados so:
22 %: qualquer quantidade de caracteres;
22 _: um caractere qualquer.
As verificaes IS NULL e IS NOT NULL podem ser usadas para verificar a existncia de valor
em algum atributo, como no exemplo a seguir.
SELECT DISTINCT p

SQL ANSI - ISO/IEC


9075:2011: http://www.
iso.org/iso/iso_catalogue/catalogue_tc/
catalogue_detail.
htm?csnumber=53681

WHERE p.sala IS NULL

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

Captulo 9 - Hibernate HQL e Criteria

FROM Professor p

163

Para executar esta query, podemos usar o trecho de cdigo a seguir.


Query query = session.createQuery(SELECT DISTINCT p FROM Professor p WHERE
p.dataAdmissao BETWEEN :data1 AND :data2);
query.setDate(data1,
new SimpleDateFormat(dd/MM/yyyy).parse(03/03/2009));
query.setDate(data2,
new SimpleDateFormat(dd/MM/yyyy).parse(06/06/2009));
List<Professor> resultado = query.list();

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();

Onde o retorno do mtodo query.executeUpdate() a quantidade de linhas afetadas pelo


comando. A seguinte query executa uma deleo.
DELETE
FROM Sala s
WHERE s.numero = 200

Esse comando remove a sala 200.

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:

JAVA Frameworks e Aplicaes Corporativas

SELECT d

164

FROM Disciplina d JOIN d.professor p


WHERE p.nome = Pedro

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

E implcitas deixando o Hibernate resolver o JOIN:


SELECT d
FROM Disciplina d
WHERE d.professor.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:

11 Ao buscar Disciplina, NO retorna Professor;


11 Somente quando uma propriedade do professor acessada;
11 Para evitar isso, i, sempre buscar os dados da associao (evitar Lazy), faz-se:
SELECT d
FROM Disciplina d JOIN FETCH d.professor professor

Efeito colateral:
11 Traz todos os dados das entidades relacionadas;
11 Mesmo que no estejam explicitamente especificados no SELECT.

Captulo 9 - Hibernate HQL e Criteria

11 Associao Professor x Disciplina;

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

JAVA Frameworks e Aplicaes Corporativas

Para retornar elementos nicos, usa-se:

166

SELECT DISTINCT d
FROM Disciplina d JOIN d.alunos a

Ordenao com Order By


Para ordenar os elementos retornados, usa-se a clusula ORDER BY, como no exemplo a seguir.
SELECT a
FROM Aluno a
ORDER BY a.nome

Esse exemplo retorna todos os alunos, ordenando-os por nome. Podemos ordenar os resultados de forma ascendente ou descendente:

11 Ascendente: usa-se ORDER BY atributo ASC, a ordenao default;


11 Descendente: usa-se ORDER BY atributo DESC, a ordenao default.
No exemplo a seguir, a ordenao dos alunos ser de forma descendente.
SELECT a
FROM Aluno a
ORDER BY a.nome DESC

Clusulas Group By e Having


A clusula Group By agrupa os elementos retornados. Por exemplo, a consulta:
SELECT p.nome, COUNT(d)
FROM Professor p JOIN p.disciplinas d
GROUP BY p.nome

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

No exemplo, a consulta agrupa os professores retornando a mdia da carga horria de cada


um, considerando somente os professores com carga horria maior ou igual a 40 horas.

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

22 HQL s em tempo de execuo


22 Construo de queries de forma programtica
11 Objeto Criteria

Um exemplo de Criteria pode ser visto a seguir.


Criteria criteria = session.createCriteria(Professor.class);
List<Professor> lista = criteria.list();

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() );

Captulo 9 - Hibernate HQL e Criteria

22 Interface da API

167

A tabela a seguir apresenta alguns mtodos de Criteria.


Mtodo

Descrio

add()

Adiciona restries consulta

addOrder()

Adicionar uma ordenao (ascendente ou decrescente consulta)

createCriteria()

Cria um novo criteria para se fazer associaes

list()

Retorna uma lista de resultados

setFirstResult()

Limita os dados retornados, indicando qual o primeiro dado a ser retornado.


Usado em paginaes

setMaxResult()

Limita os dados retornados, indicando quandos devem ser retornados. Usado em paginaes

setProjection()

Adiciona uma projeo consulta

uniqueResult()

Retorna somente um resultado

Para paginao de resultados e limitar a quantidade de elementos retornados, usa-se

Tabela 9.1
Alguns mtodos
de Criteria.

setMaxResult() e setFirstResult(), como no exemplo a seguir:


Criteria criteria = session.createCriteria(Aluno.class);
criteria.setMaxResults(5);
criteria.setFirstResult(10);
List<Aluno> lista = criteria.list();

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);

JAVA Frameworks e Aplicaes Corporativas

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

Como nos exemplos:


Criteria criteria = session.createCriteria(Disciplina.class);
criteria.add( Restrictions.gt(carga, 40) );
List<Disciplina> lista = criteria.list();
Criteria criteria = session.createCriteria(Disciplina.class);
criteria.add( Restrictions.like(nome, Java%) );
List<Disciplina> lista = criteria.list();

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:

11 Restrictions.between: restrio Between;


11 Restrictions.isNull: verifica se nulo;
11 Restrictions.isNotNull: verifica se no nulo;
11 Restrictions.isEmpty: verifica se o valor vazio;
11 Restrictions.isNotEmpty: verifica se o valor no vazio.
Os exemplos a seguir mostram seu uso.
Criteria criteria = session.createCriteria(Professor.class);
criteria.add( Restrictions.between(dataAdmissao,
new SimpleDateFormat(dd/MM/yyyy).parse(03/03/2009),
new SimpleDateFormat(dd/MM/yyyy).parse(04/04/2009) ) );
List<Professor> lista = criteria.list();
Criteria criteria = session.createCriteria(Professor.class);
criteria.add( Restrictions.isNull(dataAdmissao) );
List<Professor> lista = criteria.list();
Criteria criteria = session.createCriteria(Professor.class);
criteria.add( Restrictions.isNotNull(dataAdmissao) );
List<Professor> lista = criteria.list();

causa da converso de datas.

Captulo 9 - Replicao

No caso da primeira consulta, deve-se colocar os comandos dentro de um try...catch por

169

Restringir a consulta por um valor em uma classe associada:

11 Cria-se um criteria a partir do criteria principal.


Exemplo:
11 Quando se quer retornar as Disciplinas, cria-se um criteria para Disciplina.class;
11 Para restringir por Professor da disciplina, cria-se um criteria a partir do atributo
professor;
11 Faz-se a restrio nesse ltimo criteria criado.
O exemplo a seguir retorna todas as disciplinas do professor Pedro. Para tal, cria-se um
Criteria principal para a classe Disciplina. Logo aps, um critria criado a partir deste, para
o atributo professor. Sobre esse ltimo feita a adio da restrio.
Criteria criteria = session.createCriteria(Disciplina.class);
Criteria critProfessor = criteria.createCriteria(professor);
critProfessor.add( Restrictions.eq(nome, Pedro) );
List<Disciplina> lista = criteria.list();

Combinao de Restries: AND e OR


As restries podem ser combinadas em clusulas do tipo AND (E) e OR (OU). Nas do tipo
AND, para que um dado seja retornado, todas as restries devem ser verdadeiras. Nas do
tipo OR, um dado retornado se pelo menos uma das restries verdadeira.
A combinao de restries feita atravs de objetos do tipo LogicalExpression, que so
criados atravs dos mtodos Restrictions.or() e Restrictions.and(). Para compor as restries,
cria-se objetos do tipo Criterion usando-se as restries vistas na subseo anterior.
Os elementos so:

11 LogicalExpression: a combinao de restries do tipo Criterion;


11 Criterion: uma restrio especfica;
11 Restrictions.or(): retorna um LogicalExpression do tipo AND;
11 Restrictions.and(): retorna um LogicalExpression do tipo AND.
No exemplo a seguir, sero retornadas todas as disciplinas cujo nome iniciam com Java e
possuem carga igual a 60 horas.
Criteria criteria = session.createCriteria(Disciplina.class);
JAVA Frameworks e Aplicaes Corporativas

Criterion restrNome = Restrictions.like(nome, Java%);


Criterion restrCarga = Restrictions.eq(carga, 60);
LogicalExpression restr = Restrictions.and(restrNome, restrCarga);
criteria.add(restr);
List<Disciplina> resultado = criteria.list();

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();

Para se adicionar mais de uma projeo, usa-se um ProjectionList, criado a partir da


chamada do mtodo Projections.projectionList(). Nesse objeto, usa-se o mtodo add() para
adicionar todas as projees necessrias. Ao final, configuramos o ProjectionList no objeto
Criteria, que retornar os dados.
No exemplo a seguir, montada uma lista de projees, contendo a menor carga horria
(min(carga)) e a maior carga horria (max(carga)) das Disciplinas.
Criteria criteria = session.createCriteria(Disciplina.class);
ProjectionList proj = Projections.projectionList();
proj.add(Projections.min(carga));
proj.add(Projections.max(carga));
criteria.setProjection( proj );
Object[] dados = (Object[])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

Integrao JSF e Hibernate

Aplicao JSF composta por:


11 XHTML.
11 Managed Beans.
Adicionar mais um element.
11 Classes Persistentes.
11 Exemplo: sala, Professor, Disciplina e Aluno.
Vrias formas de integrao.
11 Integrao simples: cdigo de acesso ao banco (Hibernate) diretamente em
mtodos dos MBs.
Para que um objeto persistente esteja preenchido para ser usado com o Hibernate, usa-se
uma instncia desse no Managed Bean e faz-se o XHTM ligar seus campos de formulrio
a atributos desse objeto. No exemplo a seguir, apresentado o XHTML e o Managed Bean
usado em um cadastro de Aluno.
XHTML Busca de Aluno:
<h:form>
<h:inputText value=#{exemploMB.aluno.nome} />
<h:commandButton value=Salvar
action=#{exemploMB.salvarAluno()} />
</h:form>

Managed Bean: busca de Aluno:


@Named(value = exemploMB)
@RequestScoped
public class ExemploMB {
private Aluno aluno = new Aluno();
public ExemploMB() {
}
public Aluno getAluno() {
return aluno;
}
public void setAluno(Aluno aluno) {

JAVA Frameworks e Aplicaes Corporativas

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) {

public String getTexto() {


return texto;
}
public void setTexto(String texto) {
this.texto = texto;
}

Captulo 9 - Replicao

this.aluno = aluno;
}

173

public List<Aluno> getLista() {


return lista;
}
public void setLista(List<Aluno> lista) {
this.lista = lista;
}
public void salvarAluno() {
Session session = HibernateUtil.getSessionFactory().
openSession();
session.beginTransaction();
session.save(aluno);
session.getTransaction().commit();
FacesMessage fm = new FacesMessage(Aluno salvo com sucesso.);
FacesContext.getCurrentInstance().addMessage(null, fm);
}
public String pesquisarAluno() {
Session session = HibernateUtil.getSessionFactory().
openSession();
Query query = session.createQuery(SELECT a FROM Aluno a WHERE a.nome like
:criterio );
query.setParameter(criterio, % + this.texto + %);
lista = query.list();
return list_aluno;
}

JAVA Frameworks e Aplicaes Corporativas

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:

11 Entradas, seu processamento (regras de negcio) e suas sadas.


Requisitos no funcionais:
11 Dizem respeito qualidade do software, oramento, segurana, usabilidade, disponibilidade, tecnologias etc.;
11 Persistncia em BD, Transaes, Segurana, Threads, Paralelismo etc.;
11 Infraestrutura.
Implementar tudo, do zero, complicado, demorado, custoso etc.
O desenvolvimento dos requisitos funcionais demanda muito esforo e a parte do software que realmente vai aderir ao processo de negcio do cliente, sendo extremamente com
foco aos seus objetivos.
J os requisitos no funcionais dizem respeito a como o sistema desempenhar suas funcionalidades. Para alcanar esses objetivos, preciso pensar em uma arquitetura para o
sistema. Muitos desses requisitos podem ser modelados como solues (ou infraestruturas),
podendo ser facilmente reutilizados ou replicados em vrios projetos. Por exemplo: persistncia. Podemos implementar uma infraestrutura de persistncia que pode ser reutilizada
de forma configurvel em outros projetos.
O desafio est, para o desenvolvimento do projeto, em a equipe ter como tarefas no s o
desenvolvimento dos requisitos funcionais, mas tambm toda a infraestrutura que atende

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);

11 Objetos Distribudos (EJB);


11 Objetos Persistentes (JPA);

JPA

11 Servios na web (web Services);

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;

JAVA Frameworks e Aplicaes Corporativas

11 Segurana: autenticao e autorizao de fora transparente com JAAS (Java Authenti-

176

cation and Authorization Service);


11 Objetos remotos: a possibilidade de distribuir objetos em vrios servidores e faz-los
cooperar;
11 Concorrncia: aplicaes podem ser acessadas por mltiplos usurios, de forma
controlada;
11 Persistncia: integrao com JPA (Java Persistence API);
11 Integrao: integrada com outras tecnologias Java, como, por exemplo, JSF.
So duas classes de EJBs divididas em quatro tipos:

Beans de Sesso (Session Beans)


11 @Stateless, que no guardam estado entre as requisies.

11 @Stateful, que guardam estado entre as requisies.


11 @Singleton para as quais h somente uma instncia no sistema todo.
11 Beans de Mensagem.
11 @MessageDriven, que so baseadas em mensagens assncronas.
Os Session Beans so componentes EJB criados a partir de classes POJO, com anotaes
especficas para marcar seu comportamento. So usadas basicamente para representar
regras de negcio, e possuem mtodos pblicos, que so considerados mtodos de negcio.
So administradas pelo EJB Conteiner do Servidor Java EE.

Stateless Session Beans


11 Usados para implementar regras de negcio.

11 Podem ser acessados de forma local ou remota.


11 No armazenam informaes entre uma requisio e outra.
11 A operao tem de ser terminada em uma s chamada.
11 Usamos a anotao @Stateless.
Exemplo:
22 Consultar dados de um usurio.
22 Efetuar uma insero.
Os Stateless Session Beans so usados para representar regras de negcio, e podem ser
acessados de forma local ou remota. Sua grande caracterstica que no armazenam informaes entre uma requisio e outra, portanto, a tarefa designada precisa terminar em uma
s chamada. Para cri-los, basta uma classe POJO anotada com @Stateless.
Local seu comportamento padro. Para anot-lo, explicitamente podemos utilizar:
@Local

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)

Quando o Bean Local:

11 No precisa criar uma interface com os mtodos;

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

11 Se criar, deve-se anotar com:

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;
}
}

11 Usa-se a anotao @Inject para injetar o Bean;

11 O conteiner injeta a dependncia correta;


11 Depois, basta usar o objeto injetado;
11 Podemos usar em:
22 Servlet;
22 ManagedBean;
22 Bean;
22 Pojo.
Para usar um Stateless Session Bean, no componente que for utiliz-lo (Servlet, Managed
Bean, Bean etc.), usa-se a anotao @Inject para que o Conteiner injete uma instncia do EJB
automaticamente. Depois, basta usar a instncia injetada. Um exemplo de cliente local pode
ser visto a seguir:
@Named
public class CalculosMB {
@Inject
private Biblioteca biblioteca;
private int resultado;
public void calcular() {
this.resultado = this.biblioteca.somar(10, 20);
}
}

JAVA Frameworks e Aplicaes Corporativas

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:

11 No existente: no pode atender requisies, pois ainda no foi criado;


11 PRONTO: j foi criado e pode atender requisies.
Dependendo da quantidade de requisies, o conteiner pode criar novas instncias para
respond-las. Quando uma chamada realizada, uma das instncias que se encontram em
estado PRONTO selecionada para atender requisio. Quando um Bean est atendendo
uma requisio, no pode atender a outras. Ao terminar de atender uma requisio, volta ao
estado pronto e pode atender outras requisies e, conforme critrios do servidor, ele pode
destruir instncias dos beans.

Stateful Session Beans


11 Usado para implementar regras de negcio.

11 Mantm o estado conversacional.


11 No podem atender a qualquer cliente, pois devem manter os dados (seu estado)
por cliente.
11 Usa-se a anotao @Stateful.
11 Podem ser acessados de forma local e remota.
Exemplo:
11 Carrinho de compras.
Os Stateful Session Beans tambm so usados para implementar regras de negcio, mas
possuem uma grande diferena: eles mantm dados entre uma requisio do cliente e
outra. Assim, no podem atender a qualquer requisio, e o conteiner deve controlar de
qual cliente o EJB mantm os dados.
Para cri-los, usamos a anotao @Stateful e tambm podem ser locais ou remotos.
@Stateful
public class CarrinhoBean {
private Set<Produto> produtos =
new HashSet<Produto>();
public void adicionar(Produto p) {

this.produtos.add(p);
}
public void remover(Produto p) {
this.produtos.remove(p);
}

Um Stateful Session Bean pode estar em um dos trs estados:

11 No existente: no pode responder requisies, pois ainda no foi criado;


11 PRONTO: j instanciado e pode atender requisies;
11 PASSIVADO: est atendendo requisies de um cliente, mas ficou muito tempo sem
receber requisies; assim, pode ser armazenado em disco.
O cliente responsvel por indicar quando aquela instncia no mais til, e faz isso chamando
algum mtodo do Bean que esteja marcado com @Remove. Por exemplo, no cdigo a
seguir, uma chamada ao mtodo finalizar(), independente do seu contedo, far com que,
no final de sua execuo, a instncia do bean seja descartada.
@Stateful
private Set<Produto> produtos =
new HashSet<Produto>();
public void adicionar(Produto p) {

this.produtos.add(p);
}
public void remover(Produto p) {

Captulo 10 - Java EE

public class CarrinhoBean {

179

this.produtos.remove(p);
}
@Remove
public void finalizar() {
}
}

Singleton Session Beans


11 EJB 3.1+.

11 O Conteiner EJB s cria uma instncia do Bean.


11 Compartilhar dados transientes entre todos os usurios da aplicao.
11 Usa-se a anotao @Singleton.
11 Pode ser local e remota.
Exemplo:
11 Contagem de usurios.
11 Cache.
11 Dados compartilhados.
Um Singleton Session Bean um EJB que instanciado somente uma vez e, portanto,
compartilha seus dados entre todos os usurios da aplicao. Surgiu com a especificao
EJB 3.1. Para cri-lo, anota-se uma classe com @Singleton, e sua interface, tambm, pode ser
local ou remota.
@Singleton
public class ContadorBean {
private int contador = 0;
public void adicionar() {
this.contador++;
}
public int getContador() {
return this.contador;
}

JAVA Frameworks e Aplicaes Corporativas

180

O Singleton pode estar em um dos dois estados:

11 No existente: no possui instncia criada, portanto no pode atender requisies;


11 PRONTO: quando j foi criado e pode atender requisies.
Singletons so componentes usados para acesso concorrente entre vrios elementos da
aplicao. Assim, a maneira de sincronizar a chamada aos seus mtodos pode ser indicada
pelo desenvolvedor. Se nada for especificado, conforme o exemplo anterior, a concorrncia
controlada pelo Conteiner e o acesso aos mtodos bloqueado, caso algum outro elemento j esteja executando algum de seus mtodos.

Message-Driven Beans
11 Bean com a capacidade de processar mensagens de forma assncrona.

11 Classe anotada com @MessageDriven.


11 Atua como um JMS Listener:
22 JMS Java Messaging System.
22 Recebe e consome mensagens JMS.
22 Processa as mensagens.
Caractersticas:
11 Assincronia na sua invocao: um cliente manda uma mensagem e continua seu
processamento.
11 Segurana, pois h a garantia de entrega da mensagem.
11 Baixo acoplamento entre componentes da aplicao.
Os Message-Driven Beans (MDB) so componentes capazes de lidar com mensagens
e de serem invocados de forma assncrona. Para cri-los, deve-se anotar uma classe
com @MessageDriven. JMS ( Java Message System) a API do Java voltado para mensagens e, portanto, os MDBs atuam como listeners JMS, recebendo, consumindo e processando mensagens.
A arquitetura JMS composta pelas seguintes partes:

11 JMS Provider: uma implementao do Java EE que suporte JMS;


11 JMS Clients: programas ou componentes que produzem e consomem mensagens;
11 Mensagens: objetos de comunicao entre dois JMS Clients;
11 Objetos Administrados: objetos JMS pr-configurados para uso dos clientes destinos
e fbricas de conexes (connection factories).
Temos dois estilos de envio de mensagens.
Ponto-a-Ponto (Point-to-Point):

11 Emissores, Receptores e Filas;


11 Cada mensagem tem somente um consumidor;
11 Cada mensagem endereada a uma fila especfica;
11 Receptores retiram suas mensagens de filas especficas;
11 Filas guardam todas as mensagens at que sejam consumidas ou que expirem.
Publicao/Inscrio (Publish/Subscribe):
11 Emissores enviam mensagens para um tpico;
11 Um tpico pode ter vrios assinantes;

11 Tpicos guardam as mensagens at que sejam consumidas;


11 O Bean precisa estar ativo para consumir as mensagens do tpico.

Captulo 10 - Java EE

11 Beans podem se inscrever (assinar) tpicos;

181

Mensagens podem ser consumidas de duas formas:


Sincronamente:

11 Consumidor explicitamente obtm uma mensagem invocando receive();


11 receive() bloqueia at que a mensagem seja obtida ou d time-out se a mensagem
no chegar em um determinado espao de tempo.
Assincronamente:
11 Uma aplicao pode registrar um Message Listener como um consumidor de mensagens;
11 Sempre que uma mensagem chega, o mtodo onMessage() do listener invocado;
11 No JavaEE, os MDBs funcionam como Message Listeners.
Os MDBs podem estar em dois estados: NO EXISTENTE e PRONTO, quando podem processar
mensagens e, assim que uma mensagem chega, o mtodo onMessage() invocado.
Ciclo de Vida dois Estados:

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.

11 Separar uma tarefa em passos menores.


22 Devem ser executados em sequncia.
JAVA Frameworks e Aplicaes Corporativas

22 Se com sucesso, a tarefa como um todo realizada.

182

22 Se algum passo falhar, a tarefa como um todo abortada.


11 JTA (Java Transaction API) habilita transaes distribudas.
22 Transaes distribudas: manipulam informaes em vrios recursos atravs da
rede.
11 Gerenciador de Transaes (Transaction Manager).
22 Elemento crucial no JTA.
22 Decide se operaes sero validadas ou abortadas, em um contexto distribudo.
Uma transao a execuo de vrias tarefas diferentes que devem ser consolidadas ou
abortadas como uma s. Em geral, uma tarefa complicada separada em passos menores, e
a execuo desses passos configura uma transao.

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.

Java EE possui dois tipos disponveis:

11 CMT Conteiner Managed Transactions (default): controlada pelo servidor;


11 BMT Bean Managed Transactions: controlada pela aplicao.

CMT
11 Servidor Abre, Confirma ou Aborta a transao.

11 Para cada mtodo, podemos definir qual seu comportamento em relao


transao corrente.
Exemplos:
11 Sempre abrir uma nova transao, mesmo que j haja outra aberta.
11 Usar a transao corrente ou abrir uma nova.
11 No usar transao
A seguir, um exemplo de EJB com transao:
@Stateful
public class TesteBean {
@TransactionAttribute(TransactionAttributeType.REQUIRED)

public void tarefa(String parmetro){

}
}

BMT
11 A aplicao deve controlar a transao.

11 Deve-se anotar o Bean indicando o tipo de transao usado.


11 Usa-se mtodos especficos para iniciar, confirmar ou abortar a transao.
O exemplo a seguir mostra um EJB com um mtodo que, explicitamente, controla uma transao.
@Stateful
@TransactionManagement(TransactionManagementType.BEAN)
@Resource
private UserTransaction ut;
public void tarefa(String parmetro) {
try {
ut.begin();
// Tarefas

Captulo 10 - Java EE

public class TesteBean {

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

plataforma, que esteja na rede ou internet.


11 Arquitetura:
11 Cada plataforma tem suas ferramentas.
11 W3C oferece alguns padres (exemplo: SOAP).
11 Java API for XML-Based web Services JAX-WS.
22 Padro W3C (http://www.w3.org/TR/ws-arch/).
22 Baseado em SOAP.
22 Depende de Java Architecture for XML Binding JAXB.
11 Java API for RESTful web Services JAX-RS.
22 Representational State Transfer (REST).
22 Em geral mais fceis de implementar e de evoluir.
22 Usa JAXB para produzir XML ou JSON.
Nos web Services baseados em SOAP, o trfego dos dados padronizado (XML), e vrias
especificaes esto disponveis para garantir qualidade, segurana, transaes etc. um
padro maduro no mercado, portanto, qualquer plataforma possui interfaces e facilidades
para uso de SOAP.
Nos web Services baseados em REST, usado o protocolo HTTP, portanto, no h necessidade de especificaes adicionais, apresentando, geralmente, melhor desempenho. Para
o trfego de informaes, podemos escolher a representao, sendo comumente utilizados
JAVA Frameworks e Aplicaes Corporativas

XML ou JSON.

184

web Services baseados em SOAP:


11 Trfego de dados padronizado: xML;
11 Vrias especificaes para garantir qualidade, segurana, transaes;
11 Padro maduro no Mercado.
web Services baseados em REST:
11 Trfego sobre protocolo HTTP;
11 Geralmente melhor desempenho;
11 Trfego de informaes via XML ou JSON.

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

Os passos para uso so:

11 Fornecedor de servio contacta o UDDI, registrando e informando os servios, e onde


encontr-los;
11 Consumidor de um servio utiliza mtodos de busca oferecidos pelo UDDI para
encontrar as informaes que deseja sobre entidades e servios;
11 Consumidor de um servio se comunica diretamente com o fornecedor do servio.
Basicamente, SOAP usa XML sobre HTTP, sendo que todas as mensagens trocadas so
encapsuladas em XML, com uma padronizao. Assim, ao ser enviada uma mensagem SOAP,
ela deve ser encapsulada em um XML especfico. Ao ser recebida uma mensagem SOA, ela
deve ser decodificada e interpretada, para que a ao seja efetivamente executada.
11 SOAP usa XML sobre HTTP:

22 Todas as mensagens trocadas so encapsuladas em XML, com uma padronizao.


11 Podem ser descobertos (UDDI);
11 Elementos.
22 SOAP Simple Object Access Protocol;
22 UDDI Universal Description, Discovery and Integration;
22 WSDL web Service Description Language.
SOAP um protocolo de comunicao que define um formato para envio de mensagens. Toda
a comunicao sobre a internet via XML, portanto, independente de plataforma e independente de linguagem. simples e extensvel e, por ser um padro W3C, bem documentado.

Captulo 10 - Replicao

Figura 10.1
Servios web
Service tipo SOAP.

Web Service
func (a,b)

185

A seguir um exemplo de solicitao SOAP.


POST /ServidorWS/TesteWS/endpoint HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8
Content-Length: 322
SOAPAction:
<?xml version=1.0 encoding=UTF-8?>
<S:Envelope xmlns:S=http://schemas.xmlsoap.org/soap/envelope/>
<S:Header/>
<S:Body>
<ns2:mostrar xmlns:ns2=http://ws.com/>
<str>oi</str>
</ns2:mostrar>
</S:Body>
</S:Envelope>

A seguir, um exemplo de resposta SOAP.


HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 367
<?xml version=1.0 encoding=UTF-8?>
<S:Envelope xmlns:S=http://schemas.xmlsoap.org/soap/envelope/>
<S:Body>
<ns2:mostrarResponse xmlns:ns2=http://ws.com/>
<return>Teste: oi</return>
</ns2:mostrarResponse>
</S:Body>
</S:Envelope>

WSDL (web Services Description Language) uma linguagem baseada em XML usada para
descrever e localizar webServices.
WSDL

11 web Services Description Language;


11 Baseado em XML;

JAVA Frameworks e Aplicaes Corporativas

11 Usado para descrever webServices;

186

11 Usado para localizar webServices;


11 um Padro W3C.
A seguir, um exemplo de WSDL.
<definitions xmlns:wsu=http://docs.oasis-open.org/wss/2004/01/oasis-200401wss-wssecurity-utility-1.0.xsd xmlns:wsp=http://www.w3.org/ns/ws-policy
xmlns:wsp1_2=http://schemas.xmlsoap.org/ws/2004/09/policy xmlns:wsam=http://
www.w3.org/2007/05/addressing/metadata xmlns:soap=http://schemas.xmlsoap.org/
wsdl/soap/ xmlns:tns=http://ws.com/ xmlns:xsd=http://www.w3.org/2001/XMLSchema
xmlns=http://schemas.xmlsoap.org/wsdl/ targetNamespace=http://ws.com/
name=TesteWS>
<types>

<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

11 Universal Description, Discovery and Integration;


11 Entidades que disponibilizam WS (organizaes, empresas);
11 Um local para armazenar informaes sobre web Services;
11 Usado com web Services baseados em WSDL;
11 Comunicao via SOAP;
11 Define mecanismos para publicar e descobrir web Services;
11 Camada sobre o SOAP, requests e responses so objetos UDDI enviados via SOAP.

REST
REST: Representational State Transfer.

11 Tese de Doutorado de Roy Fielding.


11 Meados de 2000.
11 Interface web simples, sem abstraes de protocolos ou padres de trocas de mensagens.
11 Biblioteca JAX-RS: java API for RESTful web Services.
22 Define como implementar os web Services REST.
O outro tipo de web o REST (Representational State Transfer), baseado na tese de douto-

JAVA Frameworks e Aplicaes Corporativas

rado de Roy Fielding, de meados de 2000.

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.

No h necessidade de codificao em XML.


11 O mtodo HTTP indica a operao.
Exemplo de acesso a um recurso cliente:
11 GET /cliente/{id} Recupera o cliente id;
11 DELETE /cliente/{id} Deleta o cliente id;
11 POST /cliente Cria o cliente;
11 GET /cliente Retorna todos.
Os cdigos de retorno so os do HTTP, por exemplo:
11 404 no encontrado;
11 500 Erro desconhecido do servidor;
11 201 criado.
A figura a seguir representa o funcionamento de um web Service RESTful.

GET

PUT
Cliente
Browser

Responde requisio PUT

POST

DELETE

Figura 10.2
web Service
RESTful.

Responde requisio GET

Responde requisio POST

Responde requisio DELETE


HTTP

http://servidor:porta/servico

Um web Services RESTful implementado com JAX-RS usa anotaes para definir que

mtodo invocado em cada chamada do HTTP


11 @GET: chamada via GET;
11 @POST: chamada via POST;

11 @POST: chamada via POST;


11 @DELETE: chamada via DELETE.
Outras anotaes tambm so utilizadas, como @Path e @PathParam. O cdigo a seguir
mostra um trecho de um web Service implementado com JAX-RS.

Captulo 10 - Replicao

11 @PUT: chamada via PUT;

189

@Path(/cliente)
public class ClienteResourse {
@GET

public String getClientes (){

// retorna todos os clientes

}
@GET
@Path(/{id})

public String getClientes (@PathParam(id) String id){

// retorna cliente com id

}
}

Os formatos de consumo de web Services pode ser de duas formas:

11 XML Extensible Markup Language:


22 Dados representados com tags configurveis.
11 JSON JavaScript Object Notation:
22 Dados representados com objetos em JavaScript;
22 Uma notao do objeto em Strings.
Os exemplos a seguir apresentam o dado Pessoa contendo Nome e Descrio nas duas notaes:
XML
<pessoa>
<nome>Razer Montano</nome>
<descricao>Professor</descricao>
<pessoa>

JSON JavaScript Object Notation


{nome: Razer Montano, descricao: Professor}

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

JAVA Frameworks e Aplicaes Corporativas

11 Mapeamento Java < > XML;

190

11 Transforma objetos Java em texto XML e vice-versa;


11 Netbeans j cria cdigos especficos;
11 Exemplo de uso:
@XmlRootElement
public class Conta {
private double saldo;
private double limite;
private Cliente cliente;
}

SOA Arquitetura Orientada a Servios

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.

Um modelo de Arquitetura de Software tipicamente usado em aplicaes baseadas em SOA


o Enterprise Service Bus (ESB). O ESB uma arquitetura modular, baseada em componentes
que tm como objetivo ser um canal de comunicao transparente e padronizado entre consumidores de servios e seus provedores. As figuras a seguir ilustram esse conceito.

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

Enterprise Service Bus

JAVA Frameworks e Aplicaes Corporativas

Service ow

192

Data

Exisiting
applications

New
service Logic

Figura 10.4
Outra ilustrao
de ESB

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.

LIVRO DE APOIO AO CURSO

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

Você também pode gostar