Você está na página 1de 187

Apostila Java Web

Apostila Java Web


ROSICLIA FRASSON
Apostila Java Web

PREFCIO

Este material foi escrito com o intuito de facilitar a consulta e o acompanhamento da
disciplina de Programao Web, tendo como premissa explicar em mais detalhes temas
abordados em sala de aula.
Neste material podem ser encontrados conceitos e dicas necessrias ao desenvolvimento
de uma aplicao completa utilizando JSF com JPA, tendo como biblioteca de Persistncia o
Hibernate e a biblioteca de componentes Primefaces.
Para a montagem deste material, diversas referncias consagradas foram utilizadas. Na
bibliografia as mesmas podem ser consultadas. Vale ressaltar que este material no substitui a
leitura de livros consagrados sobre o tema.
Todo os cdigos presentes neste material podem ser consultados em:
https://drive.google.com/folderview?id=0B8cQpHd6a5gENnJYd0ZFTkdKVGM&usp=sharing
Caso possua correes, sugestes ou mesmo esclarecer alguma dvida sinta-se livre para
entrar em contato: rosicleiafrasson@gmail.com.

Um bom estudo!

Cricima, janeiro de 2014.
Rosiclia Frasson
SUMRIO

JPA ................................................................................................................................................. 3
Generics ....................................................................................................................................... 24
JAVA EE ....................................................................................................................................... 31
Servlets ......................................................................................................................................... 40
JSP ............................................................................................................................................... 48
Frameworks MVC ......................................................................................................................... 57
JSF ............................................................................................................................................... 60
Componentes JSF ........................................................................................................................ 70
CSS .............................................................................................................................................. 97
Escopos JSF ............................................................................................................................... 109
Facelets ...................................................................................................................................... 117
Filtros .......................................................................................................................................... 122
Bibliotecas de componentes ....................................................................................................... 159
Primefaces .................................................................................................................................. 162











Captulo 1 JPA


JPA

Aplicaes comerciais so desenvolvidas pela necessidade de coletar e armazenar
grandes quantidades de dados e eventualmente esses dados so transformados para gerar
informaes para as companhias em forma de relatrios. O armazenamento desses dados
normalmente feito utilizando sistemas gerenciadores de banco de dados (SGBDs). Existem
inmeros SGBDs no mercado e a grande maioria deles trabalha com o modelo relacional, onde os
dados so armazenados em tabelas com linhas e colunas.
Aplicaes desenvolvidas na linguagem Java, so escritas utilizando o paradigma
orientado a objetos e a manipulao de dados, como descrita anteriormente, segue o modelo
relacional. Como os modelos utilizados so
sejam ajustados cada vez que passam de um modelo para o outro. Em outras palavras, a cada
nova operao de insero, atualizao, remoo ou pesquisa, uma quantidade imensa de cdigo
deve ser implementada para tratar essas incompatibilidades de estruturas.
Com a popularizao do Java notou
a codificao de queries SQL e nos cdigos JDBC que manipulavam as mesmas. Alm da
produtividade, o acesso via JDBC dif
possuem diferenas significativas dependendo do fabricante.
Para facilitar a vida dos programadores surge o conceito de ORM (Mapeamento objeto
relacional) que prope que a transformao entre os
ocorra de maneira transparente para o programador. Utilizando este conceito, ao invs do
programador efetuar as devidas converses, o mesmo pode utilizar um framework para efetuar as
alteraes necessrias.


Java Persistence API e Ferramentas ORM

O Hibernate o framework ORM mais conhecido do mercado e como os demais existentes
disponibiliza toda a programao necessria para o mapeamento objeto
dos dados.


Com a aceitao dos frameworks ORM pela comunidade de programadores e prevendo o
surgimento de muitos outros frameworks ORM, foi includa, a partir do Java 5, uma API de
Aplicaes comerciais so desenvolvidas pela necessidade de coletar e armazenar
grandes quantidades de dados e eventualmente esses dados so transformados para gerar
panhias em forma de relatrios. O armazenamento desses dados
normalmente feito utilizando sistemas gerenciadores de banco de dados (SGBDs). Existem
inmeros SGBDs no mercado e a grande maioria deles trabalha com o modelo relacional, onde os
azenados em tabelas com linhas e colunas.
Aplicaes desenvolvidas na linguagem Java, so escritas utilizando o paradigma
orientado a objetos e a manipulao de dados, como descrita anteriormente, segue o modelo
relacional. Como os modelos utilizados so de paradigmas diferentes, necessrio, que os dados
sejam ajustados cada vez que passam de um modelo para o outro. Em outras palavras, a cada
nova operao de insero, atualizao, remoo ou pesquisa, uma quantidade imensa de cdigo
a para tratar essas incompatibilidades de estruturas.
Com a popularizao do Java notou-se que os programadores gastavam muito tempo com
a codificao de queries SQL e nos cdigos JDBC que manipulavam as mesmas. Alm da
produtividade, o acesso via JDBC dificulta a troca de bancos de dados, visto que algumas queries
possuem diferenas significativas dependendo do fabricante.
Para facilitar a vida dos programadores surge o conceito de ORM (Mapeamento objeto
relacional) que prope que a transformao entre os paradigmas orientado a objetos e relacional
ocorra de maneira transparente para o programador. Utilizando este conceito, ao invs do
programador efetuar as devidas converses, o mesmo pode utilizar um framework para efetuar as
a Persistence API e Ferramentas ORM
O Hibernate o framework ORM mais conhecido do mercado e como os demais existentes
disponibiliza toda a programao necessria para o mapeamento objeto-relacional e persistncia
ameworks ORM pela comunidade de programadores e prevendo o
surgimento de muitos outros frameworks ORM, foi includa, a partir do Java 5, uma API de
Rosiclia Frasson
3
Aplicaes comerciais so desenvolvidas pela necessidade de coletar e armazenar
grandes quantidades de dados e eventualmente esses dados so transformados para gerar
panhias em forma de relatrios. O armazenamento desses dados
normalmente feito utilizando sistemas gerenciadores de banco de dados (SGBDs). Existem
inmeros SGBDs no mercado e a grande maioria deles trabalha com o modelo relacional, onde os
Aplicaes desenvolvidas na linguagem Java, so escritas utilizando o paradigma
orientado a objetos e a manipulao de dados, como descrita anteriormente, segue o modelo
de paradigmas diferentes, necessrio, que os dados
sejam ajustados cada vez que passam de um modelo para o outro. Em outras palavras, a cada
nova operao de insero, atualizao, remoo ou pesquisa, uma quantidade imensa de cdigo
se que os programadores gastavam muito tempo com
a codificao de queries SQL e nos cdigos JDBC que manipulavam as mesmas. Alm da
iculta a troca de bancos de dados, visto que algumas queries
Para facilitar a vida dos programadores surge o conceito de ORM (Mapeamento objeto
paradigmas orientado a objetos e relacional
ocorra de maneira transparente para o programador. Utilizando este conceito, ao invs do
programador efetuar as devidas converses, o mesmo pode utilizar um framework para efetuar as
O Hibernate o framework ORM mais conhecido do mercado e como os demais existentes
relacional e persistncia

ameworks ORM pela comunidade de programadores e prevendo o
surgimento de muitos outros frameworks ORM, foi includa, a partir do Java 5, uma API de
Captulo 1 JPA Rosiclia Frasson

4

persistncia chamada de Java Persistence API ou JPA que padroniza o mapeamento objeto-
relacional. A JPA prope a possibilidade de trabalhar diretamente com as classes sem a utilizao
de consultas nativas de cada banco de dados.
A JPA apenas uma especificao, ou seja, muitos textos, normas e interfaces do Java de
como uma implementao deve se comportar. Atualmente existem no mercado diversas
implementaes da JPA, entre elas, as mais conhecidas so o Hibernate da JBoss, EclipseLink da
EclipseFundation e OpenJPA da Apache.
Como os provedores de persistncia seguem a especificao, possvel migrar de
framework durante o desenvolvimento de uma aplicao. E como o provedor que cuida da
transformao dos dados para os SGBDs, tambm possvel efetuar a troca do fabricante de
banco de dados sem alteraes na aplicao.
Algumas caractersticas da JPA:
Qualquer classe que contenha um construtor sem parmetros, pode ser tornar persistente
sem nenhuma alterao no cdigo. Apenas algumas anotaes so necessrias.
Como a JPA, oferece diversos valores defaults, bastam poucas anotaes para efetuar o
mapeamento.
As consultas com a JPA so efetuadas atravs da JPQL (Java Persistence Query
Language) que possui sintaxe similar as queries SQL.


Anotaes

Para efetuar o mapeamento das classes em JPA, o desenvolvedor pode optar entre as
anotaes diretamente no cdigo fonte ou criar um arquivo XML. As anotaes so mais
recomendadas, pois a informao fica no cdigo fonte sendo mais fcil a visualizao e
compreenso dos parmetros utilizados.
As anotaes so inseridas diretamente no cdigo fonte, antes do elemento a ser anotado.
Para identificar, cada anotao deve ser precedida por uma @. As anotaes precisam dos
imports que pertencem ao pacote java.persistence.
O mecanismo de persistncia define padres que se aplicam a grande maioria das
aplicaes. Dessa forma, o desenvolvedor necessita anotar apenas quando deseja substituir o
valor padro.
As anotaes tambm podem possuir parmetros. Os parmetros so especificados
dentro de parnteses como par nome-valor e separados por vrgula. A ordem dos parmetros no
interfere na execuo.


Entidades

As entidades ou entities so utilizadas pela JPA para efetuar o mapeamento objeto-
relacional. Dessa forma elas devem refletir a estrutura da tabela no banco de dados. Classes Java
podem ser facilmente transformadas em entidades.
Para que um POJO Java seja considerada uma entidade necessrio que ela possua os
seguintes requisitos:
Possuir um construtor sem parmetros. Outros construtores podem ser adicionados.
Ter a anotao @Entity. Essa anotao indica a JPA que a classe deve ser transformada
em uma tabela no banco de dados. Por padro o nome da tabela o mesmo nome da
classe. Se o desenvolvedor preferir outro nome para a tabela, necessrio adicionar o
parmetro name com o nome desejado.
Captulo 1 JPA Rosiclia Frasson

5

Toda entidade tem que possuir uma identidade nica. O identificador da entidade equivale
a primary key da tabela. Esse campo deve ser anotado com @Id. Em geral esse campo
um nmero sequencial, mas pode ter outros tipos de valores.
Os atributos da classe devem ser privados e os mesmos devem possuir os mtodos de
acesso (gets/sets).
Segue um exemplo de entidade.

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Funcionario {

@Id
private int matricula;
private String nome;
private double salario;

public Funcionario() {


public int get!atricula() {
return matricula;


public void set!atricula(int matricula) {
t"is.matricula # matricula;


public String get$ome() {
return nome;


public void set$ome(String nome) {
t"is.nome # nome;


public double getSalario() {
return salario;


public void setSalario(double salario) {
t"is.salario # salario;





Entity Manager

Na JPA, a persistncia de um objeto feita invocando o gerenciador de entidades (Entity
Manager). Uma Entity Manager responsvel pela troca de informaes entre a aplicao e um
esquema de armazenamento de dados e pela abertura e fechamento das transaes.
O contexto de persistncia (Persistence Context) o espao de memria, onde os objetos
persistentes se encontram.Dentro do contexto de persistncia, as instncias de entidades e seu
Captulo 1 JPA Rosiclia Frasson

6

ciclo de vida so gerenciados. O ciclo de vida de uma entidade pode possuir quatro estados
diferentes:
New (novo): A entidade foi criada, porm, ainda no foi persistida na base de dados, ou
seja, ela ainda no reconhecida pela JPA porque nunca passou pelo gerenciador de
persistncia EntityManager.
Managed (gerenciado): A entidade foi persistida e encontra-se num estado gerencivel.
Mudanas no estado da entidade so sincronizadas assim que uma transao for
finalizada com sucesso, ou seja, a JPA garante que a entidade ter representao idntica
na base de dados.
Removed (removido) : A entidade foi marcada para ser removida da base de dados. Essa
remoo ser efetuada quando a transao com o banco de dados for finalizada com
sucesso.
Detached(desacoplado): A entidade foi persistida no banco de dados, porm, encontra-se
em um estado que no est associado ao contexto persistvel, ou seja, alteraes em seu
estado no so refletidos na base de dados.
A interface EntityManager define mtodos que so usados para interagir com o contexto
de persistncia, ou seja, ela usada para criar e remover instncias persistentes de uma
entidade, para encontrar entidades pela sua chave primria e para efetuar consultas de entidades.
O conjunto de entidades que pode ser gerenciado por uma instncia da EntityManager
definida por uma unidade de persistncia. Segue uma lista com os mtodos mais utilizados da
EntityManager:
createNamedQuery: cria uma instncia de consulta para a execuo de uma consulta
nomeada.
createQuery: cria uma instncia de consulta para a execuo de uma instruo de
linguagem de consulta de persistncia Java.
find: efetua a busca pela primary key e traz os dados imediatamente.
getReference: efetua uma busca pela primary key, os dados so carregados apenas
quando o estado do objeto acessado, aliviando o trfego do banco de dados.
getTransaction: retorna o objeto da transao com o banco de dados.
merge: mescla o estado da entidade no contexto da persistncia atual.
persist: faz uma instncia de entidade gerenciada e persistente.
remove: remove a instncia da entidade do banco de dados.
Para criar uma EntityManager necessria uma instncia de EntityManagerFactory ou
uma fbrica de EntityManager. Como a EntityManagerFactory um processo custoso e
demorado, apenas uma instncia da fbrica usada por aplicao. Exceto quando necessrio
acessar mais de uma fonte de dados diferente.


Persistence Unit

A unidade de persistncia utilizada para configurar as informaes referentes ao
provedor JPA e ao banco de dados utilizado.
Para definir a unidade de persistncia utilizado um arquivo XML, chamado
persistence.xml que deve ser criado dentro da pasta META-INF do projeto. Neste arquivo podem
ser definidas vrias unidades de persistncia.




Captulo 1 JPA


JPQL

Como a linguagem SQL possui mudanas significativas para cada fabricante de banco de
dados para efetuar consultas utilizando a JPA, recomendado utilizar a JPQL (Java Persistence
Query Language).
A JPQL uma API de queries, similar as queries SQL que define consultas para entidades
e seu estado persistente. Com o uso da JPQL, as consultas
fabricante de banco de dados utilizado.
Um objeto query pode ser obtido atravs do Entity Manager usando o mtodo createQuery.
As queries podem ser estticas ou dinmicas. Uma query esttica pode ser definida atravs d
anotao @NamedQuery e possui uma performance melhor do que a query dinmica, pois a JPA
armazena cache da consulta, podendo executar a mesma query vrias vezes apenas alterando os
valores.


PASSO-A-PASSO

Configurando o ambiente

Neste exemplo, ser usado o Hibernate com JPA. Sendo assim, o primeiro passo
colocar os jars correspondentes no classpath do projeto que podem ser encontrados no site
oficial do Hibernate: www.hibernate.org. Sero necessrios todos os jars obrigatrios (required),
os jars da especificao JPA, que esto na pasta com o nome desta.

1. Para configurao no Netbeans, necessrio criar uma aplicao Java SE. Em exemplos
posteriores ser feita a configurao em projetos Java EE.
2. Aps a criao do projeto, as propriedades do m
Bibliotecas, necessrio acionar a opo Adicionar Biblioteca.
Como a linguagem SQL possui mudanas significativas para cada fabricante de banco de
dos para efetuar consultas utilizando a JPA, recomendado utilizar a JPQL (Java Persistence
A JPQL uma API de queries, similar as queries SQL que define consultas para entidades
e seu estado persistente. Com o uso da JPQL, as consultas se tornam portteis, independente do
fabricante de banco de dados utilizado.
Um objeto query pode ser obtido atravs do Entity Manager usando o mtodo createQuery.
As queries podem ser estticas ou dinmicas. Uma query esttica pode ser definida atravs d
anotao @NamedQuery e possui uma performance melhor do que a query dinmica, pois a JPA
armazena cache da consulta, podendo executar a mesma query vrias vezes apenas alterando os
sado o Hibernate com JPA. Sendo assim, o primeiro passo
colocar os jars correspondentes no classpath do projeto que podem ser encontrados no site
oficial do Hibernate: www.hibernate.org. Sero necessrios todos os jars obrigatrios (required),
especificao JPA, que esto na pasta com o nome desta.
1. Para configurao no Netbeans, necessrio criar uma aplicao Java SE. Em exemplos
posteriores ser feita a configurao em projetos Java EE.
2. Aps a criao do projeto, as propriedades do mesmo devem ser acessadas e no menu
Bibliotecas, necessrio acionar a opo Adicionar Biblioteca.
Rosiclia Frasson
7
Como a linguagem SQL possui mudanas significativas para cada fabricante de banco de
dos para efetuar consultas utilizando a JPA, recomendado utilizar a JPQL (Java Persistence
A JPQL uma API de queries, similar as queries SQL que define consultas para entidades
se tornam portteis, independente do
Um objeto query pode ser obtido atravs do Entity Manager usando o mtodo createQuery.
As queries podem ser estticas ou dinmicas. Uma query esttica pode ser definida atravs de
anotao @NamedQuery e possui uma performance melhor do que a query dinmica, pois a JPA
armazena cache da consulta, podendo executar a mesma query vrias vezes apenas alterando os
sado o Hibernate com JPA. Sendo assim, o primeiro passo
colocar os jars correspondentes no classpath do projeto que podem ser encontrados no site
oficial do Hibernate: www.hibernate.org. Sero necessrios todos os jars obrigatrios (required),
1. Para configurao no Netbeans, necessrio criar uma aplicao Java SE. Em exemplos
esmo devem ser acessadas e no menu

Captulo 1 JPA


3. Na caixa de dilogo aberta, necessrio acessar a opo Criar.

4. Aps dar um nome para a biblioteca e clicar em OK, ser aberta uma janela para ad
jars da biblioteca criada. So necessrios todos os jars da pasta required e jpa. Opcionalmente
podem ser inclusos outros jars. A figura a seguir, contm a lista de todos os jars adicionados.

5. Aps ser criada, necessrio que a biblioteca

6. Alm do Hibernate, tambm necessrio adicionar o driver JDBC do banco utilizado. Neste
caso, ser utilizado o MySQL.


Entidades

3. Na caixa de dilogo aberta, necessrio acessar a opo Criar.
4. Aps dar um nome para a biblioteca e clicar em OK, ser aberta uma janela para ad
jars da biblioteca criada. So necessrios todos os jars da pasta required e jpa. Opcionalmente
podem ser inclusos outros jars. A figura a seguir, contm a lista de todos os jars adicionados.
5. Aps ser criada, necessrio que a biblioteca seja adicionada ao projeto.
6. Alm do Hibernate, tambm necessrio adicionar o driver JDBC do banco utilizado. Neste
Rosiclia Frasson
8

4. Aps dar um nome para a biblioteca e clicar em OK, ser aberta uma janela para adicionar os
jars da biblioteca criada. So necessrios todos os jars da pasta required e jpa. Opcionalmente
podem ser inclusos outros jars. A figura a seguir, contm a lista de todos os jars adicionados.

seja adicionada ao projeto.
6. Alm do Hibernate, tambm necessrio adicionar o driver JDBC do banco utilizado. Neste
Captulo 1 JPA Rosiclia Frasson

9

Para que o JPA possa mapear corretamente cada tabela do banco de dados para uma
classe Java foi criado o conceito de Entity (Entidade). Para uma classe Java ser considerada
uma Entity, necessariamente ela precisa possuir a anotao @Entity, um construtor pblico sem
parmetros e um campo anotado com @Id.
Neste exemplo ser feito um CRUD de um funcionrio, que contm como atributos
matrcula, que ser gerada automaticamente, nome e salrio. Segue o mapeamento da classe
Funcionario.

pac%age br.com.rosicleia&rasson.exemplo"ibernate'.modelo;

import javax.persistence.Entity;
import javax.persistence.(enerated)alue;
import javax.persistence.Id;

@Entity
public class Funcionario {

@Id
@(enerated)alue
private int matricula;
private String nome;
private double salario;

public int get!atricula() {
return matricula;


public void set!atricula(int matricula) {
t"is.matricula # matricula;


public String get$ome() {
return nome;


public void set$ome(String nome) {
t"is.nome # nome;


public double getSalario() {
return salario;


public void setSalario(double salario) {
t"is.salario # salario;



Por conveno, a classe Funcionario ser mapeada para uma tabela com o mesmo nome
(Funcionario). O atributo matricula est anotado com @Id, indicando que o mesmo representa a
chave primria da tabela. A anotao @GeneratedValue indica que o valor ter autoincremento.
Se for necessrio alterar o nome da tabela ou o nome da coluna podem ser usadas as
anotaes @Table e/ou @Column. Na ausncia dessas configuraes, a JPA ir mapear a
classe Funcionario para uma tabela com o mesmo nome e os atributos matricula, nome e salario
para colunas com os respectivos nomes tambm.

Captulo 1 JPA


Persistence.xml

Para que a JPA consiga mapear e executar transaes em um b
algumas configuraes, como por exemplo, provedor de persistncia, dialeto usado para
manipulao, driver de conexo, usurio e senha do banco, entidades que faro parte do
contexto; algumas configuraes avanadas do Hibernate co
cache, entre outros. Essas configuraes so armazenadas no arquivo persistence.xml.

1. No Netbeans para criar um arquivo persistence.xml, basta clicar com o boto secundrio em
cima do projeto, escolher a opo Novo, Outr
Unidade de Persistncia.

2. Na tela provedor e banco de dados necessrio definir um nome para a unidade de
persistncia, especificar o provedor de persistncia, neste caso, ser utilizado o Hibernate 2.0
Em fonte de dados, necessrio informar a base de dados. Se esta no estiver listada,
necessrio configur-la. Para isso, a opo Nova Conexo de Banco de Dados deve ser
acessada, e o Driver de Conexo selecionado, para este exemplo, ser o driver do

3. Na tela Assistente de Nova Conexao necessrio informar o nome do banco, o usurio e a
senha. Na opo Testar Conexao, possvel verificar se os parmetros para a conexo foram
definidos corretamente.

4. A opo Estratgia de Gerao de Tabel
Eliminar e Criar e Nenhum. Selecionando a primeira delas
necessrio, porm os dados no so apagados. A segunda opo
tabelas existentes no banco e cria novamente, apagando os dados existentes. A terceira opo
Para que a JPA consiga mapear e executar transaes em um banco necessrio definir
algumas configuraes, como por exemplo, provedor de persistncia, dialeto usado para
manipulao, driver de conexo, usurio e senha do banco, entidades que faro parte do
contexto; algumas configuraes avanadas do Hibernate como pool de conexes, controle de
cache, entre outros. Essas configuraes so armazenadas no arquivo persistence.xml.
1. No Netbeans para criar um arquivo persistence.xml, basta clicar com o boto secundrio em
cima do projeto, escolher a opo Novo, Outros, categoria Persistncia e o tipo de arquivo
2. Na tela provedor e banco de dados necessrio definir um nome para a unidade de
persistncia, especificar o provedor de persistncia, neste caso, ser utilizado o Hibernate 2.0
Em fonte de dados, necessrio informar a base de dados. Se esta no estiver listada,
la. Para isso, a opo Nova Conexo de Banco de Dados deve ser
acessada, e o Driver de Conexo selecionado, para este exemplo, ser o driver do
3. Na tela Assistente de Nova Conexao necessrio informar o nome do banco, o usurio e a
senha. Na opo Testar Conexao, possvel verificar se os parmetros para a conexo foram
4. A opo Estratgia de Gerao de Tabela podem ser escolhidas entre as opes Criar,
Eliminar e Criar e Nenhum. Selecionando a primeira delas - Criar - novas tabelas so criadas se
necessrio, porm os dados no so apagados. A segunda opo - Eliminar e Criar
anco e cria novamente, apagando os dados existentes. A terceira opo
Rosiclia Frasson
10
anco necessrio definir
algumas configuraes, como por exemplo, provedor de persistncia, dialeto usado para
manipulao, driver de conexo, usurio e senha do banco, entidades que faro parte do
mo pool de conexes, controle de
cache, entre outros. Essas configuraes so armazenadas no arquivo persistence.xml.
1. No Netbeans para criar um arquivo persistence.xml, basta clicar com o boto secundrio em
os, categoria Persistncia e o tipo de arquivo

2. Na tela provedor e banco de dados necessrio definir um nome para a unidade de
persistncia, especificar o provedor de persistncia, neste caso, ser utilizado o Hibernate 2.0.
Em fonte de dados, necessrio informar a base de dados. Se esta no estiver listada,
la. Para isso, a opo Nova Conexo de Banco de Dados deve ser
acessada, e o Driver de Conexo selecionado, para este exemplo, ser o driver do MySQL.
3. Na tela Assistente de Nova Conexao necessrio informar o nome do banco, o usurio e a
senha. Na opo Testar Conexao, possvel verificar se os parmetros para a conexo foram
a podem ser escolhidas entre as opes Criar,
novas tabelas so criadas se
Eliminar e Criar - apaga as
anco e cria novamente, apagando os dados existentes. A terceira opo -
Captulo 1 JPA


Nenhum - no altera a estrutura da base de dados.

5. Aps a finalizao, criado um arquivo persistence.xml dentro da pasta META
estar no classpath do projeto, portant

*+xml version#,'.-, encoding#,./F
*persistence version#,0.-, xmlns#,"ttp122java.sun.com2xml2ns2persistence,
xmlns1xsi#,"ttp122333.34.org20--'25!6Sc"ema
xsi1sc"ema6ocation#,"ttp122java.sun.com2xml2ns2persistence
"ttp122java.sun.com2xml2ns2persistence2persistence707-.xsd,8
*persistence9unit name#,Exemplo:ibernate';., transaction
*provider8org."ibernate.ejb.:ibernate;ersistence*2provider8
*properties8
*property name#,javax.persistence.jdbc.url,
value#,jdbc1mys<l122local"ost144-=2exemplo"ibernate'+>ero?ate/ime@e"avior#convert/o$ull,28
*property name#,javax.persistence.jdbc.pass3ord, value#,root,28
*property name#,javax.persistence.jdbc.driver, valu
*property name#,javax.persistence.jdbc.user, value#,root,28
*property name#,"ibernate.cac"e.provider7class,
value#,org."ibernate.cac"e.$oAac"e;rovider,28
*property name#,"ibernate."bm0ddl.auto
*2properties8
*2persistence9unit8
*2persistence8

O arquivo gerado possui um cabealho, declarado com a tag persistence. Dentro desta
tag, necessrio definir um conjunto de configuraes para indicar o provedor de persist
fabricante e as configuraes do banco de dados . Esse conjunto de configuraes chamado
de persistence-unit, que deve possuir um nome, neste caso, foi definido como
Exemplo:ibernate';., mas poderia ser dado qualquer outro nome.
no altera a estrutura da base de dados.
5. Aps a finalizao, criado um arquivo persistence.xml dentro da pasta META
estar no classpath do projeto, portanto, junto as classes.
*+xml version#,'.-, encoding#,./F9B,+8
*persistence version#,0.-, xmlns#,"ttp122java.sun.com2xml2ns2persistence,
xmlns1xsi#,"ttp122333.34.org20--'25!6Sc"ema9instance,
xsi1sc"ema6ocation#,"ttp122java.sun.com2xml2ns2persistence
ava.sun.com2xml2ns2persistence2persistence707-.xsd,8
unit name#,Exemplo:ibernate';., transaction9type#,CESD.CAE76DAE6,8
*provider8org."ibernate.ejb.:ibernate;ersistence*2provider8
vax.persistence.jdbc.url,
value#,jdbc1mys<l122local"ost144-=2exemplo"ibernate'+>ero?ate/ime@e"avior#convert/o$ull,28
*property name#,javax.persistence.jdbc.pass3ord, value#,root,28
*property name#,javax.persistence.jdbc.driver, value#,com.mys<l.jdbc.?river,28
*property name#,javax.persistence.jdbc.user, value#,root,28
*property name#,"ibernate.cac"e.provider7class,
value#,org."ibernate.cac"e.$oAac"e;rovider,28
*property name#,"ibernate."bm0ddl.auto, value#,update,28
O arquivo gerado possui um cabealho, declarado com a tag persistence. Dentro desta
tag, necessrio definir um conjunto de configuraes para indicar o provedor de persist
fabricante e as configuraes do banco de dados . Esse conjunto de configuraes chamado
unit, que deve possuir um nome, neste caso, foi definido como
, mas poderia ser dado qualquer outro nome.
Rosiclia Frasson
11

5. Aps a finalizao, criado um arquivo persistence.xml dentro da pasta META-INF que deve
type#,CESD.CAE76DAE6,8
value#,jdbc1mys<l122local"ost144-=2exemplo"ibernate'+>ero?ate/ime@e"avior#convert/o$ull,28
e#,com.mys<l.jdbc.?river,28
O arquivo gerado possui um cabealho, declarado com a tag persistence. Dentro desta
tag, necessrio definir um conjunto de configuraes para indicar o provedor de persistncia, o
fabricante e as configuraes do banco de dados . Esse conjunto de configuraes chamado
unit, que deve possuir um nome, neste caso, foi definido como
Captulo 1 JPA Rosiclia Frasson

12

Dentro das properties so colocadas tags property contendo um atributo name e um
atributo value. No atributo name indicado a configurao que deve ser feita e no atributo value,
o contedo da configurao. possvel observar no arquivo persistence.xml criado que existem
tags property para configurao da url, driver, user e password, que equivalem respectivamente
as configuraes do endereo, onde a base de dados est hospedada, o driver de conexo do
banco de dados correspondente, o usurio e a senha do mesmo. importante perceber que
essas propriedades comeam com javax.persistence.jdbc. Isso acontece porque elas fazem
parte da especificao da JPA.
Alm das propriedades da especificao JPA, possvel tambm configurar
propriedadesespecficas da implementao. Uma delas a escolha do dialeto do banco de
dados. Quando a conexo feita via JDBC, utiliza-se cdigos em SQL e alguns comandos so
especficos de um determinado banco de dados. Como o Hibernate pode trabalhar com diversos
fabricantes de bancos de dados necessrio informar qual o dialeto do banco, ou seja, a
variao do SQL utilizado pelo mesmo. No javadoc do Hibernate, disponvel em:
http://docs.jboss.org/hibernate/orm/4.1/javadocs/ pode ser encontrada a lista completa dos
dialetos. Como ser utilizado o MySQL para o armazenamento de dados necessrio inserir o
dialeto do mesmo utilizando a seguinte propriedade no persistence.xml.

*property name#,"ibernate.dialect, value#,org."ibernate.dialect.!ySF6?ialect, 28

A propriedade hibernate.hbm2ddl.auto permite que tabelas sejam criadas ou tenham suas
estruturas alteradas automaticamente. Setando o valor para update, novas tabelas, colunas ou
relacionamentos so criados, se necessrio, porm os dados no so apagados. Essa
configurao deve ser utilizada apenas na fase de desenvolvimento. Quando o software estiver
em produo aconselhvel desabilitar essa configurao.
O Hibernate possui uma propriedade que permite que os comandos SQL sejam
impressos no console quando esto sendo executados. Para ativar esse recurso, necessrio
adicionar uma nova propriedade chamada show_sql com o valor true. interessante que os
comandos sejam impressos formatados. Isso possvel com a propriedade format_sql. Segue
abaixo os comandos que devem ser adicionados no arquivo persistence.xml.

*property name#,"ibernate.s"o37s<l, value#,true,28
*property name#,"ibernate.&ormat7s<l, value#,true,28


Entity Manager

Criadas as configuraes, necessrio fazer com que a aplicao se comunique com a
base de dados. Para isso, deve ser criada uma classe que garanta essa comunicao. A ttulo de
exemplo, essa classe deve se chamar PersistidorFuncionario e invocar alguns mtodos para que
as informaes da aplicao sejam pesistidas na base de dados.
A classe Persistence carrega o arquivo XML e inicializa as configuraes. A classe
EntityManagerFactory descobre quem cria as conexes e necessrio uma instncia da mesma.
Para obter uma instncia de EntityManagerFactory utilizado o mtodo
createEntityManagerFactory indicando qual a persistence-unit que foi definida no
persistence.xml, no nosso caso ExemploHibernate1PU. Executando o cdigo abaixo dentro de
um mtodo main, a tabela funcionrio deve ser criada no banco.
Captulo 1 JPA Rosiclia Frasson

13

Entity!anagerFactory em& # ;ersistence.createEntity!anagerFactory(,ExemploHibernate1PU,);

Com a instncia de EntityManagerFactory necessrio invocar o mtodo
createEntityManager. Este mtodo devolve um objeto do tipo EntityManager que representa a
conexo com a unidade de persistncia. O EntityManager responsvel por gerenciar as
entidades, atravs dele possvel gerenciar o ciclo de vida das entidades, efetuar operaes de
sincronizao com a base de dados (insert, delet e update), consultar entidades entre outros.
Uma Entity est em um contexto gerencivel, quando a mesma est associada a um
EntityManager. Isso garante que todas as operaes realizadas em um objeto Entity so
refletidas na base de dados.

Entity!anager em # em&.createEntity!anager();


Insero

Para testar uma insero de um funcionrio na base de dados, necessrio instanciar e
popular um objeto do tipo Funcionario e passar o mesmo para a EntityManager realizar a
persistncia. Tambm indispensvel pedir uma transao para a EntityManager e invocar os
mtodos begin e commit. O mtodo begin inicializa os recursos da transao e o mtodo commit
confirma a transao corrente. Para salvar a entidade gerenciada na base de dados,
necessrio invocar o mtodo persist.

Funcionario & # ne3 Funcionario();
&.set$ome(,GoHo da Silva,);
&.setSalario('I--.--);

em.get/ransaction().begin();
em.persist(&);
em.get/ransaction().commit();

importante mencionar que EntityManagerFactory uma fbrica para criar
EntityManager. Por essa razo, interessante que exista apenas uma EntityManagerFactory
para toda a aplicao. A existncia de vrias fbricas de conexes espalhadas pela aplicao
resultam em lentido do software, entre outros problemas. Sendo assim, importante garantir
que a EntityManagerFactory seja criada apenas uma vez, isso possvel com a implementao
de uma classe que possua um atributo esttico para armazenar essa instncia e que o mesmo
seja uma constante, para que no seja criado outras vezes. Essa classe pode ser chamada de
JPAUtil.
Na classe JPAUtil, tambm necessrio implementar um mtodo getEntityManager que
devolva uma EntityManager, desta forma, possvel ter acesso a um objeto de conexo sempre
que necessrio.

pac%age br.com.rosicleia&rasson.exemplo"ibernate'.util;

import javax.persistence.Entity!anager;
import javax.persistence.Entity!anagerFactory;
import javax.persistence.;ersistence;
Captulo 1 JPA Rosiclia Frasson

14


public class G;E.til {

private static &inal Entity!anagerFactory em& # ;ersistence.
createEntity!anagerFactory(,ExemploG;E;.,);

public static Entity!anager getEntity!anager() {
return em&.createEntity!anager();



Com a existncia de uma fbrica de conexes centralizada, necessrio alterar a classe
PersistidorFuncionario, para que a mesma utilize a classe JPAUtil.

Entity!anager em # G;E.til.getEntity!anager();


Consulta

Com os dados gravados na base de dados, possvel realizar consultas. As consultas
em JPA podem ser feitas utilizando SQL, porm no recomendado, pois, ao usar SQL, a
aplicao fica presa a um determinado fabricante de banco de dados. Existe uma linguagem
chamada de JPQL (Java Persistence Query Language) que portvel e possui a sintaxe e
estrutura bem similar ao SQL.
Para realizar uma pesquisa por todos os funcionrios utilizada a String select f from
Funcionario f. Na clausula from deve ser indicada a entidade a ser buscada, nesse caso
Funcionario. necessrio tambm a criao de um alias (apelido) para a entidade, no exemplo
mostrado f.
O mtod createQuery recebe a consulta com a String com a consulta desejada e o tipo de
objeto que a consulta deve retornar. Para executar a consulta, invocado o mtodo getResultList
que devolve uma lista com os objetos indicados no momento da chamada ao createQuery.

Entity!anager em # G;E.til.getEntity!anager();
Fuery < # em.createFuery(,select & &rom Funcionario &,J Funcionario.class);
6ist*Funcionario8 &uncionarios # <.getCesult6ist();
&or (Funcionario & 1 &uncionarios) {
System.out.println(,Kn!atrLcula1 , M &.get!atricula()
M ,Kn$ome1 , M &.get$ome()
M ,KnSalNrio1 , M &.getSalario() M ,Kn,);


em.close ();


Remoo

Para efetuar uma remoo, basta chamar o mtodo remove, passando um objeto
Funcionario com o id populado.


Captulo 1 JPA Rosiclia Frasson

15

Entity!anager em # G;E.til.getEntity!anager();

Funcionario & # em.getCe&erence(Funcionario.classJ ');

em.get/ransaction().begin();
em.remove(&);
em.get/ransaction().commit();
em.close();



Mapeamento

Alm das anotaes @Entity, @Id e @GeneratedValue j citadas anteriormente, a JPA
disponibiliza uma srie de anotaes, que permitem ao desenvolvedor efetuar os relacionamentos
da base de dados e modificar as configuraes padro de mapeamento da JPA.

Por padro, ao anotar uma classe com @Entity, o JPA far o mapeamento para uma
tabela como o mesmo nome na base de dados. Caso seja necessrio que a tabela possua um
outro nome, a anotao @Table deve ser usada juntamente com a propriedade name, como
mostrado no trecho de cdigo a seguir.

@Entity
@/able (name # ,tb7&uncionario,)
public class Funcionario {

Os atributos das classes tambm so mapeados para as tabelas da base de dados com o
mesmo nome que se apresentam nas classes. Para modificar os nomes das colunas,
necessrio utilizar a anotao @Column juntamente com a propriedade name. Alm de modificar
o nome da coluna, outras restries podem ser impostas. Entre elas, podem ser citadas:
length: Limita a quantidade de caracteres de uma String.
nullable: Indica se o campo pode ou no possuir valor null.
unique: Indica se uma coluna pode ou no ter valores repetidos.
O cdigo mostrado a seguir indica que o atributo nome ser mapeado como nome_fun,
aceitar no mximo 100 caracteres, no pode ser nulo e dois funcionrios no podem possuir o
mesmo nome.

@Aolumn(name # ,nome7&un,J lengt" # '--J uni<ue # trueJ nullable # &alse)
private String nome;

Para armazenar dados grandes, como imagens e sons, o atributo deve ser anotado com
@Lob. O cdigo a seguir demonstra o uso da anotao.

@6ob
private byteOP &oto;

Os tipos java.util.Date e java.util.Calendar necessitam da anotao @Temporal para serem
mapeados. Esta anotao exige que o programador defina como a data ser armazenada.
Existem trs opes de armazenamento:
Captulo 1 JPA Rosiclia Frasson

16

TemporalType.DATE: Armazena apenas a data.
TemporalType.TIME: Armazena apenas a hora.
TemporalType. TIMESTAMP: Amazena a data e a hora.
Segue o cdigo utilizado para mapear uma data utilizando uma das anotaes descritas.

@/emporal (/emporal/ype.?E/E)
private ?ate data$ascimento;

Eventualmente, um campo contido em uma classe no pode ser mapeado para a base de
dados. Para evitar que o atributo seja mapeado, necessrio inserir a anotao @Transient como
mostrado a seguir.

@/ransient
private String con&irmaSen"a;

Existem diversas formas de mapear a herana em Java utilizando a JPA. Uma delas
utilizando a anotao @MappedSuperclass. Utilizando esta anotao, toda a classe que herdar da
superclasse ter em sua tabela, os atributos pertencentes a classe e a superclasse. A anotao
pode ser utilizada tanto em classes concretas, quanto abstratas.
Para demonstrar o mapeamento, ser utilizado o diagrama de classes ilustrado a seguir.



O mapeamento das classes ilustradas deve ser feito conforme os trechos de cdigo
abaixo.

pac%age br.com.rosicleia&rasson.mapeamentocap'.model;

import java.util.?ate;
Captulo 1 JPA Rosiclia Frasson

17

import javax.persistence.(enerated)alue;
import javax.persistence.Id;
import javax.persistence.!appedSuperclass;
import javax.persistence./emporal;
import javax.persistence./emporal/ype;

@!appedSuperclass
public class ;essoa {

@Id
@(enerated)alue
private int id;
private String nome;
@/emporal(/emporal/ype.?E/E)
private ?ate data$ascimento;

public int getId() {
return id;


public void setId(int id) {
t"is.id # id;


public String get$ome() {
return nome;


public void set$ome(String nome) {
t"is.nome # nome;


public ?ate get?ata$ascimento() {
return data$ascimento;


public void set?ata$ascimento(?ate data$ascimento) {
t"is.data$ascimento # data$ascimento;



pac%age br.com.rosicleia&rasson.mapeamentocap'.model;

import java.util.?ate;
import javax.persistence.Entity;
import javax.persistence./emporal;
import javax.persistence./emporal/ype;

@Entity
public class Funcionario extends ;essoa {

@/emporal(/emporal/ype.?E/E)
private ?ate dataEdmissao;

public ?ate get?ataEdmissao() {
return dataEdmissao;


public void set?ataEdmissao(?ate dataEdmissao) {
t"is.dataEdmissao # dataEdmissao;
Captulo 1 JPA Rosiclia Frasson

18




pac%age br.com.rosicleia&rasson.mapeamentocap'.model;

import java.util.?ate;
import javax.persistence.Entity;
import javax.persistence./emporal;
import javax.persistence./emporal/ype;

@Entity
public class Aliente extends ;essoa {

@/emporal(/emporal/ype.?E/E)
private ?ate dataAadastro;

public ?ate get?ataAadastro() {
return dataAadastro;


public void set?ataAadastro(?ate dataAadastro) {
t"is.dataAadastro # dataAadastro;




A base de dados apresentada a seguir corresponde ao mapeamento citado.



Relacionamentos

Uma das maiores divergncia no mapeamento objeto-relacional ocorre nos
relacionamentos existentes entre as classes. A JPA define quatro tipos de relacionamento de
acordo com a sua cardinalidade: OneToOne, OneToMany, ManyToOne e ManyToMany.

OneToOne

Tambm conhecido como relacionamento um para um, ocorre quando um registro da
tabela pode possuir ligao com apenas um registro de outra tabela. o caso por exemplo, do
relacionamento do funcionrio com o cnjuge. Um funcionrio s pode ter um cnjuge e um
cnjuge s pode pertencer a um funcionrio.
Captulo 1 JPA Rosiclia Frasson

19


Para efetuar o relacionamento utilizada a anotao @OneToOne. importante perceber
que em Java, o relacionamento feito com o objeto inteiro, ou seja, todos os dados do cnjuge,
so carregados, juntamente com o funcionrio. Na base de dados, o cdigo do cnjuge, o nico
dado correspondente a ligao entre as tabelas na entidade funcionrio.

pac%age br.com.rosicleia&rasson.mapeamentocap'.model;

import javax.persistence.Entity;
import javax.persistence.(enerated)alue;
import javax.persistence.Id;

@Entity
public class Aonjuge {
@Id @(enerated)alue
private int codigo;
private String nome;
private String cp&;

22(ets e sets


pac%age br.com.rosicleia&rasson.mapeamentocap'.model;

import java.util.?ate;
import javax.persistence.Entity;
import javax.persistence.(enerated)alue;
import javax.persistence.Id;
import javax.persistence.Dne/oDne;
import javax.persistence./emporal;
import javax.persistence./emporal/ype;

@Entity
public class Funcionario {

@Id
@(enerated)alue
private int matricula;
private String nome;
private String cp&;
@/emporal(/emporal/ype.?E/E)
private ?ate dataEdmissao;
@Dne/oDne
private Aonjuge conjuge;
22(ets e sets



Captulo 1 JPA Rosiclia Frasson

20

One to Many

O relacionamento um para muitos informa que o registro de uma entidade est relacionado
com vrios registros de outra. Como exemplo desse relacionamento pode ser citado o funcionrio
e seus dependentes. Um funcionrio pode possuir zero ou vrios dependentes.
Na base de dados, alm das tabelas funcionrio e dependente uma terceira tabela deve
ser gerada para relacionar os registros dos dependentes com o registro do funcionrio.


Na JPA, para efetuar o mapeamento do relacionamento um para muitos, utilizada a
anotao @OneToMany, como exemplificado no cdigo a seguir.

pac%age br.com.rosicleia&rasson.cap'mapeamentoonetomany.model;

import java.util.?ate;
import javax.persistence.Entity;
import javax.persistence.(enerated)alue;
import javax.persistence.Id;
import javax.persistence./emporal;
import javax.persistence./emporal/ype;

@Entity
public class ?ependente {

@Id
@(enerated)alue
private int codigo;
private String nome;
@/emporal(/emporal/ype.?E/E)
private ?ate data$ascimento;
private String parentesco;
22(ets e sets


pac%age br.com.rosicleia&rasson.cap'mapeamentoonetomany.model;

import java.util.Aollection;
import java.util.?ate;
import javax.persistence.Entity;
import javax.persistence.(enerated)alue;
import javax.persistence.Id;
import javax.persistence.Dne/o!any;
import javax.persistence./emporal;
import javax.persistence./emporal/ype;

Captulo 1 JPA Rosiclia Frasson

21

@Entity
public class Funcionario {

@Id
@(enerated)alue
private int matricula;
private String nome;
private String cp&;
@/emporal(/emporal/ype.?E/E)
private ?ate data$ascimento;
@/emporal(/emporal/ype.?E/E)
private ?ate dataAadastro;
private double salario;
@Dne/o!any
private Aollection*?ependente8 dependentes;
22(ets e sets


Por padro, o nome da tabela gerada para indicar o relacionamento a juno das duas
tabelas, funcionrio e dependente (funcionario_dependente). Se necessrio alterar o padro, pode
ser utilizada a anotao @JoinTable com a propriedade name.

@Dne/o!any
@Goin/able(name # ,&unc7depen,)
private Aollection*?ependente8 dependentes;


Many to One

No relacionamento muitos para um, muitos registros de uma entidade esto relacionados
com um registro de outra entidade. Como exemplo deste relacionamento, pode ser citado, o
relacionamento entre o produto e sua categoria. Muitos produtos devem possuir a mesma
categoria.

A anotao @ManyToOne responsvel por efetuar este mapeamento na JPA. O cdigo
a seguir, demonstra a utilizao desta.

pac%age br.com.rosicleia&rasson.cap'mapeamentomanytoone.model;

import javax.persistence.Entity;
import javax.persistence.(enerated)alue;
import javax.persistence.Id;

@Entity
public class Aategoria {

Captulo 1 JPA Rosiclia Frasson

22

@Id
@(enerated)alue
private int codigo;
private String nome;
private String descricao;

22(ets e sets


pac%age br.com.rosicleia&rasson.cap'mapeamentomanytoone.model;

import javax.persistence.Entity;
import javax.persistence.(enerated)alue;
import javax.persistence.Id;
import javax.persistence.!any/oDne;

@Entity
public class ;roduto {

@Id
@(enerated)alue
private int codigo;
private String nome;
private double valor.nitario;
@!any/oDne
private Aategoria categoria;
22(ets e sets



Many To Many

O relacionamento muitos para muitos indica que mltiplos registros de uma entidade
podem se relacionar com mltiplos registros de outra entidade. o caso por exemplo do
relacionamento entre alunos e cursos. Um aluno pode estar matriculado em mais de um curso e
um curso pode ter mais de um aluno.

Na JPA, existe a anotao @ManyToMany para indicar esse relacionamento. Um exemplo
de utilizao desta anotao pode ser visto no cdigo a seguir.

pac%age br.com.rosicleia&rasson.cap'mapeamentomanytomany.model;

import javax.persistence.Entity;
import javax.persistence.(enerated)alue;
import javax.persistence.Id;

@Entity
Captulo 1 JPA Rosiclia Frasson

23

public class Aurso {

@Id
@(enerated)alue
private int codigo;
private String nome;
private String descricao;

22(ets e sets



pac%age br.com.rosicleia&rasson.cap'mapeamentomanytomany.model;

import java.util.Aollection;
import java.util.?ate;
import javax.persistence.Entity;
import javax.persistence.(enerated)alue;
import javax.persistence.Id;
import javax.persistence.!any/o!any;
import javax.persistence./emporal;
import javax.persistence./emporal/ype;

@Entity
public class Eluno {

@Id
@(enerated)alue
private int matricula;
private String nome;
private String cp&;
@/emporal(/emporal/ype.?E/E)
private ?ate data$ascimento;
@/emporal(/emporal/ype.?E/E)
@!any/o!any
private Aollection*Aurso8 cursos;
22(ets e sets





Captulo 2 Generics Rosiclia Frasson

24

Generics

Os generics esto presentes em diversas linguagens de programao e permite ao
desenvolvedor construir cdigos que podem ser utilizados com vrios tipos de dados. Na
linguagem Java, os tipos genricos foram inclusos na verso 5.0, fato considerado pela
comunidade de programadores como uma grande evoluo da linguagem. A utilizao de
genericspermite tipos na declarao de mtodos, interfaces e classes, dessa forma, permite que o
programador desenvolva cdigo mais limpo, seguro e reutilizvel.
Bons exemplos do uso do Generics so encontrados na API do Java na interface
Collections. Tanto a interface quanto as implementaes desta utilizam os tipos genricos. A
interface List, por exemplo, que herda de Collection, possui uma implementao chamada
ArrayList que responsvel pelo armazenamento dos dados em forma de lista ligada. No seria
interessante que o programador se preocupasse em sobrescrever os mtodos a cada nova classe
criada em que houvesse a necessidade de armazenamento em forma de lista, para que os
mesmos fossem suportados pela estrutura. A classe ArrayList como todas as classes
pertencentes a hierarquia de Collections so genricas, permitindo que o uso destas possa ser
feito por qualquer objeto.
O uso adequado de tipos genricos apresenta inmeras vantagens, a maior delas o
grande reaproveitamento de cdigo, alm disso as classes genricas eliminam a necessidade de
cast e deixam o cdigo mais robusto.
Em cdigos que utilizam genricos, o compilador responsvel por remover o parmetro
de tipo e substituir por tipos reais. Esse processo ocorre na traduo para bytecodes e definido
como erasure.


Classes genricas

As classes genricas ou parametrizadas aceitam parmetros em sua declarao. Como os
parmetros contidos nos mtodos, os parmetros de tipos -definio dos parmetros genricos - ,
podem ser utilizados com diferentes entradas.

public class Exemplo(enerico */8{


Na declarao de classe, necessrio colocar aps o nome da classe, o indicador
genrico. O indicar genrico definido por uma letra que ser substituda no momento da
compilao e podem representar apenas tipos por referncia. Tipos primitivos no so permitidos,
porm podem manipular objetos de classes empacotadoras de tipos. O indicador genrico fica
dentro de uma seo de parmetros delimitada por colchetes angulares (< e >). Cada seo de
parmetros pode ter um ou mais indicadores, separados por vrgulas.
Por conveno, os indicadores so nomeados por letras maisculas nicas e obedecem a
seguinte padronizaao:
E - Elemento
K - Chave
N - Nmero
T - Tipo
V - Valor
Captulo 2 Generics Rosiclia Frasson

25

Para utilizar uma classe genrica, a instanciao feita da seguinte forma:

Exemplo(enerico*ExemploDbjeto8 eg # ne3 Exemplo(enerico*ExemploDbjeto8();


Mtodos genricos

Um grande recurso da orientao a objetos a sobrecarga de mtodos. Na sobrecarga,
possvel a definio de mtodos com o mesmo nome, porm com tipo ou quantidade de
parmetros diferentes. Caso haja a necessidade de um mtodo funcionar para tipos de objetos
diferentes, so definidos mtodos para cada tipo de dado.
O uso de generics permite que uma nica declarao de mtodo com argumentos de tipos
diferentes seja codificada, nos casos em que as operaes realizadas forem idnticas para todos
os tipos de dados.

public / pes<uisar (I p%) {
/ tipo;


Da mesma forma, que nas classes genricas, os mtodos genricos possuem uma seo
de parmetros de tipos, que precedem o tipo de retorno do mtodo. Nos mtodos genricos, os
indicadores podem representar o tipo de retorno, tipos de parmetros e tipos de variveis locais.
Os mtodos genricos podem ser sobrecarregados por mtodos genricos e no
genricos. Na ocorrncia de sobrecarga, o compilador procura pelo mtodo que mais se adequa
aos tipos de argumentos especificados na chamada. Primeiramente ele procura nos mtodos no
genricos, caso no encontre uma correspondncia precisa de tipos, tenta localizar um mtodo
genrico correspondente.


PASSO-A-PASSO

DAO Genrico

Quando a persistncia dos dados de uma aplicao feita utilizando JPA, a
implementaao do CRUD idntica, diferindo apenas o tipo de dados utilizado. Desta forma,
uma boa soluo para reduzir a quantidade de cdigo implementado seria a utilizao de
Generics. Alm da reduo de cdigo, o uso de classes genricas facilita posteriores
modificaes, pois os mtodos ficam todos centralizados.

O primeiro passo para a criao de um DAO genrico a criao de uma interface
contendo a assinatura dos mtodos comuns a serem implementados por todos os DAOs. Segue
a seguir.

pac%age br.com.rosicleia&rasson.jpagenerico.model.persistencia.dao;

import java.util.6ist;
import javax.persistence.Entity!anager;

Captulo 2 Generics Rosiclia Frasson

26

public inter&ace ?ED*/J I8 {

/ save(/ entity);

boolean remove(Alass*/8 classeJ I p%);

/ get@yId(Alass*/8 classeJ I p%);

6ist*/8 getEll(Alass*/8 classe);

Entity!anager getEntity!anager();


Concluda a interface DAO, o prximo passo a criao de uma classe que implementa
este DAO. Essa classe ser chamada de DAOJPA. Por questes de organizao a classe criada
ser abstrata e todas as entidades tambm possuiro seus DAOs especifcos que devem herdar
de DAO e DAOJPA. As implementaes especficas no necessitam sobrescrever os mtodos
comuns j implementados.

pac%age br.com.rosicleia&rasson.cap0jpagenerico.model.persistencia;

import br.com.rosicleia&rasson.cap0jpagenerico.model.persistencia.dao.?ED;
import java.util.6ist;
import javax.persistence.Entity!anager;
import javax.persistence.$oCesultException;
import javax.s3ing.GDption;ane;

public abstract class ?EDG;E*/J I8 implements ?ED*/J I8 {

private AonnectionFactory conexao;

@Dverride
public / save(/ entity) {
/ saved # null;
try {
getEntity!anager().get/ransaction().begin();
saved # getEntity!anager().merge(entity);
getEntity!anager().get/ransaction().commit();
catc" (Exception e) {
i& (getEntity!anager().get/ransaction().isEctive() ## &alse) {
getEntity!anager().get/ransaction().begin();

getEntity!anager().get/ransaction().rollbac%();
GDption;ane.s"o3!essage?ialog(nullJ ,Erro ao salvar elemento na base de dados, M
e.get!essage());

return saved;


@Dverride
public boolean remove(Alass*/8 classeJ I p%) {
boolean estado # &alse;
try {
getEntity!anager().get/ransaction().begin();
getEntity!anager().remove(getEntity!anager().getCe&erence(classeJ p%));
getEntity!anager().get/ransaction().commit();
catc" (Exception e) {
i& (getEntity!anager().get/ransaction().isEctive() ## &alse) {
Captulo 2 Generics Rosiclia Frasson

27

getEntity!anager().get/ransaction().begin();

getEntity!anager().get/ransaction().rollbac%();
GDption;ane.s"o3!essage?ialog(nullJ ,Erro ao remover elemento na base de dados, M
e.get!essage());

return estado;


@Dverride
public / get@yId(Alass*/8 classeJ I p%) {
try {
return getEntity!anager().&ind(classeJ p%);

catc" ($oCesultException e) {
return null;



@Dverride
public 6ist*/8 getEll(Alass*/8 classe) {
return getEntity!anager().createFuery(,select x &rom , M classe.getSimple$ame() M ,
x,).getCesult6ist();


@Dverride
public Entity!anager getEntity!anager() {
i& (conexao ## null) {
conexao # ne3 AonnectionFactory();

return conexao.getEntity!anager();



O DAOJPA responsvel pelas principais aes de movimentao dos dados de todas
as entidades. Dessa forma as inseres, remoes, atualizaes na base de dados so definidas
nesta classe. As pesquisas pela chave primria e a pesquisa de todos os registros de
determinada entidade tambm j esto implementadadas. Vale ressaltar, que os mtodos citados
no precisam ser sobrescritos em seus DAOs especficos, j que a implementao definida na
classe DAOJPA funciona para todas as entidades.

A fim de exemplificar, a utilizao de um DAO genrico para mapeamento de uma
entidade, foi criada a classe Pessoa, com apenas dois atributos. As regras de mapeamento
prevalecem as mesmas j citadas.

pac%age br.com.rosicleia&rasson.cap0jpagenerico.model;

import javax.persistence.Entity;
import javax.persistence.(enerated)alue;
import javax.persistence.Id;

@Entity
public class ;essoa {

@Id @(enerated)alue
private int id;
Captulo 2 Generics Rosiclia Frasson

28

private String nome;

22(ets e sets


Para que a entidade Pessoa, possa utilizar as operaes do DAO genrico necessrio
criar uma interface que extenda de DAO, neste exemplo PessoaDAO. Os parmetros Pessoa e
Integer so necessrios porque a interface DAO, como classe genrica, parametrizada e
necessita dos parmetros tipo de classe e tipo de chave primria, nesse caso, Pessoa e Integer.
Se forem necessrios mtodos de busca especficos para a entidade Pessoa, ou seja,
diferentes dos mtodos existentes no DAO genrico, os mesmos devem ser declarados na
interface PessoaDAO.

pac%age br.com.rosicleia&rasson.cap0jpagenerico.model.persistencia.dao;
import br.com.rosicleia&rasson.cap0jpagenerico.model.;essoa;

public inter&ace ;essoa?ED extends ?ED *;essoaJ Integer8{



Alm da interface, tambm faz-se necessrio a criao de uma classe concreta que
estenda de DAOJPA e implemente a interface correspondente a interface da entidade. Nessa
classe, se necessrio, so efetuadas as implementaes dos mtodos especficos a entidade
Pessoa.

pac%age br.com.rosicleia&rasson.cap0jpagenerico.model.persistencia;
import br.com.rosicleia&rasson.cap0jpagenerico.model.;essoa;
import br.com.rosicleia&rasson.cap0jpagenerico.model.persistencia.dao.;essoa?ED;

public class ;essoa?EDG;E extends ?EDG;E*;essoaJ Integer8 implements ;essoa?ED{



A utilizao de tipos genricos no exclui a necessidade de uma fbrica de
entityManager, a JPAUtil. Segue a implementao da mesma.

pac%age br.com.rosicleia&rasson.cap0jpagenerico.model.persistencia;

import javax.persistence.Entity!anager;
import javax.persistence.Entity!anagerFactory;
import javax.persistence.;ersistence;

public class G;E.til {

private static &inal String .$I/7$E!E # ,G;E(enerico;.,;
private Entity!anagerFactory em& # null;
private Entity!anager em # null;

public Entity!anager getEntity!anager() {

i& (em& ## null) {
em& # ;ersistence.createEntity!anagerFactory(.$I/7$E!E);
Captulo 2 Generics Rosiclia Frasson

29



i& (em ## null) {
em # em&.createEntity!anager();

return em;



importante perceber que a definio de uma varivel para o armazenamento do nome
da unidade de persistncia aumenta a visibilidade do cdigo. As condicionais para verificao da
existncia de objetos EntityManager e EntityManagerFactory antes a criao dos mesmos,
aumenta a performance da aplicao.
O arquivo persistence.xml segue a estrutura padro anteriormente apresentada.

Para atestar a validade dos mtodos genricos foi efetuada a insero de uma pessoa na
base de dados e posteriormente a listagem das pessoas que esto cadastradas. Segue o cdigo
de teste.

pac%age br.com.rosicleia&rasson.cap0jpagenerico.teste;

import br.com.rosicleia&rasson.cap0jpagenerico.model.;essoa;
import br.com.rosicleia&rasson.cap0jpagenerico.model.persistencia.;essoa?EDG;E;
import java.util.6ist;

public class /este {

public static void main(StringOP args) {
;essoa?EDG;E dao # ne3 ;essoa?EDG;E();

;essoa p # ne3 ;essoa();
p.set$ome(,/este,);

dao.save(p);

6ist*;essoa8 pessoas # dao.getEll(;essoa.class);

&or (;essoa pessoa 1 pessoas) {
System.out.println(pessoa.get$ome());





Em aplicaces com uma quantidade maior de entidades, a utilizao do DAO genrico
semelhante com o exemplo apresentado. Todas as entidades devem possuir seu DAO que
extende do DAO genrico e seu DAOJPA que implementa o seu DAO e extende do DAOJPA. A
seguir uma ilustraao de uma aplicao que contm as entidades funcionrio e produto.
Captulo 2 Generics


importante perceber que a entidade funcionrio possui mtodos de pesquisa por nome
e idade e a entidade produto possui os m
mtodos citados, no so utilizados por todas as entidades, o ideal que os mesmos sejam
implementados em seus DAOs especficos.


importante perceber que a entidade funcionrio possui mtodos de pesquisa por nome
e idade e a entidade produto possui os mtodos de pesquisa por descrio e categoria. Como os
mtodos citados, no so utilizados por todas as entidades, o ideal que os mesmos sejam
implementados em seus DAOs especficos.
Rosiclia Frasson
30

importante perceber que a entidade funcionrio possui mtodos de pesquisa por nome
todos de pesquisa por descrio e categoria. Como os
mtodos citados, no so utilizados por todas as entidades, o ideal que os mesmos sejam
Captulo 3 - Java EE Rosiclia Frasson

31

JAVA EE

Com a popularizao da internet no cenrio mundial, as pginas web esto cada vez mais
presentes no dia-a-dia da populao. Como tendncia desse crescimento, as aplicaes
corporativas esto migrando para a plataforma web.
As aplicaes web apresentam diversas vantagens se comparadas com as aplicaes
desktop. A principal delas que no existe a necessidade de instalar a aplicao em cada
mquina onde ser utilizada. Toda a programao fica armazenada em um servidor - ou vrios
servidores, dependendo da infraestrutura- e os usurios conseguem acesso ao software atravs
de um navegador.
Como no existe a necessidade de instalar o software, o usurio pode acessar a aplicao
de qualquer computador que possua um browser. A portabilidade tambm muito maior, visto que
o comportamento dos navegadores em sistemas operacionais distintos praticamente o mesmo.
O processo de atualizao de verso dos softwares tambm simplificado, pois apenas o servidor
precisa ser atualizado. A figura a seguir demonstra a arquitetura padro de um software utilizando
JEE.

Na linguagem Java, para o desenvolvimento de aplicaes que rodem em um servidor,
existe um conjunto de especificaes j padronizadas. Essas especificaes fazem parte da Java
Enterprise Edition (JEE) e so publicadas pela Oracle e pelo Java Community Process (JCP) e
podem ser consultadas em http://jcp.org.
A idia que o desenvolvedor codifique apenas a lgica de negcio da aplicao.
Recursos como portabilidade, robustez, segurana entre outros, devem ser fornecidos pelas
implementaes do JEE, diminuindo o tempo de desenvolvimento, os riscos do projeto e os
Captulo 3 - Java EE Rosiclia Frasson

32

problemas com manuteno.
Tecnologias do Java EE

Dentre as APIs disponibilizadas pela JEE, algumas so bastante utilizadas no
desenvolvimento de aplicaes. A documentao das mesmas esto publicadas na JCP e esto
organizadas em JSRs (Java Specification Requests). Cada JSR possui um nmero de
identificao e contempla todas as informaes sobre a API na qual se refere. Segue uma lista
com as JSRs mais utilizadas:
Java Persistence (JSR 317): Como j mencionado em captulos anteriores, a JPA uma
API para mapeamento objeto relacional. Embora faa parte da especificao do Java EE,
ela tambm pode ser usada em aplicaes JSE (Java Standart Edition).
Java Servlet (JSR 315): Esta API proporciona a incluso de contedo dinmico em um
Container JEE.
Java Server Pages (JSR 245): Permite a criao de pginas dinmicas de modo mais
simples do que com a utilizao de Servlets..Um JSP faz as funes de um script em uma
pgina web e compilado como servlet em seu container. Uma pgina JSP contm dois
tipos de texto: esttico, representado por marcaes HTML, WML, ou XML, e elementos
dinmicos JSP.
Java Server Faces (JSR 314): Tecnologia desenvolvida para permitir o desenvolvimento
de aplicaes web com a aparncia e facilidade de uma aplicao desktop.
Java Message Service API - JMS (JSR 914) : API que padroniza a troca de mensagens
entre programas distintos, com o uso de mecanismos de criao, envio, recebimento e
leitura de mensagens.
Java Autenthication and Authorization Service - JAAS (JSR) : API para padro do Java
para segurana.
Java Transaction API - JTA (JSR 907): Especifica o controle de transao pelo Container.
JavaMail API (JSR 919): API para suporte ao envio e recebimento de e-mails em Java.


Servidor de aplicao

A JEE apenas uma especificao e como tal, necessita de uma implementao do
conjunto de normas e regras presentes. Cabe aos fornecedoresde servidores de aplicao
implementar essas regras definidas pela JEE.A especificao Java EE implementada pelos
servidores de aplicao.
Existem inmeros servidores de aplicao no mercado, dentre os mais conhecidos esto o
JBoss Application Server da RedHat, o GlassFish da Sun, o Apache Geronimo da Apache, o
WebLogic Application Server da Oracle e o IBM Websphere Application Server da IBM.
Os servidores de aplicao necessitam implementar toda a especificao Java EE e so
responsveis pelos mecanismos de tolerncia a falhas, balanceamento de carga, gerenciamento
de componentes, gerenciamento de transaes e console de gerenciamento.Dessa forma, em um
projeto JEE, o desenvolvedor deve preocupar-se apenas com a resoluo de problemas
referentes regras de negcio e no com questes de infraestrutura.


Servlet Container

O Java EE possui vrias especificaes, entre elas, algumas especficas para lidar com o
desenvolvimento de uma aplicao Web: JSP, Servlets, JSF. Em alguns casos, no existe a
Captulo 3 - Java EE Rosiclia Frasson

33

necessidade de um servidor que implemente o JEE completo mas apenas a parte web da
especificao. Aplicaes de pequeno e mdio porte se encaixam nessa categoria.
Para essas aplicaes existem pequenos servidores que implementam apenas parte do
JEE. Estes servidores so chamados de ServletContainer. O ServletContainer mais famoso do
mercado o Apache Tomcat.

PASSO-A-PASSO

Configurando o ambiente

Para este exemplo ser utilizada a ferramenta Netbeans e como servidor de aplicao o
Glassfish. O Glassfish foi escolhido por j vir instalado junto com o Netbeans, ser open source e
gratuito e estar ganhando fora no mercado nos ltimos anos. Ele tambm um dos poucos a
suportar o JEE 7.

1. Na criao do projeto, guia Escolher Projeto, a Catgoria Java Web deve ser selecionada e em
Projetos Aplicao Web.


2. Na guia Nome e Localizao, necessrio dar um nome ao projeto e identificar a pasta onde o
mesmo ficar armazenado.
Captulo 3 - Java EE Rosiclia Frasson

34



3. Na guia Servidores e Definies deve ser escolhido como Servidor o Glassfish 4.0.


4. Em Java EE, o caminho do contexto o caminho no qual a aplicao pode ser acessada aps
ser implantada no servidor, ou seja, os contextos servem para diferenciar sites ou projetos
distintos em um mesmo servidor. Por padro o caminho do contexto gerado o mesmo nome da
Captulo 3 - Java EE Rosiclia Frasson

35

aplicao. Nesta configurao apresentada, considerando a porta default do glassfish - 8080 -
para o acesso da aplicao deve ser utilizado o seguinte endereo:

"ttp122local"ost1B-B-2ExemploEplicacaoQeb2

5. Na guia Frameworks, neste momento nenhum deles ser selecionado.


6. O projeto criado obedece ao padro de pastas listado a seguir. A seguir, sero detalhados os
contedos destas pastas. Por ora, importante perceber o servidor de aplicao e a verso do
Java EE utilizados.


7. Ao executar o projeto uma pgina web aberta, semelhante figura a seguir.
Captulo 3 - Java EE Rosiclia Frasson

36



Nas aplicaes Java Web, alguns diretrios e arquivos devem existir por padro. Segue
uma descrio sucinta dos mesmos:
Pginas Web: Este diretrio representa o contedo raiz do projeto. Nessa pasta deve ser
armazenado o arquivo index.html e todos os arquivos .html, .jsp, .xhtml, .jsf, .css e
imagens. Dentro desta pasta pode ser criada uma estrutura de pastas para organizao
dos arquivos. Tudo o que colocado dentro desta pasta acessvel na URL do projeto.
WEB-INF: Essa pasta faz parte da especificao JEE e armazena as configuraes e
recursos necessrios para o projeto rodar no servidor. Todo o projeto Java Web precisa
ter esta pasta. Ela inacessvel na URL do projeto, o que garante que os usurios no
conseguem visualizar o contedo dos arquivos presentes nesta pasta.
web.xml: Tambm chamado de descritor de implantao. Este arquivo contm as
informaes para realizar os ajustes dos parmetros da aplicao, como mapeamentos,
segurana, filtros, entre outros. Este arquivo fica dentro da pasta WEB-INF e sua
utilizao necessria apenas se existir a necessidade de adicionar servlets e/ou
parmetros de inicializao.
Pacotes de Cdigo-fonte: Nesta pasta ficam armazenados os arquivos .java da aplicao.
Bibliotecas: Nesta pasta ficam armazenadas todas as bibliotecas necessrias para que o
projeto seja executado corretamente.


O desenvolvimento Web e o protocolo HTTP


Em aplicaes Web, o usurio no possui o software instalado em seu computador. Toda a
aplicao fica hospedada em um servidor e o acesso feito utilizando o protocolo HTTP atravs
do modelo request-response.
Captulo 3 - Java EE Rosiclia Frasson

37

No modelo request-response, o cliente solicita a execuo de uma tarefa - request. Por
sua vez o servidor recebe a requisio, realiza e responde para o cliente - response. Sendo assim,
quando e endereo de uma pgina digitado em um browser, uma requisio est sendo gerada
ao servidor. O mesmo ocorre quando um boto ou um link acionado. Por sua vez, o navegador,
entende somente HTML, dessa forma os dados so trafegados utilizando somente esta
linguagem.


HTML

O HTML uma linguagem de marcao formada por tags. Diversas tags so
disponibilizadas pela linguagem e cada uma possui uma funcionalidade especfica. As tags so
definidas com os caracteres < e > e seu nome. As tags precisam ser abertas e fechadas. O
fechamento de uma tag feito utilizando uma barra /.
Um documento HTML obrigatoriamente deve possuir as tags <html><head> e <body> e a
instruo <!DOCTYPE>, como demosntrado no trecho de cdigo a seguir:

*R?DA/S;E "tml8
*"tml8
*"ead8
*title8/Ltulo da pNgina*2title8
*meta c"arset#,./F9B,8
*2"ead8

*body8

*2body8

*2"tml8

Como visto no cdigo acima, todo documento html deve iniciar com a tag <html> e fechar
com </html>. Todas as demais tags devem ficar entre a abertura e o fechamento desta.
A tag <head> possui informaes para o navegador. Os dados contidos dentro desta tag
no so exibidosna rea do documento no navegador. imprescindvel que dentro da tag <head>
exista a tag <title>, que indica o ttulo do documento que exibido na barra de ttulo do
navegador.
Para que os caracteres como acentos e cedilha apaream corretamente no navegador,
necessrio informar o tipo de codificao utilizada por meio da configurao charset na tag
<meta>. Atualmente para essa configurao utilizado o valor UTF-8, tambm chamado de
Unicode.
A tag <body> contm o corpo do documento que exibido pelo navegador. Dentro do body
que sero colocados todos os elementos que devem aparecer na janela.
O DOCTYPE um comando especial que indica ao navegador qual a verso do html
utilizar. No trecho de cdigo ilustrado, a declarao de DOCTYPE simples, indica que deve ser
usada a ltima verso do html.

Alm da estrutura apresentada, existem inmeras tags que podem ser utilizadas em
documentos HTML. Segue uma lista das mais conhecidas:
h1, h2, h3, h4, h5 e h6: Define cabealhos. A importncia dos cabealhos dada pelos
nmeros aps o h. Onde h1 o cabealho mais importante e o h6 o de menor importncia.
a: Define um link.
Captulo 3 - Java EE Rosiclia Frasson

38

p: Define um pargrafo.
ul: Define uma lista de elementos.
li: Define um elemento da lista.
table: Define uma tabela.
tr: Define uma linha na tabela.
td: Define uma clula da tabela.


Formulrios HTML

Os formulrios so usados para obter dados do usurio para serem processados. Um
formulrio composto por trs partes: a tag form, os elementos do formulrios e os botes de
envio. As tags form delimitam o formulrio, tendo como principais atributos:
action: especifica o que ser executado quando o usurio enviar os dados.
method: Especifica se o mtodo de envio ser get ou post. O mtodo get envia o conjunto
de dados junto com a URL. No mtodo post, os dados no so mostrados na URL.
Os formulrios devem ser compostos por elementos de interao com o usurio. Segue
uma lista com os principais:
input: Este elemento cria vrios tipos de controle e o atributo type quem define o tipo de
controle que ser utilizado. Alguns valores para o atributo type:
text: Campo de entrada de dados com apenas uma linha.
password: Campo de senha.
radio: Boto de opo.
checkbox: Caixa de seleo.
submit: Boto para envio de formulrio.
reset: Boto para limpar os campos do formulrio.
select: Elemento para a criao de listas de seleo.
textArea: Campo de entrada de dados que pode possuir mais de uma linha.


PASSO-A-PASSO

Exemplo pgina html

1. No projeto criado no passo-a-passo anterior, o arquivo index.html deve conter o cdigo
mostrado abaixo.

*R?DA/S;E "tml8
*"tml8
*"ead8
*title8Exemplo pNgina :/!6*2title8
*meta c"arset#,./F9B,8
*2"ead8

*body8

*"'8;rimeira pNgina :/!6*2"'8

*p8Essa T a primeira pNgina utili>ando "tml.*2p8

Captulo 3 - Java EE Rosiclia Frasson

39

*2body8
*2"tml8

2. Ao executar a aplicao, deve ser mostrada a janela ilustrada abaixo.








Captulo 4 - Servlets


Servlets

No incio da era da internet, as pginas web eram todas estticas, ou seja, no existia
nenhuma interao com o usurio. Porm, com o passar do tempo, notou
enorme poder de comunicao e para a interao com os usurios, seri
que gerassem contedo dinamicamente baseadas nas requisies dos mesmos.
Na plataforma Java, a tecnologia capaz de gerar pginas dinmicas so as Servlets.
Embora, existam atualmente diversos frameworks para facilitar o desenvolvime
todos eles criam um nvel de abstrao sobre Servlets.
As Servlets possuem como responsabilidade o tratamento de solicitaes. Em outras
palavras, as Servlets recebem requisies provenientes de um browser ou outro cliente HTTP
qualquer, obtm os dados embutidos e produz uma resposta.

@QebServlet(url;atterns # {,2!euServlet,)
public class !euServlet extends :ttpServlet {

A nvel de implementao uma Servlet uma classe Java que estende da interface
javax.servlet.http.HttpServlet. Ex
interface: GenericServlet, que como o prprio nome diz uma classe genrica que atende
requisies de qualquer protocolo e sua subclasse HttpServlet que atende requisies HTTP.
O servlet permite por meio de programao Java definir todo o cdigo HTML que ser
exibido ao cliente. No entanto, o programador precisa preparar todo o texto que ser mostrado ao
cliente, sendo ele esttico ou no.


Ciclo de vida das Servlets

O funcionamento de uma Se
Inicializao: O servidor responsvel pela inicializao da servlet pelo mtodo init e a
utiliza durante todo o seu perodo ativo. O container pode criar o servlet no momento da
sua inicializao ou quando che
Chamadas a mtodos de servio: So as requisies enviadas ao servidor durante todo o
ciclo de vida das Servlets. O mtodo service o responsvel pelo tratamento dessas
requisies.
No incio da era da internet, as pginas web eram todas estticas, ou seja, no existia
nenhuma interao com o usurio. Porm, com o passar do tempo, notou
enorme poder de comunicao e para a interao com os usurios, seriam necessrias pginas
que gerassem contedo dinamicamente baseadas nas requisies dos mesmos.
Na plataforma Java, a tecnologia capaz de gerar pginas dinmicas so as Servlets.
Embora, existam atualmente diversos frameworks para facilitar o desenvolvime
todos eles criam um nvel de abstrao sobre Servlets.
As Servlets possuem como responsabilidade o tratamento de solicitaes. Em outras
palavras, as Servlets recebem requisies provenientes de um browser ou outro cliente HTTP
obtm os dados embutidos e produz uma resposta.
@QebServlet(url;atterns # {,2!euServlet,)
public class !euServlet extends :ttpServlet {
A nvel de implementao uma Servlet uma classe Java que estende da interface
javax.servlet.http.HttpServlet. Existem duas classes na API de servlets que implementam esta
interface: GenericServlet, que como o prprio nome diz uma classe genrica que atende
requisies de qualquer protocolo e sua subclasse HttpServlet que atende requisies HTTP.
te por meio de programao Java definir todo o cdigo HTML que ser
exibido ao cliente. No entanto, o programador precisa preparar todo o texto que ser mostrado ao
cliente, sendo ele esttico ou no.
O funcionamento de uma Servlet formado basicamente por trs etapas:
Inicializao: O servidor responsvel pela inicializao da servlet pelo mtodo init e a
utiliza durante todo o seu perodo ativo. O container pode criar o servlet no momento da
sua inicializao ou quando chegar a primeira requisio.
Chamadas a mtodos de servio: So as requisies enviadas ao servidor durante todo o
ciclo de vida das Servlets. O mtodo service o responsvel pelo tratamento dessas
Rosiclia Frasson
40
No incio da era da internet, as pginas web eram todas estticas, ou seja, no existia
nenhuma interao com o usurio. Porm, com o passar do tempo, notou-se que a web tinha
am necessrias pginas
que gerassem contedo dinamicamente baseadas nas requisies dos mesmos.
Na plataforma Java, a tecnologia capaz de gerar pginas dinmicas so as Servlets.
Embora, existam atualmente diversos frameworks para facilitar o desenvolvimento em Java Web,
As Servlets possuem como responsabilidade o tratamento de solicitaes. Em outras
palavras, as Servlets recebem requisies provenientes de um browser ou outro cliente HTTP
A nvel de implementao uma Servlet uma classe Java que estende da interface
istem duas classes na API de servlets que implementam esta
interface: GenericServlet, que como o prprio nome diz uma classe genrica que atende
requisies de qualquer protocolo e sua subclasse HttpServlet que atende requisies HTTP.

te por meio de programao Java definir todo o cdigo HTML que ser
exibido ao cliente. No entanto, o programador precisa preparar todo o texto que ser mostrado ao
rvlet formado basicamente por trs etapas:
Inicializao: O servidor responsvel pela inicializao da servlet pelo mtodo init e a
utiliza durante todo o seu perodo ativo. O container pode criar o servlet no momento da
Chamadas a mtodos de servio: So as requisies enviadas ao servidor durante todo o
ciclo de vida das Servlets. O mtodo service o responsvel pelo tratamento dessas
Captulo 4 - Servlets


Finalizao: O servidor destri a Servlet, car
efetuado atravs do mtodo destroy.
O ciclo de vida de uma Servlet controlado pelo container. Cada requisio recebida pelo
servidor passada para o container que tem como responsabilidade carregar a classe, cria
inicializar uma instncia da mesma, controlar as requisies at a remoo da Servlet da
memria.
Na inicializao do servidor, o servlet carregado, porm no entra em funcionamento. No
momento em que uma requisio chega ao servidor, caso a servlet
isso ocorre na primeira requisio
momento todas as requisies so tratadas pelo mtodo service. O container cria um objeto de
requisio (ServletRequest) e um
service, passando os objetos criados como parmetro. Aps o envio da resposta, os objetos so
destrudos. Esse processo se repete at que o Servlet seja destrudo, atravs do mtodo destroy.

O fato da Servlet permanecer carregada durante o tempo que o servidor est ativo e a
aplicao carregada, permite que dados armazenados em variveis de classe persistam ao longo
de diversas requisies. Isso garante que processos custosos sejam efetuados apena
durante todo o ciclo de vida da Servlet. o caso, por exemplo, de uma conexo com a base de
dados.


PASSO-A-PASSO

1. Aps a criao de um projeto Java web no Netbeans recomendada a criao de um pacote
para o armazenamento da classe Servlet.
seguir:
Finalizao: O servidor destri a Servlet, carregada na inicializao. Esse processo
efetuado atravs do mtodo destroy.
O ciclo de vida de uma Servlet controlado pelo container. Cada requisio recebida pelo
servidor passada para o container que tem como responsabilidade carregar a classe, cria
inicializar uma instncia da mesma, controlar as requisies at a remoo da Servlet da
Na inicializao do servidor, o servlet carregado, porm no entra em funcionamento. No
momento em que uma requisio chega ao servidor, caso a servlet ainda no esteja carregada
isso ocorre na primeira requisio -, a mesma inicializada atravs do mtodo init. A partir deste
momento todas as requisies so tratadas pelo mtodo service. O container cria um objeto de
requisio (ServletRequest) e um objeto de resposta (ServletResponse) e aps chama o mto
service, passando os objetos criados como parmetro. Aps o envio da resposta, os objetos so
destrudos. Esse processo se repete at que o Servlet seja destrudo, atravs do mtodo destroy.
to da Servlet permanecer carregada durante o tempo que o servidor est ativo e a
aplicao carregada, permite que dados armazenados em variveis de classe persistam ao longo
de diversas requisies. Isso garante que processos custosos sejam efetuados apena
durante todo o ciclo de vida da Servlet. o caso, por exemplo, de uma conexo com a base de
1. Aps a criao de um projeto Java web no Netbeans recomendada a criao de um pacote
para o armazenamento da classe Servlet. A estrutura do projeto deve ser similar a figura a
Rosiclia Frasson
41
regada na inicializao. Esse processo
O ciclo de vida de uma Servlet controlado pelo container. Cada requisio recebida pelo
servidor passada para o container que tem como responsabilidade carregar a classe, criar e
inicializar uma instncia da mesma, controlar as requisies at a remoo da Servlet da
Na inicializao do servidor, o servlet carregado, porm no entra em funcionamento. No
ainda no esteja carregada -
, a mesma inicializada atravs do mtodo init. A partir deste
momento todas as requisies so tratadas pelo mtodo service. O container cria um objeto de
objeto de resposta (ServletResponse) e aps chama o mto
service, passando os objetos criados como parmetro. Aps o envio da resposta, os objetos so
destrudos. Esse processo se repete at que o Servlet seja destrudo, atravs do mtodo destroy.

to da Servlet permanecer carregada durante o tempo que o servidor est ativo e a
aplicao carregada, permite que dados armazenados em variveis de classe persistam ao longo
de diversas requisies. Isso garante que processos custosos sejam efetuados apenas uma vez
durante todo o ciclo de vida da Servlet. o caso, por exemplo, de uma conexo com a base de
1. Aps a criao de um projeto Java web no Netbeans recomendada a criao de um pacote
A estrutura do projeto deve ser similar a figura a
Captulo 4 - Servlets Rosiclia Frasson

42



2. Com o boto secundrio em cima do pacote criado, clique em Novo, opo Servlet.


3. O Netbeans gera uma estrutura padro de Servlet, como mostrado a seguir.
pac%age br.com.rosicleia&rasson.capUservlets.controller;

import java.io.IDException;
import java.io.;rintQriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.QebServlet;
import javax.servlet."ttp.:ttpServlet;
import javax.servlet."ttp.:ttpServletCe<uest;
import javax.servlet."ttp.:ttpServletCesponse;

@QebServlet(name # ,;rimeiraServlet,J url;atterns # {,2;rimeiraServlet,)
public class ;rimeiraServlet extends :ttpServlet {

protected void processCe<uest(:ttpServletCe<uest re<uestJ :ttpServletCesponse response)
t"ro3s ServletExceptionJ IDException {
response.setAontent/ype(,text2"tml;c"arset#./F9B,);
;rintQriter out # response.getQriter();
try {
out.println(,*R?DA/S;E "tml8,);
out.println(,*"tml8,);
out.println(,*"ead8,);
out.println(,*title8 ;rimeira Servlet*2title8,);
out.println(,*2"ead8,);
out.println(,*body8,);
out.println(,*"'8 ;rimeira Servlet *2"'8,);
out.println(,*2body8,);
out.println(,*2"tml8,);
&inally {
out.close();


Captulo 4 - Servlets Rosiclia Frasson

43


@Dverride
protected void do(et(:ttpServletCe<uest re<uestJ :ttpServletCesponse response)
t"ro3s ServletExceptionJ IDException {
processCe<uest(re<uestJ response);


@Dverride
protected void do;ost(:ttpServletCe<uest re<uestJ :ttpServletCesponse response)
t"ro3s ServletExceptionJ IDException {
processCe<uest(re<uestJ response);



importante perceber que a classe possui a anotao @WebServlet contendo o nome da
Servlet e a URL que seve ser utilizada para acesso da mesma. Em verses posteriores do java o
mapeamento deveria ser feito no web.xml, atualmente este mapeamento feito utilizando
apenas a anotao.
Aps a execuo do projeto, a Servlet pode ser acessada em:
http://localhost:8080/Cap4Servlets/PrimeiraServlet e deve exibir o contedo mostrado na imagem
a seguir.



Vale lembrar que o contedo mostrado na tela est presente dentro do mtodo
processRequest, que responsvel por processar as requisies. No exemplo apresentado, a
Servlet no executa nenhuma lgica e apenas exibe um contedo esttico na tela. O mtodo
getWriter da varivel response obtm um objeto que representa a sada a ser enviada ao usurio.
Por sua vez, o objeto criado out do tipo PrintWriter imprime a resposta para o cliente.


Mtodo Get

O mtodo GET, quando utilizado em formulrios, indica que os valores dos parmetros so
passados atravs da URL junto dos nomes dos mesmos, separados por &. Separa o endereo da
URL dos dados do formulrio com um ponto de interrogao ?.
O mtodo GET deve ser usado apenas quando a quantidade de informaes passadas for
pequena e no for secreta, como em uma pesquisa, por exemplo.



Captulo 4 - Servlets Rosiclia Frasson

44

Mtodo Post

Utilizando o mtodo POST, os dados so passados dentro do corpo do protocolo HTTP,
sem aparecer na URL que mostrada no navegador.
Esse mtodo utilizado em formulrios de cadastro, onde os dados no podem ser
visualizados ou alterados na URL.


Mtodos doGet e doPost

Os mtodos doGet e/ou doPost devem ser implementados na Servlet indicando como ser
efetuado o tratamento do formulrio. Os mtodos doGet e doPost so invocados pelo mtodo
service e cabe a este detectar o tipo da requisio recebida e invocar o mtodo adequado para
trat-la.
Vale lembrar que requisies get so processadas pelo mtodo doGet e requisies post
so processadas pelo mtodo doPost. Ambos os mtodos possuem dois parmetros
HttpServletRequest e HttpServletResponse.


PASSO-A-PASSO

Mtodo Get

1. Crie um projeto Java Web no Netbeans e altere o arquivo index.html de modo que fique
semelhante ao trecho de cdigo listado a seguir.
*R?DA/S;E "tml8
*"tml8
*"ead8
*title8!Ttodo (et*2title8
*meta c"arset#,./F9B,8
*2"ead8
*body8
*&orm name#,teste, met"od#,(E/, action#,2AapUServlet(et2ServletAontroller,8
*table8
*tr8
*td8$ome*2td8
*td8*input type#,text, name#,nome, 28*2td8
*2tr8

*tr8
*td8Idade1*2td8
*td8*input type#,text, name#,idade, 28*2td8
*2tr8

*tr8
*td8*2td8
*td8*input type#,submit, value#,Salvar, 28
*input type#,reset, value#,6impar, 28*2td8
*2tr8
*2table8
*2&orm8
*2body8
*2"tml8

Captulo 4 - Servlets Rosiclia Frasson

45

2. Em seguida, deve ser criada uma Servlet com os comandos abaixo.
pac%age br.com.rosicleia&rasson.capUservletget.controller;

import java.io.IDException;
import java.io.;rintQriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.QebServlet;
import javax.servlet."ttp.:ttpServlet;
import javax.servlet."ttp.:ttpServletCe<uest;
import javax.servlet."ttp.:ttpServletCesponse;

@QebServlet(name # ,ServletAontroller,J url;atterns # {,2ServletAontroller,)
public class ServletAontroller extends :ttpServlet {

protected void processCe<uest(:ttpServletCe<uest re<uestJ :ttpServletCesponse response)
t"ro3s ServletExceptionJ IDException {
;rintQriter p3 # response.getQriter();
String nome # re<uest.get;arameter(,nome,);
int idade # Integer.parseInt(re<uest.get;arameter(,idade,));
p3.println(,*"tml8*body8,);
p3.println(,*"'8)alores digitados*2"'8,);
p3.println(,$ome1 , M nome);
p3.println(,*2br8,);
p3.println(,Idade1 , M idade);
p3.println(,*2body8*2"tml8,);


@Dverride
protected void do(et(:ttpServletCe<uest re<uestJ :ttpServletCesponse response)
t"ro3s ServletExceptionJ IDException {
processCe<uest(re<uestJ response);


@Dverride
protected void do;ost(:ttpServletCe<uest re<uestJ :ttpServletCesponse response)
t"ro3s ServletExceptionJ IDException {



Como pode ser visualizado, a classe ServletController um Servlet que implementa o
mtodo doGet. Sendo assim, responde requisies do tipo HTTP via mtodo GET. A resposta
desse Servlet processada atravs dos valores dos parmetros que so passados atravs da
URL. O mtodo getParameter responsvel por acessar as informaes passadas pelos
parmetros na URL.

Vale lembrar que como os dados so passados via URL, existe a possibilidade do usurio
efetuar a alterao do mesmo pela URL. Por este motivo, requisies via mtodo get devem ser
utilizadas apenas em operaes que dados da base de dados no sero alterados.


Mtodo Post

1. Crie um projeto Java web no Netbeans e altere o arquivo index.html como no cdigo a seguir.
importante perceber que o formulrio possui o mtodo POST.
*R?DA/S;E "tml8
Captulo 4 - Servlets Rosiclia Frasson

46

*"tml8
*"ead8
*title8!Ttodo ;ost*2title8
*meta c"arset#,./F9B,8
*2"ead8
*body8
*&orm name#,teste, met"od#,;DS/, action#,2AapUServlet;ost2ServletAontroller,8
*table8
*tr8
*td8$ome*2td8
*td8*input type#,text, name#,nome, 28*2td8
*2tr8

*tr8
*td8Idade1*2td8
*td8*input type#,text, name#,idade, 28*2td8
*2tr8

*tr8
*td8*2td8
*td8*input type#,submit, value#,Salvar, 28
*input type#,reset, value#,6impar, 28*2td8
*2tr8
*2table8
*2&orm8
*2body8
*2"tml8

2. Em seguida, crie uma Servlet e deixe a mesma com os seguintes comandos.
pac%age br.com.rosicleia&rasson.capUservletpost.controller;

import java.io.IDException;
import java.io.;rintQriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.QebServlet;
import javax.servlet."ttp.:ttpServlet;
import javax.servlet."ttp.:ttpServletCe<uest;
import javax.servlet."ttp.:ttpServletCesponse;

@QebServlet(name # ,ServletAontroller,J url;atterns # {,2ServletAontroller,)
public class ServletAontroller extends :ttpServlet {

protected void processCe<uest(:ttpServletCe<uest re<uestJ :ttpServletCesponse response)
t"ro3s ServletExceptionJ IDException {
;rintQriter p3 # response.getQriter();
String nome # re<uest.get;arameter(,nome,);
int idade # Integer.parseInt(re<uest.get;arameter(,idade,));
p3.println(,*"tml8*body8,);
p3.println(,*"'8)alores digitados*2"'8,);
p3.println(,$ome1 , M nome);
p3.println(,*2br8,);
p3.println(,Idade1 , M idade);
p3.println(,*2body8*2"tml8,);


@Dverride
protected void do(et(:ttpServletCe<uest re<uestJ :ttpServletCesponse response)
t"ro3s ServletExceptionJ IDException {

Captulo 4 - Servlets Rosiclia Frasson

47


@Dverride
protected void do;ost(:ttpServletCe<uest re<uestJ :ttpServletCesponse response)
t"ro3s ServletExceptionJ IDException {
processCe<uest(re<uestJ response);



Como pode ser visualizado este exemplo semelhante ao anterior, execeto o fato de usar
o mtodo post ao invs do mtodo get. A diferena primordial dessas duas abordagens que no
mtodo get os dados aparecem na URL e no mtodo post os dados no so exibidos no
navegador.





Captulo 5 - JSP Rosiclia Frasson

48

JSP

Os Servlets permitem que contedos dinmicos sejam adicionados as pginas HTML.
Porm, o uso de Servlets exige que grande parte do cdigo esttico HTML seja escrito nas
Servlets como cdigo Java, diminuindo assim a legibilidade do cdigo e dificultando a manuteno
das pginas. Outro problema encontrado com o uso das Servlets, que o trabalho de deixar as
pginas mais bonitas, desenvolvido pelo designer, ficou muito difcil, visto que este profissional, na
maioria das vezes, no possui conhecimento na linguagem de programao Java.
A tecnologia JSP (Java Server Pages)permite que seja adicionado comportamento
dinmico nas pginas HTML, ou seja, um arquivo com extenso .jsp pode possuir elementos
HTML e cdigos Java embutidos. A grande vantagem na utilizao desta tecnologia, se
comparada, as demais existentes como ASP e PHP, que a mesma independente de
plataforma. Os trechos de cdigos dinmicos, dentro dos arquivos JSP so delimitados com <% e
%>.
De maneira oculta, as pginas JSP so compiladas em Servlets. A compilao feita no
primeiro acesso. Nos acessos subsequentes, a requisio redirecionada ao servlet que foi
gerado a partir do arquivo JSP. Levando em considerao as afirmativas apresentadas, o primeiro
acesso a um arquivo JSP sempre mais lento, por conta do processo de compilao.
A tecnologia JSP permite separar a apresentao da lgica de negcio, facilitando o
desenvolvimento de aplicaes robustas, onde o programador e o designer podem trabalhar em
um mesmo projeto de forma independente. Com JSP tambm possvel reutilizar contedos
dinmicos.


Elementos de uma pgina JSP

Diretivas: Fornecem informaes gerais acerca da pgina JSP. Sua sintaxe <%@
diretiva %>. As principais diretivas so page, include e taglib.
page: A diretiva page responsvel por fornecer informaes sobre a pgina JSP.
Deve ser usada no incio da pgina. No exemplo mostrado a seguir, o atributo
contentType indica o tipo de sada do documento e o atributo pageEncoding define
o conjunto de caracter a ser utilizado.
*V@page content/ype#,text2"tml, pageEncoding#,./F9B,V8

include: A diretiva include permite que um arquivo texto seja inserido em uma
pgina JSP. Esta diretiva pode ser utilizada em qualquer lugar da pgina e quantas
vezes forem necessrias. No exemplo de cdigo mostrado a seguir, deve ser
adicionado ao arquivo corrente, o contedo do arquivo header.html.
*V@ include &ile#W"eader."tmlW V8

taglib: A diretiva taglib indica que um conjunto de tags personalizadas estar a
disposio para ser utilizada. Tambm associa um prefixo a uma biblioteca de tags.
*V@ taglib pre&ix # XtesteW uri# Xtaglib.tldW V8

Declaraes: As declaraes permitem a adio de cdigo Java, ou seja, qualquer cdigo
vlido em uma classe Java, pode estar dentro de uma declarao, como por exemplo,
Captulo 5 - JSP Rosiclia Frasson

49

declarao e inicializao de variveis, declarao e implementao de mtodos. Um
detalhe importante que as declaraes no geram sadas. Deste modo, as mesmas so
usadas em conjunto com expresses ou scriptlets. As declaraesdevem estar entre <%! e
%>.
*VR int i # -; V8

Expresso: As expresses geram sadas para a pgina. Utilizam-se as expresses para
instrues que retornam valor.
*V#areaV8

Scriptlet: Os scriptlets so utilizados em processamentos mais complexos do que as
expresses. Dentro dos scriptlets possvel inserir condicionais e loops.
*V
double base # ?ouble.parse?ouble(re<uest.get;arameter(,base,));
double altura # ?ouble.parse?ouble(re<uest.get;arameter(,altura,));
double area # base Y altura;
V8

Comentrios de uma pgina JSP: Os comentrios indicam ao compilador que trechos de
cdigo devem ser ignorados. Os comentrios em JSP devem ser escritos entre <%-- e --
%>.
*V99
?ocument 1 index
Areated on 1 0-2'020-'4J ''1'-10Z
Eut"or 1 CosiclTia Frasson
99V8


Ciclo de vida de uma pgina JSP

No momento em que uma pgina JSP requerida atravs de um browser, esta ser
processada pelo servidor. Existe diferena entre o primeiro acesso pgina e os demais. No
primeiro acesso, a pgina transformada em uma Servlet, compilada, gerando dessa forma o
bytecode. A partir do bytecode gerada a pgina HTML que enviada de volta ao browser do
cliente. O processo de montagem da pgina HTML pode requerer informaes da base de dados,
arquivos texto, entre outros. Caso, a requisio seja para uma pgina anteriormente acessada,
uma verificao feita com o intuito de averiguar se houve alguma mudana. Em caso afirmativo,
feita a compilao novamente. Caso contrrio o HTML montado.
Devido ao procedimento citado, o primeiro acesso a pgina JSP lento. A partir do
segundo acesso, as pginas JSP so mais velozes.


PASSO-A-PASSO

1. No Netbeans deve ser criado um projeto Java web, o mesmo deve ficar com a estrutura
mostrada a seguir.
Captulo 5 - JSP



2. O arquivo index.html deve ser removido e criado um arquivo index.jsp.

3. No arquivo criado, deve ser inserido o cdigo a seguir.

*V99
?ocument 1 index
Areated on 1 0-2'020-'4J ''1'-10Z
Eut"or 1 CosiclTia Frasson
99V8

*V@page content/ype#,text2"tml, pageEncoding#,./F
*R?DA/S;E "tml8
*"tml8
*"ead8
*meta "ttp9e<uiv#,Aontent
*title8Exemplo pNgina GS;*2title8
*2"ead8
*body8
*"'8Exemplo pNgina

2. O arquivo index.html deve ser removido e criado um arquivo index.jsp.
3. No arquivo criado, deve ser inserido o cdigo a seguir.
Areated on 1 0-2'020-'4J ''1'-10Z
Eut"or 1 CosiclTia Frasson
*V@page content/ype#,text2"tml, pageEncoding#,./F9B,V8
e<uiv#,Aontent9/ype, content#,text2"tml; c"arset#./F
*title8Exemplo pNgina GS;*2title8
*"'8Exemplo pNgina GS;*2"'8
Rosiclia Frasson
50

/ype, content#,text2"tml; c"arset#./F9B,8
Captulo 5 - JSP Rosiclia Frasson

51

*p8ANlculo Nrea ret[ngulo*2p8
*&orm action#,resultado.jsp, met"od#,post,8
*table8
*tr8
*td8@ase*2td8
*td8*input type#,text, name#,base, 28*2td8
*2tr8
*tr8
*td8Eltura*2td8
*td8*input type#,text, name#,altura, 28*2td8
*2tr8
*tr8
*td colspan#,0,8
*input type#,submit, value#,Aalcular, 28
*input type#,reset, value#,6impar, 28
*2td8
*2tr8
*2table8
*2&orm8
*2body8
*2"tml8

importante perceber que o atributo action da tag form especifica a pgina em que os
dados do formulrio sero enviados e o atributo method, o mtodo que ser utilizado.

4. Para exibir a rea do retngulo, necessrio criar uma nova pgina JSP. Esta deve ter o
nome de resultado.jsp, pois na ao do formulrio esta pgina est sendo referenciada. O cdigo
da mesma est ilustrado a seguir.

*V99
?ocument 1 resultado
Areated on 1 0-2'020-'4J ''14414-
Eut"or 1 CosiclTia Frasson
99V8

*V@page content/ype#,text2"tml, pageEncoding#,./F9B,V8
*R?DA/S;E "tml8
*"tml8
*"ead8
*meta "ttp9e<uiv#,Aontent9/ype, content#,text2"tml; c"arset#./F9B,8
*title8Exemplo pNgina GS;*2title8
*2"ead8
*body8
*V
double base # ?ouble.parse?ouble(re<uest.get;arameter(,base,));
double altura # ?ouble.parse?ouble(re<uest.get;arameter(,altura,));
double area # base Y altura;
V8
*"'8Exemplo pNgina GS;*2"'8
*p8ANlculo Nrea ret[ngulo*2p8
*table border#,',8
*tr8
*td colspan#,0,8*b8?ados &ornecidos pelo usuNrio*2b8*2td8
*2tr8
*tr8
*td8@ase*2td8
*td8*V#baseV8*2td8
*2tr8
Captulo 5 - JSP


*tr8
*td8Eltura*2td8
*td8*V#alturaV8*2td8
*2tr8
*tr8
*td colspan#,0,8
*b8?ados calculados pelo aplicativo*2b8
*2td8
*2tr8
*tr8
*td8\rea*2td8
*td8*V#areaV8*2td8
*2tr8
*2table8
*2body8
*2"tml8

No scriptlet contido logo aps o incio do bloco body, primeiramente so obtidos os
valores dos parmetros - base e altura
Em seguida, efetuado o clculo da rea.
Os valores da base, altura e rea so exibidos na pgina atravs de expresses.

5. Na execuo do projeto deve ser exibida a seguinte pgina.

6. Os valores de base e altura devem ser informados e ao clicar no boto calcular, deve ser
exibida a pgina a seguir com o clculo da rea a partir dos dados informados.
*td8Eltura*2td8
*td8*V#alturaV8*2td8
*td colspan#,0,8
*b8?ados calculados pelo aplicativo*2b8
*td8\rea*2td8
*td8*V#areaV8*2td8
No scriptlet contido logo aps o incio do bloco body, primeiramente so obtidos os
base e altura - enviados pelo usurio e convertidos para o tipo double.
Em seguida, efetuado o clculo da rea.
valores da base, altura e rea so exibidos na pgina atravs de expresses.
5. Na execuo do projeto deve ser exibida a seguinte pgina.
6. Os valores de base e altura devem ser informados e ao clicar no boto calcular, deve ser
guir com o clculo da rea a partir dos dados informados.
Rosiclia Frasson
52
No scriptlet contido logo aps o incio do bloco body, primeiramente so obtidos os
enviados pelo usurio e convertidos para o tipo double.
valores da base, altura e rea so exibidos na pgina atravs de expresses.

6. Os valores de base e altura devem ser informados e ao clicar no boto calcular, deve ser
guir com o clculo da rea a partir dos dados informados.
Captulo 5 - JSP




Java Beans

Um bean uma classe Java que segue uma srie de convenes:
Propriedades: Tambm chamadas de atributos, so responsveis por armazenar o estado
do bean. Devem possuir modificado
Um construtor sem argumentos: A classe pode possuir diversos construtores, porm, deve
ter o construtor padro. Nos casos em que apenas o contrutor default necessrio, o
mesmo pode estar implcito.
Um bean uma classe Java que segue uma srie de convenes:
Propriedades: Tambm chamadas de atributos, so responsveis por armazenar o estado
do bean. Devem possuir modificador de acesso private.
Um construtor sem argumentos: A classe pode possuir diversos construtores, porm, deve
ter o construtor padro. Nos casos em que apenas o contrutor default necessrio, o
mesmo pode estar implcito.
Rosiclia Frasson
53


Propriedades: Tambm chamadas de atributos, so responsveis por armazenar o estado
Um construtor sem argumentos: A classe pode possuir diversos construtores, porm, deve
ter o construtor padro. Nos casos em que apenas o contrutor default necessrio, o
Captulo 5 - JSP Rosiclia Frasson

54

Atributos privados e mtodos de acesso get e set: Para cada propriedade necessria a
existncia dos mtodos de acesso.


PASSO-A-PASSO

Para exemplificar o uso do bean, o exemplo apresentado anteriormente ser modificado.
1. Deve ser criado um novo projeto java web no Netbeans.
2. O arquivo index.html deve ser removido e criado um arquivo index.jsp com o cdigo a seguir.

*V99
?ocument 1 index
Areated on 1 0-2'020-'4J ''1'-10Z
Eut"or 1 CosiclTia Frasson
99V8

*V@page content/ype#,text2"tml, pageEncoding#,./F9B,V8
*R?DA/S;E "tml8
*"tml8
*"ead8
*meta "ttp9e<uiv#,Aontent9/ype, content#,text2"tml; c"arset#./F9B,8
*title8Exemplo pNgina GS;*2title8
*2"ead8
*body8
*"'8Exemplo pNgina GS;*2"'8
*p8ANlculo Nrea ret[ngulo*2p8
*&orm action#,ServletAontroller, met"od#,post,8
*table8
*tr8
*td8@ase*2td8
*td8*input type#,text, name#,base, 28*2td8
*2tr8
*tr8
*td8Eltura*2td8
*td8*input type#,text, name#,altura, 28*2td8
*2tr8
*tr8
*td colspan#,0,8
*input type#,submit, value#,Aalcular, 28
*input type#,reset, value#,6impar, 28
*2td8
*2tr8
*2table8
*2&orm8
*2body8
*2"tml8

3. Tambm necessria a criao de um bean chamado Retangulo, onde sero armazenados os
atributos e os respectivos mtodos de acesso. Esta classe deve ficar dentro do pacote modelo. O
cdigo da mesma est descrito a seguir.

pac%age br.com.rosicleia&rasson.capIexemplojavabean.modelo;

public class Cetangulo {

private double base;
Captulo 5 - JSP Rosiclia Frasson

55

private double altura;
private double area;

public double get@ase() {
return base;


public void set@ase(double base) {
t"is.base # base;


public double getEltura() {
return altura;


public void setEltura(double altura) {
t"is.altura # altura;


public double getErea() {
return base Y altura;



4. Tambm necessrio a criao de uma servlet que captura os dados da pgina index e envia
para o bean.

pac%age br.com.rosicleia&rasson.capIexemplojavabean.controller;

import br.com.rosicleia&rasson.capIexemplojavabean.modelo.Cetangulo;
import java.io.IDException;
import javax.servlet.Ce<uest?ispatc"er;
import javax.servlet.ServletException;
import javax.servlet.annotation.QebServlet;
import javax.servlet."ttp.:ttpServlet;
import javax.servlet."ttp.:ttpServletCe<uest;
import javax.servlet."ttp.:ttpServletCesponse;

@QebServlet(name # ,ServletAontroller,J url;atterns # {,2ServletAontroller,)
public class ServletAontroller extends :ttpServlet {

protected void processCe<uest(:ttpServletCe<uest re<uestJ :ttpServletCesponse response)
t"ro3s ServletExceptionJ IDException {

Cetangulo r # ne3 Cetangulo();
r.set@ase(?ouble.parse?ouble(re<uest.get;arameter(,base,)));
r.setEltura(?ouble.parse?ouble(re<uest.get;arameter(,altura,)));
re<uest.setEttribute(,retangulo@ean,J r);
Ce<uest?ispatc"er rd # re<uest.getCe<uest?ispatc"er(,resultado.jsp,);
rd.&or3ard(re<uestJ response);


@Dverride
protected void do(et(:ttpServletCe<uest re<uestJ :ttpServletCesponse response)
t"ro3s ServletExceptionJ IDException {


@Dverride
protected void do;ost(:ttpServletCe<uest re<uestJ :ttpServletCesponse response)
Captulo 5 - JSP Rosiclia Frasson

56

t"ro3s ServletExceptionJ IDException {
processCe<uest(re<uestJ response);



5. Por fim, a criaao da pgina resultado.jsp que exibe os dados calculados pelo aplicativo.

*V99
?ocument 1 index
Areated on 1 0-2'020-'4J ''1'-10Z
Eut"or 1 CosiclTia Frasson
99V8

*V@page import#,br.com.rosicleia&rasson.capIexemplojavabean.modelo.Cetangulo,V8
*V@page content/ype#,text2"tml, pageEncoding#,./F9B,V8

*R?DA/S;E "tml8
*"tml8
*"ead8
*meta "ttp9e<uiv#,Aontent9/ype, content#,text2"tml; c"arset#./F9B,8
*title8Exemplo pNgina GS;*2title8
*2"ead8
*body8
*V
Cetangulo ret # (Cetangulo) re<uest.getEttribute(,retangulo@ean,);
V8
*"'8ANlculo Nrea ret[ngulo*2"'8
*table border#,',8
*tr8
*td colspan#,0,8*b8?ados &ornecidos pelo usuNrio*2b8*2td8
*2tr8
*tr8
*td8@ase*2td8
*td8*V#ret.get@ase()V8*2td8
*2tr8
*tr8
*td8Eltura*2td8
*td8*V#ret.getEltura()V8*2td8
*2tr8
*tr8
*td colspan#,0,8*b8?ados calculados pelo aplicativo*2b8*2td8
*2tr8
*tr8
*td8\rea*2td8
*td8*V#ret.getErea()V8*2td8
*2tr8

*2table8

*2body8
*2"tml8

importante perceber que a utilizao de pginas jsp, juntamente com os java beans e as
servlets, separam a lgica de negcio da visualizao. Como este um aplicativo que contm
poucos requisitos de negcio no percepetvel a vantagem desta separao. Em aplicaes
complexas, seria muito difcil misturar cdigos jsp com a lgica de negcio.

Captulo 6 - Frae!or"s #$C


Frameworks MVC

notria a dificuldade de manuteno quando cdigos HTML ficam misturados com
cdigo Java.
Pensando nisso, a comunidade de desenvolvedores comeou a desenvolver ferramentas que
auxiliem a separao das responsabilidades na aplicao. Essas ferramentas so conhecidas
como framewoks MVC ou controladores MVC.
O MVC separa a codificao do software em trs partes
Modelo: Parte do cdigo onde esto representados os objetos de negcio. So esses
objetos que mantm o estado da aplicao e fornecem ao controlador. O modelo
responsvel pelos dados, regras de acesso e modificao dos dados. Essa parte do
cdigo responsvel tambm por se comunicar com a base de dados e outros sistemas
existentes.
Visualizao: Responsvel pela interface do usurio. na camada de visualizao que
definida a forma como os dados so apresentados e as aes dos usurios so
encaminhadas para o controlador.
Controle: Responsvel por efetuar a ligao entre o modelo e a visualizao. no controle
que so interpretadas as solicitaes dos usurios, acionando as opes corretas a serem
realizadas no sistema encaminhando as mesmas ao mode
das solicitaes correpondentes.

A utilizao do MVC prov algumas vantagens no processo de desenvolvimento. Entre
elas pode ser citada o reaproveitamento dos componentes do modelo. Ao utilizar o MVC,
possvel utilizar os objetos de negcio definidos na camada modelo em diversas classes/arquivos
de visualizao. Alm disso, com o aumento da complexidade do software, a manuteno do
mesmo torna-se um processo mais difcil. A separao das responsabilidades em camadas pr
estabelecidas deixa a manuteno do cdigo mais compreensvel.
Diante da aceitao do MVC pela comunidade de programadores Java, surgiram alguns
frameworks baseados no mesmo. Seguem os mais conhecidos.


Struts


notria a dificuldade de manuteno quando cdigos HTML ficam misturados com
a comunidade de desenvolvedores comeou a desenvolver ferramentas que
auxiliem a separao das responsabilidades na aplicao. Essas ferramentas so conhecidas
como framewoks MVC ou controladores MVC.
O MVC separa a codificao do software em trs partes:
Modelo: Parte do cdigo onde esto representados os objetos de negcio. So esses
objetos que mantm o estado da aplicao e fornecem ao controlador. O modelo
responsvel pelos dados, regras de acesso e modificao dos dados. Essa parte do
sponsvel tambm por se comunicar com a base de dados e outros sistemas
Visualizao: Responsvel pela interface do usurio. na camada de visualizao que
definida a forma como os dados so apresentados e as aes dos usurios so
das para o controlador.
Controle: Responsvel por efetuar a ligao entre o modelo e a visualizao. no controle
que so interpretadas as solicitaes dos usurios, acionando as opes corretas a serem
realizadas no sistema encaminhando as mesmas ao modelo e retornando as visualizaes
das solicitaes correpondentes.
A utilizao do MVC prov algumas vantagens no processo de desenvolvimento. Entre
elas pode ser citada o reaproveitamento dos componentes do modelo. Ao utilizar o MVC,
os objetos de negcio definidos na camada modelo em diversas classes/arquivos
de visualizao. Alm disso, com o aumento da complexidade do software, a manuteno do
se um processo mais difcil. A separao das responsabilidades em camadas pr
estabelecidas deixa a manuteno do cdigo mais compreensvel.
Diante da aceitao do MVC pela comunidade de programadores Java, surgiram alguns
frameworks baseados no mesmo. Seguem os mais conhecidos.
Rosiclia Frasson
57
notria a dificuldade de manuteno quando cdigos HTML ficam misturados com
a comunidade de desenvolvedores comeou a desenvolver ferramentas que
auxiliem a separao das responsabilidades na aplicao. Essas ferramentas so conhecidas
Modelo: Parte do cdigo onde esto representados os objetos de negcio. So esses
objetos que mantm o estado da aplicao e fornecem ao controlador. O modelo
responsvel pelos dados, regras de acesso e modificao dos dados. Essa parte do
sponsvel tambm por se comunicar com a base de dados e outros sistemas
Visualizao: Responsvel pela interface do usurio. na camada de visualizao que
definida a forma como os dados so apresentados e as aes dos usurios so
Controle: Responsvel por efetuar a ligao entre o modelo e a visualizao. no controle
que so interpretadas as solicitaes dos usurios, acionando as opes corretas a serem
lo e retornando as visualizaes
A utilizao do MVC prov algumas vantagens no processo de desenvolvimento. Entre
elas pode ser citada o reaproveitamento dos componentes do modelo. Ao utilizar o MVC,
os objetos de negcio definidos na camada modelo em diversas classes/arquivos
de visualizao. Alm disso, com o aumento da complexidade do software, a manuteno do
se um processo mais difcil. A separao das responsabilidades em camadas pr-
Diante da aceitao do MVC pela comunidade de programadores Java, surgiram alguns

Captulo 6 - Frae!or"s #$C


O Struts um framework gratuito, de cdi
Foundation <http://struts.apache.org/
desenvolvimento de aplicaes Java EE utilizando o MVC.
Com o uso do Struts, atravs do ActionForm, os dados de um formulrio HTML so
recuperados mais facilmente. Alm disso, o framework conta com o Action, que um
frontController que delega o processamento da requisio para um componente especfico. O
Struts conta ainda com uma biblioteca de tags para a construo das pginas JSP e um arquivo
de configuraes XML, que indicam as Actions responsveis para o atendimento de determinada
requisio.

VRaptor

O VRaptor um framework desenvolvido em territrio nacional. Foi cria
Guilherme Silveira e atualmente mantido pela Caelum. gratuito, open source e possui
documentao em portugus.

Uma das grandes vantagens do framework, que o mesmo encapsula as principais
classes de Servlets como HttpServletRequest
lgica dos Servlets, garante alta produtividade e baixa curva de aprendizado.














O Struts um framework gratuito, de cdigo aberto, disponibilizado pela Apache Software
http://struts.apache.org/>. Este framework foi desenvolvido para facilitar o
desenvolvimento de aplicaes Java EE utilizando o MVC.
, atravs do ActionForm, os dados de um formulrio HTML so
recuperados mais facilmente. Alm disso, o framework conta com o Action, que um
frontController que delega o processamento da requisio para um componente especfico. O
ma biblioteca de tags para a construo das pginas JSP e um arquivo
de configuraes XML, que indicam as Actions responsveis para o atendimento de determinada

O VRaptor um framework desenvolvido em territrio nacional. Foi cria
Guilherme Silveira e atualmente mantido pela Caelum. gratuito, open source e possui

Uma das grandes vantagens do framework, que o mesmo encapsula as principais
classes de Servlets como HttpServletRequest, HttpServletResponse e Session. Por encapsular a
lgica dos Servlets, garante alta produtividade e baixa curva de aprendizado.
Rosiclia Frasson
58
go aberto, disponibilizado pela Apache Software
>. Este framework foi desenvolvido para facilitar o
, atravs do ActionForm, os dados de um formulrio HTML so
recuperados mais facilmente. Alm disso, o framework conta com o Action, que um
frontController que delega o processamento da requisio para um componente especfico. O
ma biblioteca de tags para a construo das pginas JSP e um arquivo
de configuraes XML, que indicam as Actions responsveis para o atendimento de determinada
O VRaptor um framework desenvolvido em territrio nacional. Foi criado na USP por
Guilherme Silveira e atualmente mantido pela Caelum. gratuito, open source e possui

Uma das grandes vantagens do framework, que o mesmo encapsula as principais
, HttpServletResponse e Session. Por encapsular a
lgica dos Servlets, garante alta produtividade e baixa curva de aprendizado.
Captulo 6 - Frae!or"s #$C


Spring

um framework open source para gerenciar componentes e um conjunto de servios para
interfaces de usurios, transaes e persistncia. Alm do mdu
do framework, existe o Spring Data para persistncia e o Spring Security para segurana da
aplicao.


JSF

O Java Server Faces (JSF) foi desenvolvido pelo comit JCP
est especificado na JSR 314 (Java Specification Request) . Por ser uma especificao, existem
diversos fornecedores que desenvolvem a implementao.
O JSF prov um conjunto de componentes baseados em eventos para a construo da
interface com o usurio. Esses componentes possuem um modelo para manipulao de eventos.
Alm disso, o JSF possui suporte de diversos fabricantes que fornecem conjuntos de
componentes prontos para utilizao. Alm disso, o JSF inclui APIs para validao das ent
dos usurios, definio e controle de navegao das pginas e suporte a internacionalizao.
O JSF tambm permite a integrao com diversos frameworks como os j citados Spring e
Struts. Alm da integrao com frameworks de mapeamento objeto
EclipseLink.












um framework open source para gerenciar componentes e um conjunto de servios para
rios, transaes e persistncia. Alm do mdulo core, que representa o cerne
do framework, existe o Spring Data para persistncia e o Spring Security para segurana da
O Java Server Faces (JSF) foi desenvolvido pelo comit JCP - Java Co
est especificado na JSR 314 (Java Specification Request) . Por ser uma especificao, existem
diversos fornecedores que desenvolvem a implementao.
O JSF prov um conjunto de componentes baseados em eventos para a construo da
ace com o usurio. Esses componentes possuem um modelo para manipulao de eventos.
Alm disso, o JSF possui suporte de diversos fabricantes que fornecem conjuntos de
componentes prontos para utilizao. Alm disso, o JSF inclui APIs para validao das ent
dos usurios, definio e controle de navegao das pginas e suporte a internacionalizao.
O JSF tambm permite a integrao com diversos frameworks como os j citados Spring e
Struts. Alm da integrao com frameworks de mapeamento objeto-relacio
Rosiclia Frasson
59

um framework open source para gerenciar componentes e um conjunto de servios para
lo core, que representa o cerne
do framework, existe o Spring Data para persistncia e o Spring Security para segurana da
Java Community Process -e
est especificado na JSR 314 (Java Specification Request) . Por ser uma especificao, existem
O JSF prov um conjunto de componentes baseados em eventos para a construo da
ace com o usurio. Esses componentes possuem um modelo para manipulao de eventos.
Alm disso, o JSF possui suporte de diversos fabricantes que fornecem conjuntos de
componentes prontos para utilizao. Alm disso, o JSF inclui APIs para validao das entradas
dos usurios, definio e controle de navegao das pginas e suporte a internacionalizao.
O JSF tambm permite a integrao com diversos frameworks como os j citados Spring e
relacional como Hibernate,
Captulo % - JSF Rosiclia Frasson

60

JSF

A tecnologia Java Server Faces (JSF) foi desenvolvida com o intuito de deixar o
desenvolvimento de aplicativos JEE com aparncia, facilidade e produtividade de sistemas
desktop. Ela composta por um modelo de componentes para interfaces do usurio, um modelo
de programao orientada a eventos, validao do lado servidor e converso de dados.
O JSF uma especificao lanada juntamente com JEE 6 e pode ser consultada em:
http://jcp.org/en/jsr/detail?id=314. Sendo uma especificao, existem diversas implementaes da
mesma. A implementao referencial a Mojarra da Oracle. Existe tambm uma outra
implementao bastante conhecida que a MyFaces da Apache.
O JSF baseado no MVC e a separao das camadas fica muito clara para o
desenvolvedor. A camada de controle nesta tecnologia basicamente formada por uma servlet
chamada de FacesServlet, por arquivos de configurao e por manipuladores de ao e
observadores de eventos. O FacesServlet possui como responsabilidade o recebimento de
requisies dos usurios, redirecionando as mesmas para o modelo e retornando a resposta
devida. Nos arquivos de configurao esto contidas as regras de navegao. Os manipuladores
de eventos recebem dados da camada de visualizao, acessam o modelo e retornam o resultado
atravs do FacesServlet.
A camada de visualizao do JSF, composta por pginas com extenso xhtml. Essas
pginas so construdas utilizando um conjunto de componentes, que incluem caixas de texto,
botes, formulrios, tabelas, calendrios, entre outros, que so adicionados, renderizados e
exibidos em formato html. Deste modo, o desenvolvedor que utiliza tal tecnologia no possui a
necessidade de escrever cdigo HTML.
O uso do JSF para o desenvolvimento de projetos possui inmeras vantagens. Entre elas
podem ser citadas:
componentes customizados: alm dos componentes bsicos fornecidos pelo framework,
podem ser utilizadas bibliotecas de componentes de terceiros e/ou a fabricao de novos
componentes.
converso de dados: os dados digitados pelo usurio podem facilmente ser convertidos
para tipos especficos como datas, nmeros, entre outros.
validao: o JSF facilita o processo de validaes bsicas como campos requeridos,
formatos de cpf, cnpj, entre outros.
manipulao de erros: a manipulao de erros, bem como customizao de mensagens de
erro apropriadas so facilitadas com o uso do JSF.
suporte a internacionalizao: o JSF suporta aplicaes multiidiomas com o recurso i18n.


Estrutura bsica de uma pgina JSF

O contedo de uma pgina JSF definido no corpo da tag <html>. Esse contedo
dividido em duas partes: o cabealho, delimitado pela tag <h:head> (e no pela tag <head>), e o
corpo, delimitado pela tag <h:body> (e no pela tag <body>).
As bibliotecas de tags que sero utilizadas para construir a pgina devem ser importadas
atravs do pseudo-atributo xmlns aplicado tag <html>.

*+xml version#]'.-] encoding#]./F9B] +8
*R?DA/S;E "tml ;.@6IA ,922Q4A22?/? 5:/!6 '.- /ransitional22E$,
Captulo % - JSF Rosiclia Frasson

61

,"ttp122333.34.org2/C2x"tml'2?/?2x"tml'9transitional.dtd,8
*"tml xmlns#,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122java.sun.com2js&2"tml,
xmlns1&#,"ttp122java.sun.com2js&2core,8

*"1"ead8

*2"1"ead8

*"1body8

*2"1body8

*2"tml8


PASSO-A-PASSO

Primeiro Projeto JSF

1. Para criar um projeto JSF no Netbeans necessrio escolher a categoria Java Web e em
Projetos Aplicao Web.


2. Na Guia Nome e Localizao, necessrio dar um nome ao projeto e apontar onde o mesmo
ser salvo.
Captulo % - JSF Rosiclia Frasson

62



3. Na Guia Servidor e Definies ser escolhido como servidor o GlassFish Server 4.0. A escolha
por este servidor se deu em funo do mesmo ser instalado junto com o Netbeans. Outros
servidores podem ser utilizados, porm, eles devem ser instalados.
A verso do Java utilizada a verso 7.
O caminho do contexto o caminho que ser utilizado para acessar a aplicao. Neste exemplo,
o caminho do contexto mesmo nome da aplicao.
Captulo % - JSF Rosiclia Frasson

63



4. Na Guia Frameworks, necessrio sinalizar a IDE que ser utilizado o framework JSF. Em
bibliotecas, deve ser selecionada a verso do JSF que ser utilizada.
Em componentes, no ser utilizada nenhuma biblioteca de componentes neste projeto.

Em configurao, o padro de URL do Servlet JSF /faces/*. importante ressaltar que nos
projetos JSF, existe uma Servlet que efetua o controle da aplicao. Como j mencionado esta
servlet possui o nome de Faces Servlet. No arquivo web.xml, montado automaticamente pelo
Netbeans apontada a classe que implementa a Faces Servlet e o padro de url associado a
esta servlet. No exemplo apresentado, toda vez que o caminho da URL iniciar por /faces/, a
Faces Servlet invocada.

Captulo % - JSF Rosiclia Frasson

64



5. Deve ser criado um projeto com estrutura similar figura a seguir. importante perceber que o
JSF utiliza arquivos com extenso .xhtml para construo de suas pginas.


6. Na estrutura de arquivos e pastas criadas existe um arquivo que merece grande ateno, o
web.xml que fica dentro da pasta WEB-INF. No mesmo constam alguns parmetros importantes
para o projeto. Um parmetro que merece ateno no momento o servlet. O elemento servlet-
class declara javax.faces.webapp.FacesServlet fazendo com que a classe seja carregada
automaticamente. A url pattern declarada /faces/*, o que indica que a Servlet invocada cada
vez que o caminho da URL iniciar por /faces/. O elemento session-timeout indica que a sesso
expira em 30 minutos. Por sua vez, o elemento welcome-file indica a pgina inicial da aplicao.
Vale salientar que o nome do arquivo que corresponde a pgina inicial index.xhtml e como
configurado anteriormente a url pattern faces antecede o nome do arquivo.

*+xml version#,'.-, encoding#,./F9B,+8
*3eb9app version#,4.', xmlns#,"ttp122xmlns.jcp.org2xml2ns2javaee,
xmlns1xsi#,"ttp122333.34.org20--'25!6Sc"ema9instance,
xsi1sc"ema6ocation#,"ttp122xmlns.jcp.org2xml2ns2javaee
"ttp122xmlns.jcp.org2xml2ns2javaee23eb9app747'.xsd,8
Captulo % - JSF Rosiclia Frasson

65

*context9param8
*param9name8javax.&aces.;CDGEA/7S/E(E*2param9name8
*param9value8?evelopment*2param9value8
*2context9param8
*servlet8
*servlet9name8Faces Servlet*2servlet9name8
*servlet9class8javax.&aces.3ebapp.FacesServlet*2servlet9class8
*load9on9startup8'*2load9on9startup8
*2servlet8
*servlet9mapping8
*servlet9name8Faces Servlet*2servlet9name8
*url9pattern82&aces2Y*2url9pattern8
*2servlet9mapping8
*session9con&ig8
*session9timeout8
4-
*2session9timeout8
*2session9con&ig8
*3elcome9&ile9list8
*3elcome9&ile8&aces2index.x"tml*23elcome9&ile8
*23elcome9&ile9list8
*23eb9app8

7. A pgina index.xhtml deve ser modificada e conter o cdigo a seguir. importante perceber a
declarao da biblioteca html do JSF com o prefixo h: xmlns1"#,"ttp122java.sun.com2js&2"tml,. Essa
declarao permite que os componentes do JSF sejam utilizados. No exemplo apresentado so
utilizados os componentes h:head, que indica o cabealho da pgina e h:body que indica o corpo
da pgina.

*+xml version#]'.-] encoding#]./F9B] +8
*R?DA/S;E "tml ;.@6IA ,922Q4A22?/? 5:/!6 '.- /ransitional22E$,
,"ttp122333.34.org2/C2x"tml'2?/?2x"tml'9transitional.dtd,8
*"tml xmlns#,"ttp122333.34.org2'ZZZ2x"tml, xmlns1"#,"ttp122java.sun.com2js&2"tml,8
*"1"ead8
*title8;rimeira pNgina GSF*2title8
*2"1"ead8
*"1body8
:ello GSFR
*2"1body8
*2"tml8

8. Executando a aplicao, deve ser exibida a seguinte pgina.



Ciclo de vida JSF

Pelo fato do JSF ser uma tecnologia baseada nas pginas JSP, seu ciclo de vida
semelhante. Do mesmo modo, que nas pginas JSP, em JSF, as requisies dos usurios so
Captulo % - JSF


efetuadas utilizando o protocolo HTTP e as respostas so devolvidas como pginas HTML.
Porm, no JSF, como existe a necessidade de converso e validao dos dados antes do envio
ao servidor, o ciclo de vida um pouco mais complexo e dividido em vrias fases:

Restore View: Nesta fase se a pgina j foi exibida anteriormente, a rvore de
componentes recuperada.
componentes construda. O JSF mantm os dados do formulrio. Isso significa que se a
requisio rejeitada pelo servidor, as entradas antigas so reexibidas para que o usurio
possa corrig-las. Caso no existam dados a serem submetidos, o request vai direto para a
fase Render Response.
Apply Request Values: Nesta fase, os dados contidos no formulrio so recuperados e
setados nos respectivos componentes.
Process Validation: Esta fase transforma as str
que podem ser objetos de qualquer tipo. Na criao de uma pgina JSF podem ser
anexados validadores que realizam verificaes sobre os valores locais. Se no processo
de validao no ocorrer nenhum erro, o ciclo de vi
validao ou converso, o JSF vai para a fase Render Response, reexibindo a pgina para
que o usurio possa corrigir os valores.
Update Model Values: Nesta fase os valores locais so utilizados para atualizar as
propriedades dos beans que esto ligados aos componentes.
Invoke Application: Nesta fase ocorre a execuo do componente acionado.
Render Response: Nesta fase a resposta codificada e enviada para o navegador.
importante ressaltar que se ocorrer algum erro de conv
Validation, o ciclo de vida passa para esta fase para que o formulrio seja reexibido e os
dados possam ser alterados. No primeiro acesso a pgina, em que o JSF monta a rvore e
exibe para o usurio tambm o ciclo de vida
Render Response.

efetuadas utilizando o protocolo HTTP e as respostas so devolvidas como pginas HTML.
te a necessidade de converso e validao dos dados antes do envio
ao servidor, o ciclo de vida um pouco mais complexo e dividido em vrias fases:
Restore View: Nesta fase se a pgina j foi exibida anteriormente, a rvore de
componentes recuperada. Caso seja a primeira exibio da pgina, a rvore de
componentes construda. O JSF mantm os dados do formulrio. Isso significa que se a
requisio rejeitada pelo servidor, as entradas antigas so reexibidas para que o usurio
no existam dados a serem submetidos, o request vai direto para a
Apply Request Values: Nesta fase, os dados contidos no formulrio so recuperados e
setados nos respectivos componentes.
Process Validation: Esta fase transforma as strings dos componentes em valores locais
que podem ser objetos de qualquer tipo. Na criao de uma pgina JSF podem ser
anexados validadores que realizam verificaes sobre os valores locais. Se no processo
de validao no ocorrer nenhum erro, o ciclo de vida continua. Caso ocorra erro de
validao ou converso, o JSF vai para a fase Render Response, reexibindo a pgina para
que o usurio possa corrigir os valores.
Update Model Values: Nesta fase os valores locais so utilizados para atualizar as
s dos beans que esto ligados aos componentes.
Invoke Application: Nesta fase ocorre a execuo do componente acionado.
Render Response: Nesta fase a resposta codificada e enviada para o navegador.
importante ressaltar que se ocorrer algum erro de converso ou validao na fase Process
Validation, o ciclo de vida passa para esta fase para que o formulrio seja reexibido e os
dados possam ser alterados. No primeiro acesso a pgina, em que o JSF monta a rvore e
exibe para o usurio tambm o ciclo de vida possui apenas a fase de Restore View e
Rosiclia Frasson
66
efetuadas utilizando o protocolo HTTP e as respostas so devolvidas como pginas HTML.
te a necessidade de converso e validao dos dados antes do envio
ao servidor, o ciclo de vida um pouco mais complexo e dividido em vrias fases:
Restore View: Nesta fase se a pgina j foi exibida anteriormente, a rvore de
Caso seja a primeira exibio da pgina, a rvore de
componentes construda. O JSF mantm os dados do formulrio. Isso significa que se a
requisio rejeitada pelo servidor, as entradas antigas so reexibidas para que o usurio
no existam dados a serem submetidos, o request vai direto para a
Apply Request Values: Nesta fase, os dados contidos no formulrio so recuperados e
ings dos componentes em valores locais
que podem ser objetos de qualquer tipo. Na criao de uma pgina JSF podem ser
anexados validadores que realizam verificaes sobre os valores locais. Se no processo
da continua. Caso ocorra erro de
validao ou converso, o JSF vai para a fase Render Response, reexibindo a pgina para
Update Model Values: Nesta fase os valores locais so utilizados para atualizar as
Invoke Application: Nesta fase ocorre a execuo do componente acionado.
Render Response: Nesta fase a resposta codificada e enviada para o navegador.
erso ou validao na fase Process
Validation, o ciclo de vida passa para esta fase para que o formulrio seja reexibido e os
dados possam ser alterados. No primeiro acesso a pgina, em que o JSF monta a rvore e
possui apenas a fase de Restore View e
Captulo % - JSF Rosiclia Frasson

67

Managed Bean

Em aplicaes que utilizam a tecnologia JSF, existe uma separao bem clara entre a
camada de apresentao e a lgica de negcios. Para efetuar a comunicao entre as duas
camadas citadas, so utilizados os managed beans. Como principais responsabilidades dos
managed beans podem ser citados o fornecimento de dados que devem ser exibidos nas telas,
recebimento de dados enviados nas requisies e a execuo de tarefas de acordo com as aes
dos usurios.
Os managed beans podem ser configurados atravs do arquivo faces-config ou atravs de
anotaes. As anotaes so mais utilizadas devido a simplicidade das mesmas. A utilizao da
anotao @ManagedBean do pacote javax.faces.bean torna uma classe um managed bean.

import javax.&aces.bean.!anaged@ean;

@!anaged@ean
public class :ello {


Utilizando esta anotao, o JSF aplica como nome do managed bean o mesmo nome da
classe, porm com a primeira letra minscula. Esse padro pode ser alterado utilizando o atributo
name da anotao.

import javax.&aces.bean.!anaged@ean;

@!anaged@ean(name#,outro$ome,)
public class :ello {


Para que um managed bean disponibilize dados para as telas necessrio a criao dos
mtodos gets.

private String saudacao # ,;rimeira pNgina GSF 0.-,;

public String getSaudacao() {
return saudacao;


Para o recebimento de dados pelos managed bean necessrio a criao dos mtodos
sets.

public void setSaudacao(String saudacao) {
t"is.saudacao # saudacao;


Os managed beans tambm podem conter mtodos para o tratamento de aes do
usurio, como o cadastro de um objeto em uma base de dados por exemplo.




Captulo % - JSF Rosiclia Frasson

68

Expression Language

Expression Language - EL - a linguagem utilizada para que os managed beans possam
ser referenciados nas pginas xhtml. Nos arquivos xhtml, a EL delimitada atravs dos smbolos
#{ }.
Os managed beans so acessados pelas telas atravs do seu nome. As propriedades do
mesmo tambm podem ser acessadas.

*"1output/ext value#,^{"ello.saudacao,28

Embora no seja recomendado, a EL aceita algumas operaes. Seguem os operadores
aceitos pela EL:
aritmticos : +, -, *, / e %. Para os dois ltimos tambm podem ser utilizadas as variantes
alfabticas DIV e MOD.
relacionais: <, <=, >, >=, == e != e suas respectivas variantes alfabticas lt, le, gt, ge, ne e
not.
lgicos: &&, || e ! e suas variantes alfabticas and, or e not.
operador empty: verifica se uma varivel nula ou vazia ou uma colao ou array possui
tamanho igual a zero.


PASSO-A-PASSO

Utilizao do Managed Bean e Expression Language

1. Deve ser criado um projeto web no Netbeans como mostrado no exemplo anterior.

2. necessria a criao de um pacote controller para armazenar o managed bean que deve ter
o nome de Hello. O managed bean uma classe do Java. Segue o cdigo da mesma.
pac%age br.com.rosicleia&rasson.cap_managedbean;

import javax.&aces.bean.!anaged@ean;

@!anaged@ean
public class :ello {

private String saudacao # ,;rimeira pNgina GSF 0.-,;

public String getSaudacao() {
return saudacao;



3. Tambm deve ser alterado o cdigo do arquivo index.xhtml.
*+xml version#]'.-] encoding#]./F9B] +8
*R?DA/S;E "tml ;.@6IA ,922Q4A22?/? 5:/!6 '.- /ransitional22E$,
,"ttp122333.34.org2/C2x"tml'2?/?2x"tml'9transitional.dtd,8
*"tml xmlns#,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122java.sun.com2js&2"tml,8
*"1"ead8
Captulo % - JSF


*title8Sauda`Ho*2title8
*2"1"ead8
*"1body8
*"1&orm8
*"1output/ext value#,^{"ello.
*2"1&orm8
*2"1body8
*2"tml8

importante perceber a utilizao da expression language na tag outputText. O nome do
managed bean o mesmo nome da classe, porm inicia com a letra minscula. Vale ressaltar
tambm que a varivel saudao acessada diretamente. Porm, necessrio o mtodo de
acesso. Se o mesmo no estiver implementado, o valor no acessado e ser gerado um erro
durante a execuo da aplicao.
A seguir, o resultado da execuo da aplicao.

importante perceber que os componentes JSF so transformados em HTML. Segue o
cdigo fonte da pgina apresentada.
*+xml version#]'.-] encoding#]./F
*R?DA/S;E "tml8
*"tml xmlns#,"ttp122333.34.org2'ZZZ2x"tml,8
*"ead id#,j7idt0,8
*title8Sauda`Ho*2title8
*2"ead8

*body8
*&orm id#,j7idtI, name#,j7idtI, met"od#,post,
action#,2Aap_!anaged@ean2&aces2index.x"tml;jsessionid#IIdb_daZ4UZ_'a4-a00'd=BBBU4U,
enctype#,application2x93339&orm
*input type#,"idden, name#,j7idtI, value#,j7idtI, 28
;rimeira pNgina GSF 0.-*input type#,"idd
id#,j7id'1javax.&aces.)ie3State1-, value#,=B40IBZ'=4UUZ-0I'441I'-0U-_Z'Z-0I=_0B4_,
autocomplete#,o&&, 28
*2&orm8
*2body8
*2"tml8









*title8Sauda`Ho*2title8
*"1output/ext value#,^{"ello.saudacao,28
importante perceber a utilizao da expression language na tag outputText. O nome do
managed bean o mesmo nome da classe, porm inicia com a letra minscula. Vale ressaltar
audao acessada diretamente. Porm, necessrio o mtodo de
acesso. Se o mesmo no estiver implementado, o valor no acessado e ser gerado um erro
durante a execuo da aplicao.
A seguir, o resultado da execuo da aplicao.
ceber que os componentes JSF so transformados em HTML. Segue o
cdigo fonte da pgina apresentada.
*+xml version#]'.-] encoding#]./F9B] +8
*"tml xmlns#,"ttp122333.34.org2'ZZZ2x"tml,8
*&orm id#,j7idtI, name#,j7idtI, met"od#,post,
action#,2Aap_!anaged@ean2&aces2index.x"tml;jsessionid#IIdb_daZ4UZ_'a4-a00'd=BBBU4U,
&orm9urlencoded,8
*input type#,"idden, name#,j7idtI, value#,j7idtI, 28
;rimeira pNgina GSF 0.-*input type#,"idden, name#,javax.&aces.)ie3State,
id#,j7id'1javax.&aces.)ie3State1-, value#,=B40IBZ'=4UUZ-0I'441I'-0U-_Z'Z-0I=_0B4_,
Rosiclia Frasson
69
importante perceber a utilizao da expression language na tag outputText. O nome do
managed bean o mesmo nome da classe, porm inicia com a letra minscula. Vale ressaltar
audao acessada diretamente. Porm, necessrio o mtodo de
acesso. Se o mesmo no estiver implementado, o valor no acessado e ser gerado um erro

ceber que os componentes JSF so transformados em HTML. Segue o
*&orm id#,j7idtI, name#,j7idtI, met"od#,post,
action#,2Aap_!anaged@ean2&aces2index.x"tml;jsessionid#IIdb_daZ4UZ_'a4-a00'd=BBBU4U,
en, name#,javax.&aces.)ie3State,
id#,j7id'1javax.&aces.)ie3State1-, value#,=B40IBZ'=4UUZ-0I'441I'-0U-_Z'Z-0I=_0B4_,
Captulo & - Coponentes JSF Rosiclia Frasson

70

Componentes JSF

No JSF 2.0 as telas so definidas por meio arquivos .xhtml. A especificao do JSF possui
um conjunto de componentes que podem ser utilizados na construo dessas telas. Esses
componentes esto divididos duas bibliotecas:
HTML (http://java.sun.com/jsf/html): A biblioteca HTML possui os componentes visuais que
geram o HTML da pgina.
Core (http://java.sun.com/jsf/core): A biblioteca core possui componentes no visuais,
como validadores.

Com a tecnologia JSF, os componentes so renderizados em tempo de execuo, o que
permite que um mesmo componente seja renderizado de acordo com o tipo de cliente que est
solicitando, ou seja, uma mesma pgina ser renderizada de formas diferentes se for acessado
por um computador e por um celular.

Para a utilizao dos componentes necessrio que as bibliotecas estejam importadas nos
arquivos xhtml, atravs do pseudo-atributo xmlns. Segue um exemplo de como devem ser
importadas as duas bibliotecas mencionadas.

*"tml xmlns#,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#"ttp122java.sun.com2js&2"tml
xmlns1&#,"ttp122java.sun.com2js&2core,8

importante perceber que foram declarados prefixos para as duas bibliotecas. Para a biblioteca
core foi declarado o prefixo f e para a biblioteca html foi declarado o prefixo h. Podem ser
declarados qualquer prefixo porm os mencionados so considerados padro e usados pelas
maioria dos desenvolvedores.


Biblioteca HTML

Elementos HTML

Tag Descrio
form Formulrio HTML. Embora nos formulrios HTML necessrio indicar os
atributos method e action, em JSF estes valores no so definidos pelo
desenvolvedor, pois, o method sempre post e a ao igual ao
endereo da mesma pgina.

*+xml version#]'.-] encoding#]./F9B] +8
*R?DA/S;E "tml ;.@6IA ,922Q4A22?/? 5:/!6 '.- /ransitional22E$,
,"ttp122333.34.org2/C2x"tml'2?/?2x"tml'9transitional.dtd,8
*"tml xmlns#,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122java.sun.com2js&2"tml,8

*"1"ead8
*title8Exemplo FormulNrio*2title8
*2"1"ead8
Captulo & - Coponentes JSF









*2"tml8

inputText Campo de entrada de dados com apenas uma linha. Pode ser vinculado
com um atributo de um managed bean.


inputTextArea Campo d

inputSecret Campo de entrada de dados do tipo senha. Os caracteres digitados
ficam ocultos.


inputHidden Campo oculto. Este campo pode ser utilizado para inserir informaes
que devem ser enviadas automaticamente quando um formulrio
enviado ao servidor.


outputLabel Renderiza o elemento label da HTML. Norma
rotular campos de formulrio. O atributo for vincula este componente
com outro.


outputLink Renderiza links externos na pgina.

*"1body8
*"1&orm8
*R99E<ui devem ser colocados os campos do &ormul
*2"1&orm8
*2"1body8
*2"tml8
Campo de entrada de dados com apenas uma linha. Pode ser vinculado
com um atributo de um managed bean.
*"1input/ext value#,^{usuario@ean.usuario.login, id#,login,28
Campo de entrada de dados com mltiplas linhas.
*"1input/extarea value#,^{usuario@ean.usuario.observacoes, 28

Campo de entrada de dados do tipo senha. Os caracteres digitados
ficam ocultos.
*"1inputSecret value#,^{usuario@ean.usuario.sen"a, i
Campo oculto. Este campo pode ser utilizado para inserir informaes
que devem ser enviadas automaticamente quando um formulrio
enviado ao servidor.
*"1input:idden28
Renderiza o elemento label da HTML. Norma
rotular campos de formulrio. O atributo for vincula este componente
com outro.
*"1output6abel value#,6ogin, &or#,login,28
Renderiza links externos na pgina.
Rosiclia Frasson
71
E<ui devem ser colocados os campos do &ormulNrio998
Campo de entrada de dados com apenas uma linha. Pode ser vinculado
*"1input/ext value#,^{usuario@ean.usuario.login, id#,login,28

e entrada de dados com mltiplas linhas.
*"1input/extarea value#,^{usuario@ean.usuario.observacoes, 28

Campo de entrada de dados do tipo senha. Os caracteres digitados
*"1inputSecret value#,^{usuario@ean.usuario.sen"a, id#,sen"a, 28

Campo oculto. Este campo pode ser utilizado para inserir informaes
que devem ser enviadas automaticamente quando um formulrio
Renderiza o elemento label da HTML. Normalmente utilizado para
rotular campos de formulrio. O atributo for vincula este componente
*"1output6abel value#,6ogin, &or#,login,28

Captulo & - Coponentes JSF



outputFormat Permite a adio de texto parametrizado, ou seja, o texto possui
espaos reservados para serem substitudos por valores reais durante o
processamento.


outputText Renderiza textos simples na tela.


commandButton Este componente envia os dados de um formulrio HTML para um
servi
de um managed bean atravs dos atributos action e actionListener.


commandLink Componente com funo similar
comaparncia de um link.


message Exibe uma mensagem de um componente especfico. Geralmente
utilizada em conjunto com validadores e conversores. Par
tag, necessrio definir um id para o componente referente a
mensagem e associar message a este id atravs do atributo for.

*"1output6abel value#,Idade1 , &or#,idade, 28
*"1panel(roup8

validator!essage#,Sa aceitamos candidatos <ue possuam idade entre 'B e B-
anos.,8
*"1output6in% value#,"ttp122333.ajuda.com.br,8
*"1output/ext value#,;ara mais in&orma`bes cli<ue a<ui,28
*2"1output6in%8
Permite a adio de texto parametrizado, ou seja, o texto possui
espaos reservados para serem substitudos por valores reais durante o
processamento.
*"1outputFormat value#,DlN {-,8
*&1param value#,^{login@ean.usuario, 28
*2"1outputFormat8

Renderiza textos simples na tela.
*"1output/ext value#,Aadastro de .suNrio,28
Este componente envia os dados de um formulrio HTML para um
servidor atravs do mtodo post. Pode ser associado a mtodos de ao
de um managed bean atravs dos atributos action e actionListener.
*"1command@utton value#,Aadastrar,
action#,^{usuario@ean.adiciona.suario,28

Componente com funo similar ao commandButton. Apenas
comaparncia de um link.
*"1command6in% value#,Aadastrar,
action#,^{usuario@ean.adiciona.suario,28

Exibe uma mensagem de um componente especfico. Geralmente
utilizada em conjunto com validadores e conversores. Par
tag, necessrio definir um id para o componente referente a
mensagem e associar message a este id atravs do atributo for.
*"1output6abel value#,Idade1 , &or#,idade, 28
*"1panel(roup8
*"1input/ext value#,^{usuario@ean.usuario.idade,
validator!essage#,Sa aceitamos candidatos <ue possuam idade entre 'B e B-
anos.,8
Rosiclia Frasson
72
*"1output6in% value#,"ttp122333.ajuda.com.br,8
t/ext value#,;ara mais in&orma`bes cli<ue a<ui,28

Permite a adio de texto parametrizado, ou seja, o texto possui
espaos reservados para serem substitudos por valores reais durante o
e#,DlN {-,8
*&1param value#,^{login@ean.usuario, 28
*"1output/ext value#,Aadastro de .suNrio,28

Este componente envia os dados de um formulrio HTML para um
dor atravs do mtodo post. Pode ser associado a mtodos de ao
de um managed bean atravs dos atributos action e actionListener.
*"1command@utton value#,Aadastrar,
action#,^{usuario@ean.adiciona.suario,28
ao commandButton. Apenas
*"1command6in% value#,Aadastrar,
action#,^{usuario@ean.adiciona.suario,28
Exibe uma mensagem de um componente especfico. Geralmente
utilizada em conjunto com validadores e conversores. Para utilizar essa
tag, necessrio definir um id para o componente referente a
mensagem e associar message a este id atravs do atributo for.
*"1input/ext value#,^{usuario@ean.usuario.idade, id#,idade,
validator!essage#,Sa aceitamos candidatos <ue possuam idade entre 'B e B-
Captulo & - Coponentes JSF





*2"1panel(roup8

messages Este componente permite que
formulrio sejam exibidos juntos em um local especfico da tela.

graphicImage Este componente adiciona uma imagem na tela. O endereo da imagem
deve ser informado no atributo value e pode ser usa
relativo da mesma.


selectOneListBox Lista de seleo onde apenas um item pode ser selecionado. Os itens
do componente podem ser estticos, como mostrado no exemplo abaixo
ou dinmicos.


*&1validate6ongCange minimum#,'B, maximum#,B-,28
*2"1input/ext8
*"1message &or#,idade,28
*2"1panel(roup8
Este componente permite que os erros dos diversos componentes de um
formulrio sejam exibidos juntos em um local especfico da tela.
*"1messages 28
Este componente adiciona uma imagem na tela. O endereo da imagem
deve ser informado no atributo value e pode ser usa
relativo da mesma.
*"1grap"icImage value#,2imagens2js&.jpg,28
Lista de seleo onde apenas um item pode ser selecionado. Os itens
do componente podem ser estticos, como mostrado no exemplo abaixo
ou dinmicos.
*"1output6abel value#,Escolaridade, &or#,escolaridade,28
*"1selectDne6istbox id#,escolaridade,
value#,^{usuario@ean.usuario.escolaridade, 8
*&1selectItem item)alue#,', item6abel#,$Ho al&abeti>ado,28
*&1selectItem item)alue#,0, item6abel#,El&abeti>ado,28
*&1selectItem item)alue#,4, item6abel#,Ensino &undamental
completo,28
*&1selectItem item)alue#,U, item6abel#,Ensino mTdio
completo,28
*&1selectItem item)alue#,I, item6abel#,Superior completo,28
*2"1selectDne6istbox8
Rosiclia Frasson
73
*&1validate6ongCange minimum#,'B, maximum#,B-,28

os erros dos diversos componentes de um
formulrio sejam exibidos juntos em um local especfico da tela.

Este componente adiciona uma imagem na tela. O endereo da imagem
deve ser informado no atributo value e pode ser usado o caminho
*"1grap"icImage value#,2imagens2js&.jpg,28

Lista de seleo onde apenas um item pode ser selecionado. Os itens
do componente podem ser estticos, como mostrado no exemplo abaixo
t6abel value#,Escolaridade, &or#,escolaridade,28
value#,^{usuario@ean.usuario.escolaridade, 8
*&1selectItem item)alue#,', item6abel#,$Ho al&abeti>ado,28
*&1selectItem item)alue#,0, item6abel#,El&abeti>ado,28
*&1selectItem item)alue#,4, item6abel#,Ensino &undamental
*&1selectItem item)alue#,U, item6abel#,Ensino mTdio
*&1selectItem item)alue#,I, item6abel#,Superior completo,28
Captulo & - Coponentes JSF


selectOneMenu Componente
apenas uma opo pode ser selecionada. Os itens do componente
podem ser estticos ou dinmicos. No exemplo a seguir, os elementos
esto sendo carregados atravs de uma lista que pode representar
dados adiv


selectOneRadio Caixade seleo. No uso deste componente, entre as vrias opes,
apenas uma pode ser selecionada. Este componente tambm pode ser
populado com valores estticos ou dinmicos.


selectBooleanCheckBox Caixa de seleo. Permite que o usurio faa selees do tipo sim o
no.

*"1select@ooleanA"ec%box id#,aceito, value#,^{usuario@ean.aceite,28
*"1output6abel value#,6i e concordo com os termos de uso, &or#,aceito,28

selectManyCheckBox Caixa de seleo. No uso deste componente, vrias opes podem ser
Componente conhecido como combo box. No uso deste componente
apenas uma opo pode ser selecionada. Os itens do componente
podem ser estticos ou dinmicos. No exemplo a seguir, os elementos
esto sendo carregados atravs de uma lista que pode representar
dados adivindos de um banco de dados.
*"1output6abel value#,\rea de Etua`Ho1 , &or#,areaEtuacao,28
*"1selectDne!enu id#,areaEtuacao,
value#,^{usuario@ean.usuario.areaEtuacao,8
*&1selectItems value#,^{usuario@ean.areas,28
*2"1selectDne!enu8
Caixade seleo. No uso deste componente, entre as vrias opes,
apenas uma pode ser selecionada. Este componente tambm pode ser
populado com valores estticos ou dinmicos.
*"1output6abel value#,Sexo1 , &or#,sexo, 28
*"1selectDneCadio value#,^{usuario@ean.usuario.sexo, id#,sexo,8
*&1selectItem item6abel#,Feminino, item)alue#,F,28
*&1selectItem item6abel#,!asculino, item)alue#,!,28
*2"1selectDneCadio8
Caixa de seleo. Permite que o usurio faa selees do tipo sim o
no.
*"1select@ooleanA"ec%box id#,aceito, value#,^{usuario@ean.aceite,28
*"1output6abel value#,6i e concordo com os termos de uso, &or#,aceito,28
Caixa de seleo. No uso deste componente, vrias opes podem ser
Rosiclia Frasson
74

conhecido como combo box. No uso deste componente
apenas uma opo pode ser selecionada. Os itens do componente
podem ser estticos ou dinmicos. No exemplo a seguir, os elementos
esto sendo carregados atravs de uma lista que pode representar
*"1output6abel value#,\rea de Etua`Ho1 , &or#,areaEtuacao,28
value#,^{usuario@ean.usuario.areaEtuacao,8
*&1selectItems value#,^{usuario@ean.areas,28

Caixade seleo. No uso deste componente, entre as vrias opes,
apenas uma pode ser selecionada. Este componente tambm pode ser

@ean.usuario.sexo, id#,sexo,8
*&1selectItem item6abel#,Feminino, item)alue#,F,28
*&1selectItem item6abel#,!asculino, item)alue#,!,28

Caixa de seleo. Permite que o usurio faa selees do tipo sim ou
*"1select@ooleanA"ec%box id#,aceito, value#,^{usuario@ean.aceite,28
*"1output6abel value#,6i e concordo com os termos de uso, &or#,aceito,28

Caixa de seleo. No uso deste componente, vrias opes podem ser
Captulo & - Coponentes JSF


marcadas.


selectManyListBox Componente similar ao selectOneListBox, porm, neste componente
vrios itens podem ser selecionados com a ajuda do boto CTRL.


marcadas.
*"1output6abel value#,:obbies1 , &or#,"obbies,28
*"1select!anyA"ec%box id#,"obbies,
value#,^{usuario@ean.usuario."obbies, layout#,page?irection,8
*&1selectItem item)alue#,!csicas,28
*&1selectItem item)alue#,Filmes,28
*&1selectItem item)alue#,AulinNria,28
*&1selectItem item)alue#,Ertesanato,28
*&1selectItem item)alue#,?ecora`Ho,28
*&1selectItem item)alue#,6ivros,28
*&1selectItem item)alue#,;asseios turLsticos,28
*&1selectItem item)alue#,;rNtica de esportes,28
*2"1select!anyA"ec%box8
Componente similar ao selectOneListBox, porm, neste componente
vrios itens podem ser selecionados com a ajuda do boto CTRL.
*"1output6abel value#,Aores ;rediletas1 , &or#,cores,28
*"1select!any6istbox id#,cores,
value#,^{usuario@ean.usuario.coresFavoritas, 8
*&1selectItem item)alue#,Emarelo,28
*&1selectItem item)alue#,@ranco,28
*&1selectItem item)alue#,;reto,28
*&1selectItem item)alue#,)ermel"o,28
*&1selectItem item)alue#,E>ul,28
*&1selectItem item)alue#,)erde,28
*&1selectItem item)alue#,6ilNs,28
*&1selectItem item)alue#,6aranja,28
*2"1select!any6istbox8
Rosiclia Frasson
75
utput6abel value#,:obbies1 , &or#,"obbies,28
value#,^{usuario@ean.usuario."obbies, layout#,page?irection,8
*&1selectItem item)alue#,;asseios turLsticos,28
*&1selectItem item)alue#,;rNtica de esportes,28

Componente similar ao selectOneListBox, porm, neste componente
vrios itens podem ser selecionados com a ajuda do boto CTRL.
*"1output6abel value#,Aores ;rediletas1 , &or#,cores,28
rio@ean.usuario.coresFavoritas, 8

*&1selectItem item)alue#,)ermel"o,28


Captulo & - Coponentes JSF


selectManyMenu Componente similar ao selectOneMenu, com a diferena de que o
mesmo permite que sejam selecionados vrios itens de uma vez
utilizando a tecla CTRL.


panelGrid Este componente funciona como um organizador de componentes na
pgina e pode acomodar qualquer componente JSF.
como valor padro o nmero de colunas igual a 1. Para modific
necessrio utilizar o atributo columns. No exemplo a seguir tambm foi
utilizada a propriedade border de 1 pixel para a visualizao do
componente.


Componente similar ao selectOneMenu, com a diferena de que o
mesmo permite que sejam selecionados vrios itens de uma vez
utilizando a tecla CTRL.
*"1output6abel value#,Idiomas1 , &or#,idiomas,28
*"1select!any!enu id#,idiomas,
value#,^{usuario@ean.usuario.idiomas, style#,"eig"t1 Z-px,8
*&1selectItem item)alue#,Inglds,28
*&1selectItem item)alue#,Francds,28
*&1selectItem item)alue#,ElemHo,28
*&1selectItem item)alue#,Espan"ol,28
*&1selectItem item)alue#,!andarim,28
*2"1select!any!enu8
Este componente funciona como um organizador de componentes na
pgina e pode acomodar qualquer componente JSF.
como valor padro o nmero de colunas igual a 1. Para modific
necessrio utilizar o atributo columns. No exemplo a seguir tambm foi
utilizada a propriedade border de 1 pixel para a visualizao do
componente.
*"1panel(rid columns#,0, border#,',8

*"1output6abel value#,$ome1 , &or#,nome,28
*"1input/ext value#,^{usuario@ean.usuario.nome, id#,nome,28

*"1output6abel value#,Sexo1 , &or#,sexo, 28
*"1selectDneCadio value#,^{usuario@ean.usuario.sexo, id#,sexo,8
*&1selectItem item6abel#,Feminino, item)alue#,F,28
*&1selectItem item6abel#,!asculino, item)alue#,!,28
*2"1selectDneCadio8

*"1output6abel value#,6ogin1 , &or#,login,28
*"1input/ext value#,^{usuario@ean.usuario.login, id#,login,28

*"1output6abel value#,Sen"a1 , &or#,sen"a,28
*"1inputSecret value#,^{usuario@ean.usuario.sen"a, id#,sen"a, 28

*2"1panel(rid8
Rosiclia Frasson
76
Componente similar ao selectOneMenu, com a diferena de que o
mesmo permite que sejam selecionados vrios itens de uma vez
*"1output6abel value#,Idiomas1 , &or#,idiomas,28
*"1select!any!enu id#,idiomas,
value#,^{usuario@ean.usuario.idiomas, style#,"eig"t1 Z-px,8

Este componente funciona como um organizador de componentes na
pgina e pode acomodar qualquer componente JSF. O panelGrid possui
como valor padro o nmero de colunas igual a 1. Para modific-lo
necessrio utilizar o atributo columns. No exemplo a seguir tambm foi
utilizada a propriedade border de 1 pixel para a visualizao do
*"1output6abel value#,$ome1 , &or#,nome,28
*"1input/ext value#,^{usuario@ean.usuario.nome, id#,nome,28

*"1selectDneCadio value#,^{usuario@ean.usuario.sexo, id#,sexo,8
*&1selectItem item6abel#,Feminino, item)alue#,F,28
*&1selectItem item6abel#,!asculino, item)alue#,!,28

*"1input/ext value#,^{usuario@ean.usuario.login, id#,login,28
*"1output6abel value#,Sen"a1 , &or#,sen"a,28
*"1inputSecret value#,^{usuario@ean.usuario.sen"a, id#,sen"a, 28

Captulo & - Coponentes JSF


panelGroup Este componente utilizado para organizar as telas. Com ele possvel
agrupar vrios componentes em apena
uma clula do panelGrid, por exemplo.


dataTable Componente que gera uma tabela HTML. Pode ser vinculado a um
managed bean para preenchimento de dados dinmicos.
No exemplo a seguir, gerada uma tabela que representa uma agenda
de contatos. Esses contatos poderiam estar armazenados em uma bas
de dados. A ttulo de exemplo, os contatos esto sendo adicionados
manualmente no managed bean.

Segue o bean Contato, onde est definido que cada objeto deste tipo
deve possuir um nome e um telefone. Tambm foi definido um construtor
com estes dois atri


A seguir, est ilustrado o managed bean ContatoBean que possui uma
lista de contatos. No mtodo de acesso a esta lista so adicionados dois
Este componente utilizado para organizar as telas. Com ele possvel
agrupar vrios componentes em apenas um n, colocando em apenas
uma clula do panelGrid, por exemplo.
*"1panel(roup8
*"1output6abel value#,6ogin1 , &or#,login,28
*"1grap"icImage value#,2imagens2ajuda.png,28
*2"1panel(roup8
*"1input/ext value#,^{usuario@ean.usuario.login, id#,login,28
Componente que gera uma tabela HTML. Pode ser vinculado a um
managed bean para preenchimento de dados dinmicos.
No exemplo a seguir, gerada uma tabela que representa uma agenda
de contatos. Esses contatos poderiam estar armazenados em uma bas
de dados. A ttulo de exemplo, os contatos esto sendo adicionados
manualmente no managed bean.
Segue o bean Contato, onde est definido que cada objeto deste tipo
deve possuir um nome e um telefone. Tambm foi definido um construtor
com estes dois atributos para facilitar a criao de um novo contato.
pac%age br.com.rosicleia&rasson.capBcomponentestabela.modelo;

public class Aontato {

private String nome;
private String tele&one;

public Aontato(String nomeJ String tele&one) {
t"is.nome # nome;
t"is.tele&one # tele&one;


public String get$ome() {
return nome;


public void set$ome(String nome) {
t"is.nome # nome;


public String get/ele&one() {
return tele&one;


public void set/ele&one(String tele&one) {
t"is.tele&one # tele&one;


A seguir, est ilustrado o managed bean ContatoBean que possui uma
lista de contatos. No mtodo de acesso a esta lista so adicionados dois
Rosiclia Frasson
77
Este componente utilizado para organizar as telas. Com ele possvel
s um n, colocando em apenas
*"1output6abel value#,6ogin1 , &or#,login,28
*"1grap"icImage value#,2imagens2ajuda.png,28
*"1input/ext value#,^{usuario@ean.usuario.login, id#,login,28

Componente que gera uma tabela HTML. Pode ser vinculado a um
managed bean para preenchimento de dados dinmicos.
No exemplo a seguir, gerada uma tabela que representa uma agenda
de contatos. Esses contatos poderiam estar armazenados em uma base
de dados. A ttulo de exemplo, os contatos esto sendo adicionados
Segue o bean Contato, onde est definido que cada objeto deste tipo
deve possuir um nome e um telefone. Tambm foi definido um construtor
butos para facilitar a criao de um novo contato.
pac%age br.com.rosicleia&rasson.capBcomponentestabela.modelo;
public Aontato(String nomeJ String tele&one) {
A seguir, est ilustrado o managed bean ContatoBean que possui uma
lista de contatos. No mtodo de acesso a esta lista so adicionados dois
Captulo & - Coponentes JSF


contatos para que os mesmos p

pac%age br.com.rosicleia&rasson.capBcomponentestabela.controller;

import br.com.rosicleia&rasson.capBcomponentestabela.modelo.Aontato;
import java.util.Erray6ist;
import java.util.6ist;
import javax.&aces.bean.!anaged@ean;

@!anaged@ean
public class Aontato@ean {











Na pgina, onde est o componente dataTable definido atravs do
atributo value os dados da tabela. O atributo var nomeia o elemento da
iterao corrente para se ter acesso ao ndice da mesma nas colun

*"1data/able border#,', value#,^{contato@ean.contatos, var#,contato,8















*2"1data/able8
column Define uma coluna em uma tabela.

contatos para que os mesmos populem a tabela.
pac%age br.com.rosicleia&rasson.capBcomponentestabela.controller;
import br.com.rosicleia&rasson.capBcomponentestabela.modelo.Aontato;
import java.util.Erray6ist;
import java.util.6ist;
import javax.&aces.bean.!anaged@ean;
@!anaged@ean
public class Aontato@ean {
private 6ist*Aontato8 contatos # ne3 Erray6ist*8();
public 6ist*Aontato8 getAontatos() {
contatos.clear();
contatos.add(ne3 Aontato(,!aria,J ,(UB) ZZ0U
contatos.add(ne3 Aontato(,GoHo,J ,('') 4=UI9
return contatos;


Na pgina, onde est o componente dataTable definido atravs do
atributo value os dados da tabela. O atributo var nomeia o elemento da
iterao corrente para se ter acesso ao ndice da mesma nas colun
*"1data/able border#,', value#,^{contato@ean.contatos, var#,contato,8
*&1&acet name#,"eader,8
*"1output/ext value#,Egenda de Aontatos,28
*2&1&acet8
*"1column8
*&1&acet name#,"eader,8
*"1output/ext value#,$ome,28
*2&1&acet8
*"1output/ext value#,^{contato.nome,28
*2"1column8
*"1column8
*&1&acet name#,"eader,8
*"1output/ext value#,/ele&one,28
*2&1&acet8
*"1output/ext value#,^{contato.tele&one,28
*2"1column8
*2"1data/able8

Define uma coluna em uma tabela.
*"1column8
*&1&acet name#,"eader,8
Rosiclia Frasson
78
opulem a tabela.
pac%age br.com.rosicleia&rasson.capBcomponentestabela.controller;
import br.com.rosicleia&rasson.capBcomponentestabela.modelo.Aontato;
private 6ist*Aontato8 contatos # ne3 Erray6ist*8();
contatos.add(ne3 Aontato(,!aria,J ,(UB) ZZ0U9Z-_B,));
9=_IU,));
Na pgina, onde est o componente dataTable definido atravs do
atributo value os dados da tabela. O atributo var nomeia o elemento da
iterao corrente para se ter acesso ao ndice da mesma nas colunas.
*"1data/able border#,', value#,^{contato@ean.contatos, var#,contato,8
*"1output/ext value#,Egenda de Aontatos,28


Captulo & - Coponentes JSF




Tags de atributos bsicos HTML

Atributo Descrio
id Identifica o componente. Pode ser utilizado em todos os elementos HTML.

*"1input/ext value#,^{usuario@ean.usuario.nome, id#,nome,8

binding Associa o componente da camada de viso sua camada de controle.
Pode ser utiliza


rendered Renderiza ou no um componente. O valor false indica que o componente
no deve ser renderizado. Pode ser utilizado em todos os elementos
HTML.

*"1panel(rid columns#,U, rendered#,^{&uncionario@ean.e".suario,8
*"1output6abel &or#,login, value#,6ogin1 ,28
*"1input/ext id#,login, value#,^{&uncionario@ean.&uncionario.login, 28

*"1output6abel &or#,sen"a, value#,Sen"a1 ,28
*"1input/ext
*2"1panel(rid8

styleClass Especifica uma classe CSS que contm definies de estilo. Pode ser
utilizado em todos os elementos HTML.


value Associa o componente da camada de viso sua camada de controle.
Pode ser utilizado nos input, output e command.


valueChangeListener Evento disparado qua

*"1output/ext value#,/ele&one,28
*2&1&acet8
*"1output/ext value#,^{contato.tele&one,28
*2"1column8



Descrio
Identifica o componente. Pode ser utilizado em todos os elementos HTML.
*"1input/ext value#,^{usuario@ean.usuario.nome, id#,nome,8
Associa o componente da camada de viso sua camada de controle.
Pode ser utilizado em todos os elementos HTML.
*"1input/ext binding#,^{candidato@ean.candidato.cp&, id#,cp&, 28
Renderiza ou no um componente. O valor false indica que o componente
no deve ser renderizado. Pode ser utilizado em todos os elementos
HTML.
1panel(rid columns#,U, rendered#,^{&uncionario@ean.e".suario,8
*"1output6abel &or#,login, value#,6ogin1 ,28
*"1input/ext id#,login, value#,^{&uncionario@ean.&uncionario.login, 28
*"1output6abel &or#,sen"a, value#,Sen"a1 ,28
*"1input/ext id#,sen"a, value#,^{&uncionario@ean.&uncionario.sen"a,28
*2"1panel(rid8
Especifica uma classe CSS que contm definies de estilo. Pode ser
utilizado em todos os elementos HTML.
*"1input/ext value#,^{candidato@ean.candidato.nome, id#,nome
styleAlass#,cx/exto,28
Associa o componente da camada de viso sua camada de controle.
Pode ser utilizado nos input, output e command.
*"1input/ext value#,^{candidato@ean.candidato.cp&, id#,cp&, 28
Evento disparado quando o usurio muda o valor selecionado no controle.
Rosiclia Frasson
79
*"1output/ext value#,/ele&one,28
*"1output/ext value#,^{contato.tele&one,28

Identifica o componente. Pode ser utilizado em todos os elementos HTML.
*"1input/ext value#,^{usuario@ean.usuario.nome, id#,nome,8
Associa o componente da camada de viso sua camada de controle.
do em todos os elementos HTML.
*"1input/ext binding#,^{candidato@ean.candidato.cp&, id#,cp&, 28
Renderiza ou no um componente. O valor false indica que o componente
no deve ser renderizado. Pode ser utilizado em todos os elementos
1panel(rid columns#,U, rendered#,^{&uncionario@ean.e".suario,8
*"1input/ext id#,login, value#,^{&uncionario@ean.&uncionario.login, 28
id#,sen"a, value#,^{&uncionario@ean.&uncionario.sen"a,28
Especifica uma classe CSS que contm definies de estilo. Pode ser
*"1input/ext value#,^{candidato@ean.candidato.nome, id#,nome,
Associa o componente da camada de viso sua camada de controle.
Pode ser utilizado nos input, output e command.
*"1input/ext value#,^{candidato@ean.candidato.cp&, id#,cp&, 28
ndo o usurio muda o valor selecionado no controle.
Captulo & - Coponentes JSF Rosiclia Frasson

80

*"1selectDne!enu valueA"ange6istener#,^{teste@ean.carregarAidades,8
*&1selectItems value#,^{teste@ean.estados, 28
*&1ajax event#,c"ange, render#,cidades, 28
*2"1selectDne!enu8

*"1selectDne!enu id#,cidades,8
*&1selectItems value#,^{teste@ean.cidades, 28
*2"1selectDne!enu8

converter Permite a utilizao de um converter prprio, ou seja, um converter
especfico do projeto.

*p1selectDne!enu value#,^{cadastrar!orador@ean.morador.apartamento,
converter#,entityAonverter,8
*&1selectItems value#,^{cadastrar!orador@ean.apartamentos,
var#,apartamento, item6abel#,^{apartamento.apartamento,28
*2p1selectDne!enu8

validator Permite a utilizao de um validator prprio, ou seja, um validator
especfico do projeto.
required Indica se um campo obrigatrio. Pode ser utilizado nos inputs.

*"1input/ext value#,^{usuario@ean.usuario.nome,
id#,nome, re<uired#,true,28



Atributos HTML 4.0

Atributo Descrio
accesskey Cria uma tecla de atalho para dar foco em um elemento. Embora a
documentao W3C sugere que a combinao de teclas para acionar o atributo
accesskey seja Ctrl + Alt + tecla, a maioria dos navegadores utilizam Alt + tecla
ou Shift + Alt + tecla.

*"1command@utton value#,Salvar, action#,^{cargo@ean.insere, access%ey#,S,
styleAlass#,botao,28

acceptcharset Indica o charset que deve ser utilizado.

*"1&orm acceptc"arset#,ISD9BBIZ9',8

alt Texto alternativo para elementos no textuais como imagens.

*"1grap"icImage value#,2imagens2ajuda.png, alt#,ajuda,28

border Valor em pixel para a largura da borda de um componente.

Captulo & - Coponentes JSF


dir Define a direo do texto. Pode ser ltr

*"1input/ext value#,^{usuario@ean.usuario.nome, id#,nome, dir#,rtl,28

disable Desabilita um componente. No exemplo a seguir o input est desabilitado, ou
seja, no permite que nenhum valor seja digitado no mesmo.

*"1input/ext va

maxlenght Define a quantidade mxima de caracteres de uma caixa de texto.

*"1input/ext value#,^{usuario@ean.usuario.login, id#,login, maxlengt"#,'0,28

readonly O valor do componente fi
utilizado em conjunto com teclados virtuais ou calendrios, pois o valor do
campo fica disponvel para leitura, porm no pode ser alterado.
rel Relao entre o documento atual e um link especificado


rows Nmero visvel de linhas em uma rea de texto.

*"1input/extarea value#,^{usuario@ean.usuario.observacoes, id#,observacoes,
ro3s#,U,28
size Define o tamanho

*"1input/ext value#,^{usuario@ean.usuario.nome, id#,nome, dir#,rtl,
si>e#,I-,28
*"1panel(rid columns#,0, border#,4,8
*"1output6abel value#,$ome1 ,28
*"1input/ext28
*2"1panel(rid8
Define a direo do texto. Pode ser ltr - esquerda ou rtl
*"1input/ext value#,^{usuario@ean.usuario.nome, id#,nome, dir#,rtl,28

Desabilita um componente. No exemplo a seguir o input est desabilitado, ou
seja, no permite que nenhum valor seja digitado no mesmo.
*"1input/ext value#,^{usuario@ean.usuario.nome, id#,nome, disabled#,true,28
Define a quantidade mxima de caracteres de uma caixa de texto.
*"1input/ext value#,^{usuario@ean.usuario.login, id#,login, maxlengt"#,'0,28

O valor do componente fica visvel. Porm no pode ser alterado. Normalmente
utilizado em conjunto com teclados virtuais ou calendrios, pois o valor do
campo fica disponvel para leitura, porm no pode ser alterado.
Relao entre o documento atual e um link especificado
*lin% "re&#,2css2estilo.css, type#,text2css, rel#,styles"eet,28
Nmero visvel de linhas em uma rea de texto.
*"1input/extarea value#,^{usuario@ean.usuario.observacoes, id#,observacoes,
ro3s#,U,28
Define o tamanho de uma caixa de texto.
*"1input/ext value#,^{usuario@ean.usuario.nome, id#,nome, dir#,rtl,
si>e#,I-,28

Rosiclia Frasson
81
*"1panel(rid columns#,0, border#,4,8
*"1output6abel value#,$ome1 ,28

a ou rtl - direita.
*"1input/ext value#,^{usuario@ean.usuario.nome, id#,nome, dir#,rtl,28

Desabilita um componente. No exemplo a seguir o input est desabilitado, ou
seja, no permite que nenhum valor seja digitado no mesmo.
lue#,^{usuario@ean.usuario.nome, id#,nome, disabled#,true,28
Define a quantidade mxima de caracteres de uma caixa de texto.
*"1input/ext value#,^{usuario@ean.usuario.login, id#,login, maxlengt"#,'0,28

ca visvel. Porm no pode ser alterado. Normalmente
utilizado em conjunto com teclados virtuais ou calendrios, pois o valor do
campo fica disponvel para leitura, porm no pode ser alterado.
Relao entre o documento atual e um link especificado com o atributo href.
*lin% "re&#,2css2estilo.css, type#,text2css, rel#,styles"eet,28
*"1input/extarea value#,^{usuario@ean.usuario.observacoes, id#,observacoes,

*"1input/ext value#,^{usuario@ean.usuario.nome, id#,nome, dir#,rtl,

Captulo & - Coponentes JSF Rosiclia Frasson

82

style Aplica um estilo a um componente.

*"1select!any!enu id#,idiomas, value#,^{usuario@ean.usuario.idiomas,
style#,"eig"t1 Z-px, 8

tabindex Define a ordem em que um elemento recebe o foco usando a tecla TAB. O valor
para este atributo deve ser um nmero inteiro entre 0 e 32767.


Atributos de eventos DHTML

Atributo Descrio
onblur Evento disparado quando o componente perde o foco.
onchange Evento disparado quando o valor do campo alterado.
onclick Evento disparado quando o componente clicado.
onfocus Evento disparado quando o componente recebe foco.
onkeydown Evento disparado assim que a tecla pressionada.
onkeypress Evento disparado assim que a tecla pressionada. disparado aps o
onkeydow.
onkeyup Evento disparado quando a tecla pressionada solta.
onmousedown Evento disparado quando o boto do mouse pressionado sobre o elemento.
onmousemove Evento disparado quando o mouse se move sobre o elemento.
onmouseout Evento disparado quando o mouse sair de cima do componente.
onmouseover Evento disparado quando o mouse passar em cima do componente.
onmouseup Evento disparado quando o boto do mouse liberado.
onreset Evento disparado quando o boto de reset do formulrio acionado.
onselect Evento disparado quando o texto contido no componente selecionado.
onsubmit Evento disparado quando o formulrio submetido.


Biblioteca Core

Tag Descrio
view Serve para delimitar a regio onde ser criada a rvore de componentes
do JSF. Essa tag s necessria com o uso de JSP, no facelet no
necessrio.
subview Serve para evitar que os IDs dos componentes se repitam na rvore de
Captulo & - Coponentes JSF


componentes, nos casos em que existem inclu
facet Adiciona uma faceta a um componente. No caso das tabelas, por exemplo,
com esta tag possvel adicionar cabealho ou rodap.

*"1data/able border#,', value#,^{contato@ean.contatos, var#,contato,8
*&1&acet name#,"eade

*2&1&acet8
*"1column8




*2"1column8
*"1column8




*2"1column8
*2"1data/able8

attribute Cria um par de nome/valor que define o valor de um atributo no
associado com a tag que o contm.
param Adiciona um parmetro a um componente.
action um evento de ao disparado quando o componente clicado. O evento
executado na fase Invoke Application. O action contribui para a navegao
das pginas, porm

*"1command6in% value#,Aargo, action#,2&aces2paginas2cargo.x"tml,28

actionListener Tambm um evento de ao disparado quando o componente clicado e
executado na fase Invoke Application. Diferentemente do actio
actionListener possui informaes sobre o evento, porm no contribui
para a navegao de pginas.
valueChangeListener Evento disparado quando o valor de um componente alterado. Pode ser
usado por exemplo, para carregar uma lista de cidades de aco
estado selecionado.
Conversores: Converso o processo que garante que os dados informados pelo
usurio se transformem em um tipo especfico. O processo de converso
ocorre na fase Apply Request Values. Os valores convertidos no so
aplicados
componentes, nos casos em que existem includes de pginas dinmicos.
Adiciona uma faceta a um componente. No caso das tabelas, por exemplo,
com esta tag possvel adicionar cabealho ou rodap.
*"1data/able border#,', value#,^{contato@ean.contatos, var#,contato,8
*&1&acet name#,"eader,8
*"1output/ext value#,Egenda de Aontatos,28
*2&1&acet8
*"1column8
*&1&acet name#,"eader,8
*"1output/ext value#,$ome,28
*2&1&acet8
*"1output/ext value#,^{contato.nome,28
*2"1column8
*"1column8
*&1&acet name#,"eader,8
*"1output/ext value#,/ele&one,28
*2&1&acet8
*"1output/ext value#,^{contato.tele&one,28
*2"1column8
*2"1data/able8
Cria um par de nome/valor que define o valor de um atributo no
associado com a tag que o contm.
Adiciona um parmetro a um componente.
um evento de ao disparado quando o componente clicado. O evento
executado na fase Invoke Application. O action contribui para a navegao
das pginas, porm no possui informaes sobre o evento.
*"1command6in% value#,Aargo, action#,2&aces2paginas2cargo.x"tml,28
Tambm um evento de ao disparado quando o componente clicado e
executado na fase Invoke Application. Diferentemente do actio
actionListener possui informaes sobre o evento, porm no contribui
para a navegao de pginas.
Evento disparado quando o valor de um componente alterado. Pode ser
usado por exemplo, para carregar uma lista de cidades de aco
estado selecionado.
Converso o processo que garante que os dados informados pelo
usurio se transformem em um tipo especfico. O processo de converso
ocorre na fase Apply Request Values. Os valores convertidos no so
aplicados aos beans neste momento, eles apenas so convertidos e
Rosiclia Frasson
83
des de pginas dinmicos.
Adiciona uma faceta a um componente. No caso das tabelas, por exemplo,
com esta tag possvel adicionar cabealho ou rodap.
*"1data/able border#,', value#,^{contato@ean.contatos, var#,contato,8

Cria um par de nome/valor que define o valor de um atributo nomeado
um evento de ao disparado quando o componente clicado. O evento
executado na fase Invoke Application. O action contribui para a navegao
no possui informaes sobre o evento.
*"1command6in% value#,Aargo, action#,2&aces2paginas2cargo.x"tml,28
Tambm um evento de ao disparado quando o componente clicado e
executado na fase Invoke Application. Diferentemente do action, o
actionListener possui informaes sobre o evento, porm no contribui
Evento disparado quando o valor de um componente alterado. Pode ser
usado por exemplo, para carregar uma lista de cidades de acordo com o
Converso o processo que garante que os dados informados pelo
usurio se transformem em um tipo especfico. O processo de converso
ocorre na fase Apply Request Values. Os valores convertidos no so
aos beans neste momento, eles apenas so convertidos e
Captulo & - Coponentes JSF


aplicados a objetos que representam os componentes e so chamados de
valores locais.
No JSF, a converso para os tipos primitivos feita de forma implcita. Os
objetos do tipo BigInteger e BigDecimal
implicitamente. possvel converter valores de entrada e de sada. Para os
tipos que no possuem conversor padro ou em casos em que o tipo
possui, porm no adequado, possvel definir conversores explcitos.
Os conversores disp
do elemento converterMessage. Tambm possvel trabalhar com
conversores explcitos nos casos em que os conversores implcitos no
forem suficientes.
convertDateTime Permite a formatao de datas utilizan
ser aplicado em dados do tipo java.util.Date.

*"1output6abel value#,?ata $ascimento1 , &or#,dt$ascimento,28
*"1input/ext value#,^{usuario@ean.usuario.data$ascimento,
id#,dt$ascimento, converter!essage#,?ata no &omato i
??2!!2EEEE.,8

*2"1input/ext8

convertNumber Permite a formatao de um nmero de acordo com uma definio prvia.
Seguem alguns atributos desta tag:



O campo acima ser convertido pa

aplicados a objetos que representam os componentes e so chamados de
valores locais.
No JSF, a converso para os tipos primitivos feita de forma implcita. Os
objetos do tipo BigInteger e BigDecimal tambm so convertidos
implicitamente. possvel converter valores de entrada e de sada. Para os
tipos que no possuem conversor padro ou em casos em que o tipo
possui, porm no adequado, possvel definir conversores explcitos.
Os conversores disparam mensagens que podem ser configuradas atravs
do elemento converterMessage. Tambm possvel trabalhar com
conversores explcitos nos casos em que os conversores implcitos no
forem suficientes.
Permite a formatao de datas utilizando um pattern. Esse conversor pode
ser aplicado em dados do tipo java.util.Date.
*"1output6abel value#,?ata $ascimento1 , &or#,dt$ascimento,28
*"1input/ext value#,^{usuario@ean.usuario.data$ascimento,
id#,dt$ascimento, converter!essage#,?ata no &omato i
??2!!2EEEE.,8
*&1convert?ate/ime pattern#,dd2!!2yyyy, type#,date,28
*2"1input/ext8
Permite a formatao de um nmero de acordo com uma definio prvia.
Seguem alguns atributos desta tag:
currencySimbol: Define um smbolo na formatao de moedas.
*"1output6abel value#,eltimo salNrio1 , &or#,ultimoSalario, 28
*"1input/ext value#,^{usuario@ean.usuario.ultimoSalario,
id#,ultimoSalario,8
*&1convert$umber currencySymbol#,Cf, type#,currency,28
*2"1input/ext8

maxFractionDigits: Define o nmero mximo de dgitos que sero
formatados na parte fracionria do resultado. No fragmento de
cdigo a seguir, o atributo pode ter no mximo 3 dgitos na parte
fracionria. Caso a parte fracionria tenha uma maior quantidade
de dgitos do que foi definido, o nmero ser arredondado.
*"1output6abel value#,;eso1 , &or#,peso, 28
*"1input/ext value#,^{usuario@ean.usuario.peso, id#,peso,8
*&1convert$umber maxFraction?igits#,4,28
*2"1input/ext8
O campo acima ser convertido para o resultado a seguir.
Rosiclia Frasson
84
aplicados a objetos que representam os componentes e so chamados de
No JSF, a converso para os tipos primitivos feita de forma implcita. Os
tambm so convertidos
implicitamente. possvel converter valores de entrada e de sada. Para os
tipos que no possuem conversor padro ou em casos em que o tipo
possui, porm no adequado, possvel definir conversores explcitos.
aram mensagens que podem ser configuradas atravs
do elemento converterMessage. Tambm possvel trabalhar com
conversores explcitos nos casos em que os conversores implcitos no
do um pattern. Esse conversor pode
*"1output6abel value#,?ata $ascimento1 , &or#,dt$ascimento,28
*"1input/ext value#,^{usuario@ean.usuario.data$ascimento,
id#,dt$ascimento, converter!essage#,?ata no &omato invNlido. .tili>e
*&1convert?ate/ime pattern#,dd2!!2yyyy, type#,date,28

Permite a formatao de um nmero de acordo com uma definio prvia.
mbolo na formatao de moedas.
*"1output6abel value#,eltimo salNrio1 , &or#,ultimoSalario, 28
*"1input/ext value#,^{usuario@ean.usuario.ultimoSalario,
*&1convert$umber currencySymbol#,Cf, type#,currency,28

ractionDigits: Define o nmero mximo de dgitos que sero
formatados na parte fracionria do resultado. No fragmento de
cdigo a seguir, o atributo pode ter no mximo 3 dgitos na parte
fracionria. Caso a parte fracionria tenha uma maior quantidade
gitos do que foi definido, o nmero ser arredondado.

*"1input/ext value#,^{usuario@ean.usuario.peso, id#,peso,8
*&1convert$umber maxFraction?igits#,4,28

ra o resultado a seguir.

Captulo & - Coponentes JSF



converter utilizado para a utiliz
maxIntegerDigits: Define a quantidade mxima de dgitos da parte
inteira de um nmero.
*"1output6abel value#,;eso1 , &or#,peso, 28
*"1input/ext value#,^{usuario@ean.usuario.peso, id#,peso,8
*&1convert$umber maxFraction?igits#,4, maxInteger?igits#,4,28
*2"1input/ext8
minFractionDigits: Define a quantidade mnima de dgitos da parte
fracionria de um nmero.
*"1output6abel value#,Eltura1 , &or#,altura, 28
*"1input/ext value#,^{usuario@ean.usuario.altura, id#,altura,8
*&1convert$umber minFraction?igits#,0,28
*2"1input/ext8
minIntegerDigits: Define a quantidade mnima de dgitos da parte
inteira de um nmero.
*"1output6abel value#,Eltura1 , &or#,altura, 28
*"1input/ext value#,^{usuario@ean.usuario.altura, id#,altur
*&1convert$umber minFraction?igits#,0, minInteger?igits#,',28
*2"1input/ext8
pattern: Define um padro de formatao personalizado atravs de
uma expresso regular.
*"1output6abel value#,Eltura1 , &or#,alt, 28
*"1input/ext value#,^{usuario@ean.usuario.altura, id#,alt, 8
*&1convert$umber pattern#,^-.--,28
*2"1input/ext8

type: Este atributo especifica como a string deve ser formatada.
Possui trs valores vlidos: number, currency e percentage.
Number o valor padro, currency o valo
percentage usado para percentuais.
*"1output6abel value#,)alor1 , &or#,val, 28
*"1input/ext value#,^{usuario@ean.usuario.valor, id#,val, 8
*&1convert$umber type#,percent,28
*2"1input/ext8
utilizado para a utilizao de conversores criados pelo desenvolvedor, ou
Rosiclia Frasson
85
maxIntegerDigits: Define a quantidade mxima de dgitos da parte
*"1input/ext value#,^{usuario@ean.usuario.peso, id#,peso,8
ts#,4, maxInteger?igits#,4,28
minFractionDigits: Define a quantidade mnima de dgitos da parte
*"1output6abel value#,Eltura1 , &or#,altura, 28
*"1input/ext value#,^{usuario@ean.usuario.altura, id#,altura,8

minIntegerDigits: Define a quantidade mnima de dgitos da parte
*"1output6abel value#,Eltura1 , &or#,altura, 28
*"1input/ext value#,^{usuario@ean.usuario.altura, id#,altura, 8
*&1convert$umber minFraction?igits#,0, minInteger?igits#,',28

pattern: Define um padro de formatao personalizado atravs de

n.usuario.altura, id#,alt, 8

type: Este atributo especifica como a string deve ser formatada.
Possui trs valores vlidos: number, currency e percentage.
Number o valor padro, currency o valor usado para moedas e
*"1input/ext value#,^{usuario@ean.usuario.valor, id#,val, 8

ao de conversores criados pelo desenvolvedor, ou
Captulo & - Coponentes JSF


seja, conversores que no fazem parte da especificao.
Validadores Durante o processo de construo de aplicativos, alm de converter
valores digitados pelo usurio em tipos especficos, necessrio ver
se os mesmos esto conforme algumas regras de negcio estabelecidas.
A validaao ocorre na fase Process Validation. Os validadores disparam
mensagens que podem ser configuradas com o elemento
validatorMessage.
validateDoubleRange Utilizado para ver
determinado intervalo de nmeros.


validateLenght Verifica se uma string possui uma quantidade mnima ou mxima de letras.

*"1output6abel value#,Sen"a1 , &or#,sen"a,28
*"1panel(roup8

validator!essage#,E sen"a deve possuir no mLnimo = caracteres e no
mNximo '- caracteres.,8



*2"1panel(roup8


validateLongRange Verifica se um nmero inteiro est entre um determinado intervalo de
nmeros.

*"1output6abel value#,Idade1 , &or#,idade, 28
*"1panel(roup8
*"1input/ext value#,^{usuario@ean.usuario.idade, id#,idade,
validator!e
anos.,8

*2"1input/ext8
*"1message &or#,idade,28
*2"1panel(roup8

seja, conversores que no fazem parte da especificao.
Durante o processo de construo de aplicativos, alm de converter
valores digitados pelo usurio em tipos especficos, necessrio ver
se os mesmos esto conforme algumas regras de negcio estabelecidas.
A validaao ocorre na fase Process Validation. Os validadores disparam
mensagens que podem ser configuradas com o elemento
validatorMessage.
Utilizado para verificar se um valor numrico real est entre um
determinado intervalo de nmeros.
*"1panel(roup8
*"1input/ext value#,^{usuario@ean.usuario.peso, id#,peso,
validator!essage#,D valor do peso deve estar entre UI e 0I-.,8
*&1validate?oubleCange minimum#,UI.--, maximum#,0I-.--,28
*2"1input/ext8
*"1message &or#,peso, 28
*2"1panel(roup8
Verifica se uma string possui uma quantidade mnima ou mxima de letras.
*"1output6abel value#,Sen"a1 , &or#,sen"a,28
*"1panel(roup8
*"1inputSecret value#,^{usuario@ean.usuario.sen"a, id#,sen"a,
validator!essage#,E sen"a deve possuir no mLnimo = caracteres e no
mNximo '- caracteres.,8
*&1validate6engt" maximum#,'-, minimum#,=,28
*2"1inputSecret8
*"1message &or#,sen"a,28
*2"1panel(roup8
Verifica se um nmero inteiro est entre um determinado intervalo de
nmeros.
*"1output6abel value#,Idade1 , &or#,idade, 28
*"1panel(roup8
*"1input/ext value#,^{usuario@ean.usuario.idade, id#,idade,
validator!essage#,Sa aceitamos candidatos <ue possuam idade entre 'B e B-
anos.,8
*&1validate6ongCange minimum#,'B, maximum#,B-,28
*2"1input/ext8
*"1message &or#,idade,28
*2"1panel(roup8
Rosiclia Frasson
86
seja, conversores que no fazem parte da especificao.
Durante o processo de construo de aplicativos, alm de converter
valores digitados pelo usurio em tipos especficos, necessrio verificar
se os mesmos esto conforme algumas regras de negcio estabelecidas.
A validaao ocorre na fase Process Validation. Os validadores disparam
mensagens que podem ser configuradas com o elemento
ificar se um valor numrico real est entre um
*"1input/ext value#,^{usuario@ean.usuario.peso, id#,peso,
validator!essage#,D valor do peso deve estar entre UI e 0I-.,8
nimum#,UI.--, maximum#,0I-.--,28

Verifica se uma string possui uma quantidade mnima ou mxima de letras.
"1inputSecret value#,^{usuario@ean.usuario.sen"a, id#,sen"a,
validator!essage#,E sen"a deve possuir no mLnimo = caracteres e no
*&1validate6engt" maximum#,'-, minimum#,=,28

Verifica se um nmero inteiro est entre um determinado intervalo de
*"1input/ext value#,^{usuario@ean.usuario.idade, id#,idade,
ssage#,Sa aceitamos candidatos <ue possuam idade entre 'B e B-
*&1validate6ongCange minimum#,'B, maximum#,B-,28

Captulo & - Coponentes JSF


validateRegex Verifica se um texto respeita determinada exp

*"1panel(roup8


*2"1panel(roup8
*"1panel(roup8

validator!essage#
possuir entre = e 'B caracteres.,8



*2"1panel(roup8

validator Este componente deve ser utilizado para v
loadBundle Permite carregar um pacote de recursos do Locale da pgina atual e
armazenar o mesmo em um mapa no escopo de request.
selectItems Especifica itens para um componente de seleo. Utilizado para valores
dinmicos. No ex
e podem representar valores advindos de uma base de dados.


selectItem Especifica um item para um componente de seleo. Utilizado para valores
estticos.

Verifica se um texto respeita determinada expresso regular.
*"1panel(roup8
*"1output6abel value#,6ogin1 , &or#,login, 28
*"1grap"icImage value#,2imagens2ajuda.png, alt#,ajuda,28
*2"1panel(roup8
*"1panel(roup8
*"1input/ext value#,^{usuario@ean.usuario.login, id#,login,
validator!essage#,D login deve ser composto apenas por letras e deve
possuir entre = e 'B caracteres.,8
*&1validateCegex pattern#,Oa9>P{=J'B,28
*2"1input/ext8
*"1message &or#,login,28
*2"1panel(roup8
Este componente deve ser utilizado para validadores customizados.
Permite carregar um pacote de recursos do Locale da pgina atual e
armazenar o mesmo em um mapa no escopo de request.
Especifica itens para um componente de seleo. Utilizado para valores
dinmicos. No exemplo a seguir, os itens esto armazenados em uma lista
e podem representar valores advindos de uma base de dados.
*"1output6abel value#,\rea de Etua`Ho1 , &or#,areaEtuacao,28
*"1selectDne!enu id#,areaEtuacao,
value#,^{usuario@ean.usuario.areaEtuacao,8
*&1selectItems value#,^{usuario@ean.areas,28
*2"1selectDne!enu8
Especifica um item para um componente de seleo. Utilizado para valores
estticos.
*"1output6abel value#,:obbies1 , &or#,"obbies,28
*"1select!anyA"ec%box id#,"obbies,
value#,^{usuario@ean.usuario."obbies, layout#,page?irection,8
*&1selectItem item)alue#,!csicas,28
*&1selectItem item)alue#,Filmes,28
Rosiclia Frasson
87
resso regular.
*"1grap"icImage value#,2imagens2ajuda.png, alt#,ajuda,28
*"1input/ext value#,^{usuario@ean.usuario.login, id#,login,
,D login deve ser composto apenas por letras e deve

alidadores customizados.
Permite carregar um pacote de recursos do Locale da pgina atual e
armazenar o mesmo em um mapa no escopo de request.
Especifica itens para um componente de seleo. Utilizado para valores
emplo a seguir, os itens esto armazenados em uma lista
e podem representar valores advindos de uma base de dados.
*"1output6abel value#,\rea de Etua`Ho1 , &or#,areaEtuacao,28
value#,^{usuario@ean.usuario.areaEtuacao,8
*&1selectItems value#,^{usuario@ean.areas,28

Especifica um item para um componente de seleo. Utilizado para valores
*"1output6abel value#,:obbies1 , &or#,"obbies,28
ue#,^{usuario@ean.usuario."obbies, layout#,page?irection,8
Captulo & - Coponentes JSF





PASSO-A-PASSO

Cadastro de currculo

Para exemplificar o uso de compone
ser montada.
1. Aps a criao do projeto JSF, necessrio criar as classes de modelo. No pacote modelo
necessria a criao da classe Cargo que deve armazenar os possveis cargos dos candidatos.

pac%age br.com.rosicleia&rasson.curriculo.model;

public class Aargo {

private int codigo;
private String descricao;

public Aargo(int codigoJ String descricao) {
t"is.codigo # codigo;
t"is.descricao # descricao;


@Dverride
public String toString() {
return descricao;

22(ets e sets


2. Ainda no pacote modelo, a classe Conhecimento tem por objeto armazenar os conhecimentos
tcnicos que os candidatos possuem.

*&1selectItem item)alue#,AulinNria,28
*&1selectItem item)alue#,Ertesanato,28
*&1selectItem item)alue#,?ecora`Ho,28
*&1selectItem item)alue#,6ivros,28
*&1selectItem item)alue#,;asseios turLsticos,28
*&1selectItem item)alue#,;rNtica de esportes,28
*2"1select!anyA"ec%box8
Para exemplificar o uso de componentes JSF, uma pgina para cadastro de currculos
1. Aps a criao do projeto JSF, necessrio criar as classes de modelo. No pacote modelo
necessria a criao da classe Cargo que deve armazenar os possveis cargos dos candidatos.
e br.com.rosicleia&rasson.curriculo.model;
public class Aargo {
private int codigo;
private String descricao;
public Aargo(int codigoJ String descricao) {
t"is.codigo # codigo;
t"is.descricao # descricao;
@Dverride
public String toString() {
return descricao;
22(ets e sets
2. Ainda no pacote modelo, a classe Conhecimento tem por objeto armazenar os conhecimentos
tcnicos que os candidatos possuem.
Rosiclia Frasson
88
*&1selectItem item)alue#,;asseios turLsticos,28
*&1selectItem item)alue#,;rNtica de esportes,28

ntes JSF, uma pgina para cadastro de currculos
1. Aps a criao do projeto JSF, necessrio criar as classes de modelo. No pacote modelo
necessria a criao da classe Cargo que deve armazenar os possveis cargos dos candidatos.
2. Ainda no pacote modelo, a classe Conhecimento tem por objeto armazenar os conhecimentos
Captulo & - Coponentes JSF Rosiclia Frasson

89

pac%age br.com.rosicleia&rasson.curriculo.model;

public class Aon"ecimento {

private int codigo;
private String nome;

public Aon"ecimento(int codigoJ String nome) {
t"is.codigo # codigo;
t"is.nome # nome;


@Dverride
public String toString() {
return nome;

22(ets e sets


3. Para facilitar possveis manutenes, o endereo do usurio tambm deve possuir uma classe.

pac%age br.com.rosicleia&rasson.curriculo.model;

public class Endereco {

private String endereco;
private String complemento;
private String municipio;
private String bairro;
private String estado;
22(ets e sets


4. Para finalizar o pacote modelo, necessria a classe candidato.

pac%age br.com.rosicleia&rasson.curriculo.model;

import java.util.?ate;
import java.util.6ist;

public class Aandidato {

private int codigo;
private String nome;
private String cp&;
private ?ate data$ascimento;
private c"ar sexo;
private c"ar nacionalidade;
private String raca;
private String estadoAivil;
private boolean e"?e&iciente;
private String tele&one;
private String email;
private Endereco endereco;
private String login;
private String sen"a;
private 6ist*String8 &ormacoes;
private 6ist*String8 idiomas;
Captulo & - Coponentes JSF Rosiclia Frasson

90

private 6ist*Aon"ecimento8 con"ecimentos;
private 6ist*Aargo8 cargos;retendidos;
private String experiencias;
private double ultimoSalario;
private double pretensaoSalarial;
private int carga:oraria;
22(ets e sets


5. O pacote controller composto pela classe CandidatoBean que tem como responsabilidade
efetuar a ligao entre o modelo e a camada de visualizao composta pelas pginas xhtml.
importante perceber que os cargos e conhecimentos esto sendo adicionados de maneira
esttica. Porm os mesmos poderiam estar armazenados em uma base de dados.

pac%age br.com.rosicleia&rasson.curriculo.controller;

import br.com.rosicleia&rasson.curriculo.model.Aandidato;
import br.com.rosicleia&rasson.curriculo.model.Aargo;
import br.com.rosicleia&rasson.curriculo.model.Aon"ecimento;
import java.util.Erray6ist;
import java.util.6ist;
import javax.&aces.bean.!anaged@ean;

@!anaged@ean
public class Aandidato@ean {

private Aandidato candidato;
private 6ist*Aargo8 cargos;
private 6ist*Aon"ecimento8 con"ecimentos;

public Aandidato@ean() {
candidato # ne3 Aandidato();
cargos # ne3 Erray6ist*8();
con"ecimentos # ne3 Erray6ist*8();

cargos.add(ne3 Aargo('J ,Enalista de Sistemas,));
cargos.add(ne3 Aargo(0J ,Enalista de Fualidade e ;rocessos,));
cargos.add(ne3 Aargo(4J ,Enalista Implementador @I,));
cargos.add(ne3 Aargo(UJ ,Edministrador de @anco de ?ados,));
cargos.add(ne3 Aargo(IJ ,Enalista de In&raestrutura de /I,));
cargos.add(ne3 Aargo(=J ,Enalista de $egacio,));
cargos.add(ne3 Aargo(_J ,Enalista de Suporte,));
cargos.add(ne3 Aargo(BJ ,Enalista de /estes,));
cargos.add(ne3 Aargo(ZJ ,Enalista ;rogramador Gava,));
cargos.add(ne3 Aargo('-J ,Er<uiteto de So&t3are,));
cargos.add(ne3 Aargo(''J ,?esigner (rN&ico,));
cargos.add(ne3 Aargo('0J ,EstagiNrio,));

con"ecimentos.add(ne3 Aon"ecimento('J ,!S ;roject,));
con"ecimentos.add(ne3 Aon"ecimento(0J ,!odelagem de ?ados,));
con"ecimentos.add(ne3 Aon"ecimento(4J ,(estHo da Fualidade ( ISDJ A!!I),));
con"ecimentos.add(ne3 Aon"ecimento(UJ ,(erdncia de ;rojetos,));
con"ecimentos.add(ne3 Aon"ecimento(IJ ,/estes de So&t3are,));
con"ecimentos.add(ne3 Aon"ecimento(=J ,.!6,));
con"ecimentos.add(ne3 Aon"ecimento(_J ,EnNlise e ;rojeto de Sistemas,));
con"ecimentos.add(ne3 Aon"ecimento(BJ ,.sabilidade2Ergonomia de So&t3are,));
con"ecimentos.add(ne3 Aon"ecimento(ZJ ,;ontos de Fun`Ho,));
con"ecimentos.add(ne3 Aon"ecimento('-J ,!etodologias de ?esenvolvimento,));
con"ecimentos.add(ne3 Aon"ecimento(''J ,Ceda`Ho,));
Captulo & - Coponentes JSF Rosiclia Frasson

91

con"ecimentos.add(ne3 Aon"ecimento('0J ,/rabal"o em E<uipe,));
con"ecimentos.add(ne3 Aon"ecimento('4J ,Enterprise Erc"itect,));
con"ecimentos.add(ne3 Aon"ecimento('UJ ,!apeamento de ;rocessos,));
con"ecimentos.add(ne3 Aon"ecimento('IJ ,6evantamento de Ce<uisitos,));
con"ecimentos.add(ne3 Aon"ecimento('=J ,/reinamento de Sistemas,));
con"ecimentos.add(ne3 Aon"ecimento('_J ,Implanta`Ho de Sistemas,));
con"ecimentos.add(ne3 Aon"ecimento('BJ ,ASS,));
con"ecimentos.add(ne3 Aon"ecimento('ZJ ,:/!6,));


public Aandidato getAandidato() {
return candidato;


public void setAandidato(Aandidato candidato) {
t"is.candidato # candidato;


public 6ist*Aargo8 getAargos() {
return cargos;


public void setAargos(6ist*Aargo8 cargos) {
t"is.cargos # cargos;


public 6ist*Aon"ecimento8 getAon"ecimentos() {
return con"ecimentos;


public void setAon"ecimentos(6ist*Aon"ecimento8 con"ecimentos) {
t"is.con"ecimentos # con"ecimentos;



6. Por fim, a pgina index.

*+xml version#]'.-] encoding#]./F9B] +8
*R?DA/S;E "tml ;.@6IA ,922Q4A22?/? 5:/!6 '.- /ransitional22E$,
,"ttp122333.34.org2/C2x"tml'2?/?2x"tml'9transitional.dtd,8
*"tml xmlns#,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122java.sun.com2js&2"tml,
xmlns1&#,"ttp122java.sun.com2js&2core,8

*"1"ead8
*title8AurrLculo*2title8
*2"1"ead8

*"1body8

*div id#,cabecal"o,8
*"'8Cevolu`Ho ;eople So&t*2"'8
*p8)en"a &a>er parte da empresa <ue estN trans&ormando o @rasil*2p8
*2div8

*div id#,pagina,8

*div id#,titulo;rincipal,8
*"1panel(rid columns#,0,8
Captulo & - Coponentes JSF Rosiclia Frasson

92

*"1grap"icImage value#,2imagens2estrela.png, alt#,estrela,28
*"48AE?ES/CE SE. A.CCgA.6D*2"48
*2"1panel(rid8
*2div8

*div id#,&ormulario,8

*"1&orm8
*"1messages28

*&ieldset8

*legend8?E?DS ;ESSDEIS*2legend8

*"1panel(rid columns#,0,8

*"1output6abel value#,$ome1 , &or#,nome,28
*"1input/ext value#,^{candidato@ean.candidato.nome, id#,nome, dir#,rtl, si>e#,_I,
re<uired#,true, 28

*"1output6abel value#,A;F1 , &or#,cp&,28
*"1input/ext value#,^{candidato@ean.candidato.cp&, id#,cp&, 28

*"1output6abel value#,?ata $ascimento1 , &or#,dt$ascimento,28
*"1panel(roup8
*"1input/ext value#,^{candidato@ean.candidato.data$ascimento, id#,dt$ascimento,
converter!essage#,?ata no &omato invNlido. .tili>e ??2!!2EEEE., 8
*&1convert?ate/ime pattern#,dd2!!2yyyy, type#,date,28
*2"1input/ext8
*"1message &or#,dt$ascimento, 28
*2"1panel(roup8

*"1output6abel value#,Sexo1 , &or#,sexo, 28
*"1selectDneCadio value#,^{candidato@ean.candidato.sexo, id#,sexo,8
*&1selectItem item6abel#,Feminino, item)alue#,F,28
*&1selectItem item6abel#,!asculino, item)alue#,!,28
*2"1selectDneCadio8

*"1output6abel value#,$acionalidade1 , &or#,nacionalidade, 28
*"1selectDne!enu value#,^{candidato@ean.candidato.nacionalidade,
id#,nacionalidade, 8
*&1selectItem item6abel#,@rasileira, item)alue#,@,28
*&1selectItem item6abel#,Estrangeira, item)alue#,E,28
*2"1selectDne!enu8

*"1output6abel value#,Ca`a1 , &or#,raca, 28
*"1selectDne6istbox value#,^{candidato@ean.candidato.raca, id#,raca, si>e#,4,8
*&1selectItem item6abel#,@ranca, item)alue#,@ranca,28
*&1selectItem item6abel#,;reta, item)alue#,;reta,28
*&1selectItem item6abel#,;arda, item)alue#,;arda,28
*&1selectItem item6abel#,IndLgena, item)alue#,IndLgena,28
*&1selectItem item6abel#,Emarela, item)alue#,Emarela,28
*&1selectItem item6abel#,$Ho desejo declarar, item)alue#,$Ho declarou,28
*2"1selectDne6istbox8

*"1output6abel value#,Estado civil1 , &or#,estAivil, 28
*"1selectDne6istbox value#,^{candidato@ean.candidato.raca, id#,estAivil, si>e#,4,8
*&1selectItem item6abel#,Solteiro, item)alue#,Solteiro,28
*&1selectItem item6abel#,Aasado, item)alue#,Aasado,28
*&1selectItem item6abel#,)icvo, item)alue#,)icvo,28
*&1selectItem item6abel#,?ivorciado, item)alue#,?ivorciado,28
Captulo & - Coponentes JSF Rosiclia Frasson

93

*&1selectItem item6abel#,Dutro, item)alue#,Dutro,28
*2"1selectDne6istbox8

*"1select@ooleanA"ec%box id#,de&iciente,
value#,^{candidato@ean.candidato.e"?e&iciente,28
*"1output6abel value#,;ortador de necessidades especiais, &or#,de&iciente,28

*"1output6abel value#,/ele&one1 , &or#,tele&one,28
*"1input/ext value#,^{candidato@ean.candidato.tele&one, id#,tele&one,28

*"1output6abel value#,Email , &or#,email,28
*"1input/ext value#,^{candidato@ean.candidato.email, id#,email, si>e#,_I,28

*2"1panel(rid8
*2&ieldset8

*br 28
*br 28

*&ieldset8
*legend8E$?ECEhD*2legend8

*"1panel(rid columns#,0,8
*"1output6abel value#,Endere`o1 , &or#,endereco,28
*"1input/ext value#,^{candidato@ean.candidato.endereco.endereco, id#,endereco,
si>e#,_I, 28

*"1output6abel value#,Aomplemento1 , &or#,complemento,28
*"1input/ext value#,^{candidato@ean.candidato.endereco.complemento,
id#,complemento, si>e#,_I,28

*"1output6abel value#,!unicLpio1 , &or#,municipio,28
*"1input/ext value#,^{candidato@ean.candidato.endereco.municipio, id#,municipio,
si>e#,_I, 28

*"1output6abel value#,@airro1 , &or#,bairro,28
*"1input/ext value#,^{candidato@ean.candidato.endereco.bairro, id#,bairro,
si>e#,_I,28

*"1output6abel value#,Estado1 , &or#,estado,28
*"1selectDne!enu value#,^{candidato@ean.candidato.endereco.estado, id#,estado, 8
*&1selectItem item6abel#,EA, item)alue#,EA,28
*&1selectItem item6abel#,E6, item)alue#,E6,28
*&1selectItem item6abel#,E;, item)alue#,E;,28
*&1selectItem item6abel#,E!, item)alue#,E!,28
*&1selectItem item6abel#,@E, item)alue#,@E,28
*&1selectItem item6abel#,AE, item)alue#,AE,28
*&1selectItem item6abel#,?F, item)alue#,?F,28
*&1selectItem item6abel#,ES, item)alue#,ES,28
*&1selectItem item6abel#,(D, item)alue#,(D,28
*&1selectItem item6abel#,!E, item)alue#,!E,28
*&1selectItem item6abel#,!/, item)alue#,!/,28
*&1selectItem item6abel#,!S, item)alue#,!S,28
*&1selectItem item6abel#,!(, item)alue#,!(,28
*&1selectItem item6abel#,;E, item)alue#,;E,28
*&1selectItem item6abel#,;@, item)alue#,;@,28
*&1selectItem item6abel#,;C, item)alue#,;C,28
*&1selectItem item6abel#,;E, item)alue#,;E,28
*&1selectItem item6abel#,;I, item)alue#,;I,28
*&1selectItem item6abel#,CG, item)alue#,CG,28
*&1selectItem item6abel#,C$, item)alue#,CG,28
Captulo & - Coponentes JSF Rosiclia Frasson

94

*&1selectItem item6abel#,CS, item)alue#,CG,28
*&1selectItem item6abel#,CD, item)alue#,CD,28
*&1selectItem item6abel#,CC, item)alue#,CC,28
*&1selectItem item6abel#,SA, item)alue#,SA,28
*&1selectItem item6abel#,S;, item)alue#,S;,28
*&1selectItem item6abel#,SE, item)alue#,SE,28
*&1selectItem item6abel#,/D, item)alue#,/D,28
*2"1selectDne!enu8
*2"1panel(rid8
*2&ieldset8
*br 28
*br 28

*&ieldset8
*legend8?E?DS ?E EAESSD*2legend8

*"1panel(rid columns#,0,8

*"1panel(roup8
*"1output6abel value#,6ogin1 , &or#,login, 28
*"1grap"icImage value#,2imagens2ajuda.png, alt#,ajuda,28
*2"1panel(roup8
*"1panel(roup8
*"1input/ext value#,^{candidato@ean.candidato.login, id#,login,
validator!essage#,D login deve ser composto apenas por letras e deve possuir entre = e 'B caracteres.,8
*&1validateCegex pattern#,Oa9>P{=J'B,28
*2"1input/ext8
*"1message &or#,login,28
*2"1panel(roup8


*"1output6abel value#,Sen"a1 , &or#,sen"a,28
*"1panel(roup8
*"1inputSecret value#,^{candidato@ean.candidato.sen"a, id#,sen"a,
validator!essage#,E sen"a deve possuir no mLnimo = caracteres e no mNximo '- caracteres.,8
*&1validate6engt" maximum#,'-, minimum#,=,28
*2"1inputSecret8
*"1message &or#,sen"a,28
*2"1panel(roup8

*2"1panel(rid8
*2&ieldset8

*br 28
*br 28

*&ieldset8
*legend8FDC!EhiD E E5;ECIj$AIES ;CDFISSID$EIS*2legend8

*"1panel(rid columns#,0,8


*"1output6abel value#,Forma`Ho1 , &or#,&ormacao,28
*"1select!any6istbox id#,&ormacao, value#,^{candidato@ean.candidato.&ormacoes,
si>e#,4,8
*&1selectItem item)alue#,', item6abel#,Ensino !Tdio,28
*&1selectItem item)alue#,0, item6abel#,Aurso /Tcnico,28
*&1selectItem item)alue#,4, item6abel#,(radua`Ho,28
*&1selectItem item)alue#,U, item6abel#,Especiali>a`Ho,28
*&1selectItem item)alue#,I, item6abel#,!estrado,28
*&1selectItem item)alue#,=, item6abel#,?outorado,28
Captulo & - Coponentes JSF Rosiclia Frasson

95

*2"1select!any6istbox8
*"1output/ext28
*"1output/ext28

*"1output6abel value#,Idiomas1 , &or#,idiomas,28
*"1select!any!enu id#,idiomas, value#,^{candidato@ean.candidato.idiomas,
style#,"eig"t1 Z-px, 8
*&1selectItem item)alue#,Inglds,28
*&1selectItem item)alue#,Francds,28
*&1selectItem item)alue#,ElemHo,28
*&1selectItem item)alue#,Espan"ol,28
*&1selectItem item)alue#,!andarim,28
*2"1select!any!enu8
*"1output/ext28
*"1output/ext28
*2"1panel(rid8

*"1panel(rid columns#,',8
*"1output6abel value#,:abilidades2Aon"ecimentos1 , &or#,con"ecimento,28
*"1select!anyA"ec%box id#,con"ecimento,
value#,^{candidato@ean.candidato.con"ecimentos, layout#,page?irection, 8
*&1selectItems value#,^{candidato@ean.con"ecimentos,28
*2"1select!anyA"ec%box8

*"1output6abel value#,Aargos ;retendidos1 , &or#,cargos;re,28
*"1select!any6istbox id#,cargos;re,
value#,^{candidato@ean.candidato.cargos;retendidos,8
*&1selectItems value#,^{candidato@ean.cargos,28
*2"1select!any6istbox8

*"1output6abel value#,Experidncias ;ro&issionais1 , &or#,ex;ro&issional,28
*"1input/extarea value#,^{candidato@ean.candidato.experiencias, id#,ex;ro&issional,
ro3s#,'-, cols#,B-,28

*"1output6abel value#,eltimo SalNrio1 , &or#,ultimoSalario, 28
*"1input/ext value#,^{candidato@ean.candidato.ultimoSalario, id#,ultimoSalario,8
*&1convert$umber currencySymbol#,Cf, type#,currency,28
*2"1input/ext8

*"1output6abel value#,;retensHo Salarial1 , &or#,pretensaoSalarial, 28
*"1input/ext value#,^{candidato@ean.candidato.pretensaoSalarial,
id#,pretensaoSalarial,8
*2"1input/ext8

*"1output6abel value#,Aarga :orNria1 , &or#,carga, 28
*"1input/ext value#,^{candidato@ean.candidato.carga:oraria, id#,carga,8

*2"1input/ext8
*2"1panel(rid8
*2&ieldset8

*br 28

*"1command@utton value#,Aadastrar, action#,^{candidato@ean.adicionarAandidato,28

*br 28
*br 28

*"1output6in% value#,"ttp122333.google.com,8
*"1output/ext value#,;ara mais in&orma`bes cli<ue a<ui,28
*2"1output6in%8
Captulo & - Coponentes JSF


*br 28
*br 28
*br 28

*2"1&orm8
*2div8
*2div8
*2"1body8
*2"tml8

Vale lembrar que a codificao apresentada no salva o candidato. Serve apenas para
exemplificar o uso dos componentes JSF.

7. Executando o projeto, a pgina exibida deve ser semelhante a figura a seguir.


Vale lembrar que a codificao apresentada no salva o candidato. Serve apenas para
exemplificar o uso dos componentes JSF.
Executando o projeto, a pgina exibida deve ser semelhante a figura a seguir.
Rosiclia Frasson
96
Vale lembrar que a codificao apresentada no salva o candidato. Serve apenas para
Executando o projeto, a pgina exibida deve ser semelhante a figura a seguir.

Captulo ' - CSS


CSS

Os usurios de pginas web esto cad
boa usabilidade, possuir uma navegao simples e agradvel, onde o usurio possa concluir sua
tarefa em poucos passos. Alm disso, o usurio deseja pginas que sejam visualmente atraentes.
Como visto no captulo anterior a criao de pginas utilizando apenas componentes JSF, no
deixa as mesmas esteticamente bonitas.
Para aprimorar o visual, necessrio aplicar CSS (Cascading Style Sheets) nas pginas.
O CSS usado para definir a aparncia da pgina. Com el
posicionamento, entre outros detalhes, dos componentes HTML.


Declarao do CSS

O CSS pode ser declarado diretamente na tag ou na seo head de uma pgina HTML, no
entanto, mais comum e produtivo utilizar folha
permite que o mesmo estilo seja aplicado em diversas pginas. Essas folhas de estilos possuem a
extenso .css.
A indicaco do uso de uma folha de estilo deve ficar dentro da tag head. Embora possa ser
utilizado o caminho completo do arquivo, esta uma abordagem no recomendada, pois, em caso
de mudanas na estrutura das pginas, a indicao das folhas de estilo continua a mesma.
O JSF possui um componente chamado ResourceHandler que trata cada recurso como
uma biblioteca. O ResourceHandler define uma estrutura de diretrios para facilitar a localizao
de cada recurso. Dessa forma, no deve ser utilizado o caminho fsico na declarao de arquivos
CSS, imagens e gifs. O recomendado que uma pasta chamada resourc
Pginas Web. Abaixo desta pasta devem ser criadas pastas que sero tratadas como bibliotecas.
Segue uma estrutura como exemplo.

No modelo apresentado foram criados os recursos css e imagens. Em todas as pginas, o
acesso a estes recursos definido da mesma forma

*"1"ead8
*"1outputStyles"eet library#,css, name#,estilo.css,28
*2"1"ead8


Os usurios de pginas web esto cada vez mais exigentes. As pginas web devem ter
boa usabilidade, possuir uma navegao simples e agradvel, onde o usurio possa concluir sua
tarefa em poucos passos. Alm disso, o usurio deseja pginas que sejam visualmente atraentes.
lo anterior a criao de pginas utilizando apenas componentes JSF, no
deixa as mesmas esteticamente bonitas.
Para aprimorar o visual, necessrio aplicar CSS (Cascading Style Sheets) nas pginas.
O CSS usado para definir a aparncia da pgina. Com ele possvel definir a cor, o tamanho, o
posicionamento, entre outros detalhes, dos componentes HTML.
O CSS pode ser declarado diretamente na tag ou na seo head de uma pgina HTML, no
entanto, mais comum e produtivo utilizar folhas de estilo externas, j que essa abordagem
permite que o mesmo estilo seja aplicado em diversas pginas. Essas folhas de estilos possuem a
A indicaco do uso de uma folha de estilo deve ficar dentro da tag head. Embora possa ser
o caminho completo do arquivo, esta uma abordagem no recomendada, pois, em caso
de mudanas na estrutura das pginas, a indicao das folhas de estilo continua a mesma.
O JSF possui um componente chamado ResourceHandler que trata cada recurso como
biblioteca. O ResourceHandler define uma estrutura de diretrios para facilitar a localizao
de cada recurso. Dessa forma, no deve ser utilizado o caminho fsico na declarao de arquivos
CSS, imagens e gifs. O recomendado que uma pasta chamada resources seja criada dentro de
Pginas Web. Abaixo desta pasta devem ser criadas pastas que sero tratadas como bibliotecas.
Segue uma estrutura como exemplo.


No modelo apresentado foram criados os recursos css e imagens. Em todas as pginas, o
es recursos definido da mesma forma.
*"1"ead8
*"1outputStyles"eet library#,css, name#,estilo.css,28
*2"1"ead8
Rosiclia Frasson
97
a vez mais exigentes. As pginas web devem ter
boa usabilidade, possuir uma navegao simples e agradvel, onde o usurio possa concluir sua
tarefa em poucos passos. Alm disso, o usurio deseja pginas que sejam visualmente atraentes.
lo anterior a criao de pginas utilizando apenas componentes JSF, no
Para aprimorar o visual, necessrio aplicar CSS (Cascading Style Sheets) nas pginas.
e possvel definir a cor, o tamanho, o
O CSS pode ser declarado diretamente na tag ou na seo head de uma pgina HTML, no
s de estilo externas, j que essa abordagem
permite que o mesmo estilo seja aplicado em diversas pginas. Essas folhas de estilos possuem a
A indicaco do uso de uma folha de estilo deve ficar dentro da tag head. Embora possa ser
o caminho completo do arquivo, esta uma abordagem no recomendada, pois, em caso
de mudanas na estrutura das pginas, a indicao das folhas de estilo continua a mesma.
O JSF possui um componente chamado ResourceHandler que trata cada recurso como
biblioteca. O ResourceHandler define uma estrutura de diretrios para facilitar a localizao
de cada recurso. Dessa forma, no deve ser utilizado o caminho fsico na declarao de arquivos
es seja criada dentro de
Pginas Web. Abaixo desta pasta devem ser criadas pastas que sero tratadas como bibliotecas.
No modelo apresentado foram criados os recursos css e imagens. Em todas as pginas, o
Captulo ' - CSS


Sintaxe do CSS

Uma regra CSS pode ser dividida em duas partes: seletor e declarao. O seletor
normalmente o elemento HTML que deve r
propriedade e um valor. Por sua vez a propriedade um atributo de estilo que ser
Cada propriedade deve possuir um valor.

Alm de definir um estilo para um elemento HTML, possvel especific
utilizando classes e ids. Um id uma identificao nica, s pode ser utilizado uma vez na pgina
html. J a classe reutilizvel, ou seja, pode ser repetida na mesma pgina.
Os seletores podem ser combinados para aplicar formataes mais e
possvel aplicar um bloco de declaraes para mais de um seletor.

HTML
*div id#,cabecal"o,8
E<ui vai o cabe`al"o do site
*2div8
*div id#,conteudo,8
*div class#,subtitulo,8
*p8subtLtulo ' *2p8
*2div8
*div class#,subtitulo,8
*p8subtLtulo 0 *2p8
*2div8
*2div8
*div id#,rodape,8
E<ui vai o rodapT do site
*2div8


Propriedades

background-color Especifica a cor de um elemento de fundo. Em CSS a cor pode ser
especificada:



Uma regra CSS pode ser dividida em duas partes: seletor e declarao. O seletor
normalmente o elemento HTML que deve receber o estilo. A declarao composta por uma
propriedade e um valor. Por sua vez a propriedade um atributo de estilo que ser
Cada propriedade deve possuir um valor.
Alm de definir um estilo para um elemento HTML, possvel especific
utilizando classes e ids. Um id uma identificao nica, s pode ser utilizado uma vez na pgina
html. J a classe reutilizvel, ou seja, pode ser repetida na mesma pgina.
Os seletores podem ser combinados para aplicar formataes mais e
possvel aplicar um bloco de declaraes para mais de um seletor.
CSS
^cabecal"o{
2Y?eclara`besY2


^conteudo{
2Y?eclara`besY2


^rodape{
2Y?eclara`besY2


.subtitulo{
2Y?eclara`besY2

Especifica a cor de um elemento de fundo. Em CSS a cor pode ser
especificada:
em hexadecimal: #FFFFFF.
em RGB: rgb(255,0,0).
pelo nome da cor: red.

body{
Rosiclia Frasson
98
Uma regra CSS pode ser dividida em duas partes: seletor e declarao. O seletor
eceber o estilo. A declarao composta por uma
propriedade e um valor. Por sua vez a propriedade um atributo de estilo que ser aplicado.

Alm de definir um estilo para um elemento HTML, possvel especificar seletores
utilizando classes e ids. Um id uma identificao nica, s pode ser utilizado uma vez na pgina

Os seletores podem ser combinados para aplicar formataes mais especficas. Tambm
Especifica a cor de um elemento de fundo. Em CSS a cor pode ser
Captulo ' - CSS Rosiclia Frasson

99

bac%ground9color1 ^-B0_=_;


background-image Indica um arquivo de imagem para ser exibido no fundo do elemento.

body{
bac%ground9image1 url(,&undo.png,);


background-repeat Controla a repetio da imagem de fundo. Essa propriedade pode conter
os seguintes valores:
repeat: a imagem repetida tanto na horizontal quanto na
vertical.
repeat-x: a imagem repetida na horizontal.
repeat-y: a imagem repetida na vertical.
no-repeat: a imagem no repetida.

body{
bac%ground9image1 url(,&undo.png,);
bac%groun9repeat1 no9repeat;


background-
attachment
Define se a imagem de fundo fixa ou se rola junto com a pgina.
Possui dois valores fixed e scroll.

body{
bac%ground9image1 url(,&undo.png,);
bac%ground9attac"ment1 scroll;


color Define a cor de um elemento. Normalmente a cor especificada em
nmeros hexadecimais, porm tambm ser definida atravs de seu
nome ou RGB.

p{
color1 ^04FFI=;


text-align Define o alinhamento horizontal do texto. Os valores disponveis para
esta propriedade so:
center: texto alinhado ao centro.
right: texto alinhado direita.
left: texto alinhado esquerda.
justify: texto justificado.
p{
text9align1 le&t;
Captulo ' - CSS Rosiclia Frasson

100



text-decoration Propriedade que permite adicionar ou retirar a decorao de um texto.
Pode conter os seguintes valores:
underline: texto sublinhado.
line-through: texto tachado.
overline: texto com sobrelinha.
blink: texto que pisca.
none: sem decorao.

"'{
text9decoration1 underline;


text-transform Permite transformaes no formato caixa-alta ou caixa-baixa no texto.
Permite os seguintes valores:
capitalize: primeira letra das palavras em maiscula.
lowercase: todas as letras em maisculas.
uppercase: todas as letras em minsculas.
none: sem efeito.

"'{
text9trans&orm1 uppercase;


text-ident Permite que um recuo seja aplicado na primeira linha do pargrafo.

p{
text9ident1 4-px;


font-family Define a famlia de fonte utilizada. Normalmente definida uma lista de
fontes e sua prioridade para apresentao na pgina. Dessa forma, se a
primeira fonte da lista no estiver instalada na mquina do usurio,
dever ser usada a segunda. Se a segunda tambm no estiver
instalada usa-se a terceira e assim at ser encontrada uma fonte
instalada.
As fontes podem ser definidas pelo nome da famlia, como por exemplo,
Times New Roman, Georgia, Arial, Tahoma. Tambm podem ser
definidas fontes de famlias genricas, ou seja, fontes que pertencem a
um grupo com aparncia uniforme. Dentre as famlias genricas podem
ser citadas:
serif: fontes que possuem p.
sans-serif: fontes que no possuem p.
monospace: fontes que possuem todos os caracteres com uma
largura fixa.
Captulo ' - CSS Rosiclia Frasson

101

recomendado que a lista de fontes seja encerrada com uma fonte
genrica.

"' {
&ont9&amily1 arialJ verdanaJ sans9seri&;


font-style Define o estilo da fonte que pode ser normal, italic e oblique.

"' {
&ont9style1 italic;


font-size Define o tamanho da fonte. O tamanho da fonte pode ser definido em
pixel ou em. O tamanho de 1 em equivale a 16 px.

"' {
&ont9si>e10.Iem;


"' {
&ont9si>e1U-px;


list-style-type Define o estilo de marcador de uma lista. Em uma lista no ordenada os
marcadores devem ser sempre do mesmo tipo e podem assumir os
seguintes valores:
none: sem marcador.
disc: crculo preenchido.
circle: crculo no preenchido.
square: quadrado cheio.
J nas listas ordenadas, os marcadores podem ser:
decimal: nmero decimal.
decimal-leading-zero: o marcador um nmero decimal com dois
dgitos.
upper-latin: o marcador composto por letras maisculas.
lower-latin: o marcador composto por letras minsculas.
upper-roman: o marcador composto por letras romanas.

ul {
list9style9type1 circle;


width Define a largura de um elemento.

Captulo ' - CSS Rosiclia Frasson

102

"' {
3idt"1 0--px;
border1 'px solid blac%;
bac%ground1 orange;


height Define a altura de um elemento.

"' {
"eig"t1 I-px;
border1 'px solid blac%;
bac%ground1 orange;


float Desloca um elemento para a esquerda ou para a direita.

^&igura {
&loat1le&t;
3idt"1 '--px;


Para limpar a flutuao dos elementos posteriores, necessrio utilizar
a propriedade clear com o valor both.



Links

Os links podem ser formatados usando qualquer propriedade CSS. Diferentemente do que
ocorre com outros seletores, os links podem ser formatados de acordo com o seu estado.

a Estiliza um link.

a {
color1 blue;


a:link Estiliza um link no visitado.

a 1 lin% {
color1 green;


a:visited Estiliza um link j visitado pelo usurio.

Captulo ' - CSS



a:hover Estiliza o link quando o mouse est sobre ele.


a: active Estiliza o lin




Box Model

O box model uma espcie de caixa que envolve todos os elementos HTML. O box model
possui opes de ajuste de margem, borda, preenchimento e contedo para cada element

margin: rea limpa ao redor da borda. A margem no possui uma cor de fundo, que
completamente transparente.
border: rea que gira em torno do contedo e do padding.
padding: rea limpa ao redor do contedo.
content: rea onde o texto e as imagens aparecem.

border-style Define o estilo da borda. Alguns estilos suportados:
none: sem borda.
dotted: borda pontilhada.
dashed:
a1 visited {
color1 blue;

Estiliza o link quando o mouse est sobre ele.
a1"over1 visited {
bac%ground9color1^FF_-U?;

Estiliza o link quando est sendo clicado.
a1active {
bac%ground9color1^FF_-U?;

O box model uma espcie de caixa que envolve todos os elementos HTML. O box model
possui opes de ajuste de margem, borda, preenchimento e contedo para cada element

margin: rea limpa ao redor da borda. A margem no possui uma cor de fundo, que
completamente transparente.
ea que gira em torno do contedo e do padding.
padding: rea limpa ao redor do contedo.
content: rea onde o texto e as imagens aparecem.
Define o estilo da borda. Alguns estilos suportados:
none: sem borda.
dotted: borda pontilhada.
dashed: borda tracejada.
Rosiclia Frasson
103
O box model uma espcie de caixa que envolve todos os elementos HTML. O box model
possui opes de ajuste de margem, borda, preenchimento e contedo para cada elemento.

margin: rea limpa ao redor da borda. A margem no possui uma cor de fundo, que
Captulo ' - CSS Rosiclia Frasson

104

solid: borda em linha slida.
double: define duas bordas.

"' {
border9style1 dotted;


Para que as demais propriedades de borda surtam efeito, o border-style deve
ser diferente de none.
Os lados que compem a borda podem possuir propriedades diferentes. Nesse
caso, necessrio indicar o lado em que a propriedade ser aplicada: top,
bottom, right e left.
border-width Define o tamanho da borda. A espessura pode ser definida em pixels ou
utilizando os valores thin, medium, e thick (fina, mdia e grossa).

"' {
border93idt"1 t"ic%;


border-color Define a cor da borda.

"' {
border9color1 gold;


margin Define uma margem para o elemento. Esta propriedade adiciona espao aps o
limite do elemento. possvel indicar o lado que a margem ser aplicada
utilizando bottom, top, left e right.
possvel tambm aplicar margens diferentes em uma mesma propriedade.
Sendo que o primeiro valor representa top, o segundo right, o terceiro bottom e
o ltimo left.

body{
margin10Ipx I-px _Ipx '--px;


"'{
margin9top1 '-px;
margin9bottom1 0-px;
margin9le&t1 'Ipx;
margin9rig"t1 4-px;


padding Define uma margem interna para o elemento, ou seja, a distncia entre o limite
do elemento, sua borda e seu contedo.

Captulo ' - CSS






CSS3

O CSS3 o novo padro para CSS. compatvel com as verses anteriores e possui
alguns recursos interessantes. A seguir so listados alguns.

border-radius Adiciona bordas

box-shadow Define sombra aos elementos da pgina. Este atributo necessita de alguns
valores para especificar as caractersticas da sombra:
Deslocamento horizontal da sombra: Corresponde ao primei
atributo. Se for definido um valor positivo a sombra deve aparecer
direita do elemento. Para sombra aparecer esquerda do elemento,
necessrio definir um valor negativo.
Deslocamento vertical da sombra: Corresponde ao segundo valor da
propriedade. Corresponde ao deslocamento vertical da sombra com
relao ao elemento que a produz. Se for definido um valor positivo a
sombra aparece abaixo do elemento e um valor negativo aplica a
sombra acima do elemento.
Esfumaado: o terceiro valor da pro
a sombra no esfumaada. Valores maiores aumentam o efeito.
cor da sombra: o ltimo elemento. Podem ser utilizados os nomes das
cores, rgb ou hexadecimal.
Para o Firefox essa propriedade definida como
Chrome e Safari a propriedade definida como

body{
padding9top10Ipx;
padding9bottom10Ipx;
padding9rig"t1I-px;
padding9le&t1I-px;

O CSS3 o novo padro para CSS. compatvel com as verses anteriores e possui
alguns recursos interessantes. A seguir so listados alguns.
Adiciona bordas arredondadas ao elemento.
div{
border9radius10Ipx;


Define sombra aos elementos da pgina. Este atributo necessita de alguns
valores para especificar as caractersticas da sombra:
Deslocamento horizontal da sombra: Corresponde ao primei
atributo. Se for definido um valor positivo a sombra deve aparecer
direita do elemento. Para sombra aparecer esquerda do elemento,
necessrio definir um valor negativo.
Deslocamento vertical da sombra: Corresponde ao segundo valor da
riedade. Corresponde ao deslocamento vertical da sombra com
relao ao elemento que a produz. Se for definido um valor positivo a
sombra aparece abaixo do elemento e um valor negativo aplica a
sombra acima do elemento.
Esfumaado: o terceiro valor da propriedade. O valor zero indica que
a sombra no esfumaada. Valores maiores aumentam o efeito.
cor da sombra: o ltimo elemento. Podem ser utilizados os nomes das
cores, rgb ou hexadecimal.
Para o Firefox essa propriedade definida como -moz
Chrome e Safari a propriedade definida como -webkit-box
^caixa{
3idt"1 '--px;
"eig"t1 '--px;
bac%ground1 ^AFE0F4;
Rosiclia Frasson
105
O CSS3 o novo padro para CSS. compatvel com as verses anteriores e possui
Define sombra aos elementos da pgina. Este atributo necessita de alguns
Deslocamento horizontal da sombra: Corresponde ao primeiro valor do
atributo. Se for definido um valor positivo a sombra deve aparecer
direita do elemento. Para sombra aparecer esquerda do elemento,
Deslocamento vertical da sombra: Corresponde ao segundo valor da
riedade. Corresponde ao deslocamento vertical da sombra com
relao ao elemento que a produz. Se for definido um valor positivo a
sombra aparece abaixo do elemento e um valor negativo aplica a
priedade. O valor zero indica que
a sombra no esfumaada. Valores maiores aumentam o efeito.
cor da sombra: o ltimo elemento. Podem ser utilizados os nomes das
moz-box-shadow. Para o
box-shadow.
Captulo ' - CSS




PASSO-A-PASSO

Com o intuito de deixar o projeto apresentado no captulo anterior
com uma melhor aparncia sero inseridas algumas regras de estilo.

1. No projeto criado no captulo anterior, necessrio indicar a folha de est
pgina.

*"1"ead8
*title8AurrLculo*2title8
*"1outputStyles"eet library#,css, name#,style.css,28
*2"1"ead8

2. O prximo passo a criao da folha de estilo. Segue a seguir a codificao da mesma.

body{
margin1 -;
padding1 -;
bac%ground1 ^F=F=F=;
&ont9si>e1 '4px;
text9align1 justi&y;


^cabecal"o{
3idt"1 B--px;
"eig"t1 '--px;
margin1 - auto;


^cabecal"o "'J ^cabecal"o p{
margin1 -;
padding1 -;

box9s"ado31 Ipx Ipx 4px ^444;
93eb%it9box9s"ado31 Ipx Ipx 4px ^444;
9mo>9box9s"ado31 Ipx Ipx 4px ^444;



Com o intuito de deixar o projeto apresentado no captulo anterior - cadastro de currculo
com uma melhor aparncia sero inseridas algumas regras de estilo.
1. No projeto criado no captulo anterior, necessrio indicar a folha de estilo que ser aplicada a
*"1"ead8
*title8AurrLculo*2title8
*"1outputStyles"eet library#,css, name#,style.css,28
*2"1"ead8
2. O prximo passo a criao da folha de estilo. Segue a seguir a codificao da mesma.
margin1 -;
padding1 -;
bac%ground1 ^F=F=F=;
si>e1 '4px;
align1 justi&y;
^cabecal"o{
3idt"1 B--px;
"eig"t1 '--px;
margin1 - auto;
^cabecal"o "'J ^cabecal"o p{
margin1 -;
padding1 -;
Rosiclia Frasson
106
s"ado31 Ipx Ipx 4px ^444;
cadastro de currculo -
ilo que ser aplicada a
2. O prximo passo a criao da folha de estilo. Segue a seguir a codificao da mesma.
Captulo ' - CSS Rosiclia Frasson

107

^cabecal"o "'{
&ont9si>e1 I0px;
color1 ^0-E--';


^cabecal"o p{
margin9top1 -px;
margin9le&t1 4-px;
padding1 - - - Upx;
&ont9si>e1 'Ipx;
&ont93eig"t1 normal;
color1 ^B=EE==;
text9trans&orm1 uppercase;


^pagina{
3idt"1 B--px;
margin1 - auto;
padding1 -px;
bac%ground1 ^&&&&&&;
box9s"ado31 Ipx Upx '-px ^444J 9Ipx 9Ipx '-px ^ccc;



^titulo;rincipal{
text9trans&orm1 uppercase;
bac%ground9color1 ^0-E--';
color1 ^FFFFFF;
&ont9si>e1 'Ipx;


^&ormulario{
margin1 0-px;


^&ormulario inputJ textareaJ selectJ optionJ body{
&ont9&amily1 ErialJ :elveticaJ sans9seri&;
color1 ^B4B0=E;


&ieldset{
border9radius1 Ipx;



Captulo ' - CSS Rosiclia Frasson

108



Captulo 1( - Escopos JSF Rosiclia Frasson

109

Escopos JSF

Request Scope

Os objetos armazenados com escopo request sobrevivem apenas a uma submisso do
ciclo de vida do JSF, ou seja, os dados recebidos so processados e uma resposta enviada ao
cliente, aps o envio da resposta os dados so apagados da memria do servidor. A cada
requisio criada uma nova instncia do managed bean, sendo assim, as informaes no so
compartilhadas entre as requisies.
O escopo request possui o menor tempo de vida entre os escopos, sendo assim os objetos
permanecem pouco tempo na memria, melhorando a performance da aplicao. RequestScoped
o escopo apropriado em telas onde no so necessrias chamadas ajax e no necessrio
armazenar dados entre as requisies dos usurios. Um bom exemplo para utilizao desse
escopo a submisso de um formulrio simples.

@!anaged@ean
@Ce<uestScoped
public class ExemploEscopoCe<uest{


Os managed beans com escopo request no necessitam da anotao @RequestScoped,
pois este o escopo padro. Porm uma boa prtica utilizar a anotao.


Session Scope

Os objetos armazenados com o escopo session sobrevivem enquanto a seo do usurio
estiver ativa. Em outras palavras, ao utilizar este escopo, os atributos do managed bean tero
seus valores mantidos at o fim da sesso do usurio.
O escopo de sesso recomendado para o armazenamento de informaes do usurio e
dados de preferncia deste. Vale ressaltar que a sesso definida pelo vnculo do usurio com o
navegador. Sendo assim, se dois navegadores distintos forem abertos pelo mesmo usurio, duas
sees diferentes sero criadas no servidor.
Uma seo pode ser destruda em duas situaes: a primeira delas quando a prpria
aplicao decide finalizar a sesso, que o que ocorre quando um usurio faz o logout e a outra
situao se d quando o servidor decide expirar a sesso. O tempo para que uma seo seja
expirada pode ser configurada no web.xml.

@!anaged@ean
@SessionScoped
public class ExemploEscopoSession{


Embora a utilizao do Session Scope seja relativamente fcil, importante ter muita
cautela ao anotar um managed bean com este escopo. importante lembrar que um objeto com
escopo session permanecer na memria durante toda a seo. Isso significa que quanto maior a
Captulo 1( - Escopos JSF Rosiclia Frasson

110

quantidade de usurios maior ser a quantidade de memria que o servidor ter que gerenciar, ou
seja, a cada nova seo criada um novo managed bean com todos os atributos ser alocado na
memria do servidor.


Application Scoped

A utilizao do escopo de aplicao cria uma instncia do managed bean no momento em
que a classe requisitada e a mantm at a finalizao da aplicao. Com o application Scoped,
o managed bean estar disponvel para todos os usurios da aplicao enquanto a mesma estiver
sendo executada. importante ressaltar que informaes que no devem ser compartilhadas no
devem possuir este escopo.
O escopo de aplicao geralmente utilizado para guardar valores de configurao e
realizao de cache manual como o carregamento de listagem de estados e municpios.

@!anaged@ean
@EpplicationScoped
public class ExemploEscopoEplicacao{


Atravs da configurao @ManagedBean (eager = true), o servidor instancia o managed
bean antes que qualquer tela da aplicao seja acessada. Isto significa que a informao ser
carregada em memria antes de ser solicitada pelo usurio.


View Scoped

O escopo de viso mantm os dados enquanto o usurio permanecer na pgina. No
momento em que h troca de pgina o objeto excludo da memria.
View Scoped possui um tempo de vida maior que o Request Scoped e menor que o
Session Scoped e muito indicado para pginas que possuem requisies ajax.
importante salientar que um managed bean com anotao @ViewScoped s removido
da memria se a mudana de pgina for feita pelo mtodo POST o que pode acarretar em objetos
desnecessrios na memria, caso a navegao for feita via link.

@!anaged@ean
@)ie3Scoped
public class ExemploEscopo)ie3{



PASSO-A-PASSO

Com o intuito de demonstrar a diferena entre os escopos dos managed beans, deve ser criado
um novo projeto JSF.
1. O pacote modelo deve conter uma classe com o nome de Aluno. Esse aluno deve possuir o
atributo nome.
Captulo 1( - Escopos JSF Rosiclia Frasson

111

pac%age br.com.rosicleia&rasson.cap'-escopos.modelo;

public class Eluno {

private String nome;

public String get$ome() {
return nome;


public void set$ome(String nome) {
t"is.nome # nome;



2. Para controlar os dados recebidos e enviados pela visualizao, necessrio criar um managed
bean. Neste primeiro exemplo ser utilizado o escopo request.

pac%age br.com.rosicleia&rasson.cap'-escopos.controle;

import br.com.rosicleia&rasson.cap'-escopos.modelo.Eluno;
import java.util.Erray6ist;
import java.util.6ist;
import javax.&aces.bean.!anaged@ean;
import javax.&aces.bean.Ce<uestScoped;

@!anaged@ean
@Ce<uestScoped
public class Eluno@ean {

private 6ist*Eluno8 alunos # ne3 Erray6ist*8();
private Eluno aluno # ne3 Eluno();

public String adicionaEluno(){
t"is.alunos.add(t"is.aluno);
t"is.aluno # ne3 Eluno();
return ,index,;


public 6ist*Eluno8 getElunos() {
return alunos;


public Eluno getEluno() {
return aluno;


public void setEluno(Eluno aluno) {
t"is.aluno # aluno;

Captulo 1( - Escopos JSF Rosiclia Frasson

112



3. A pgina de visualizao deve ser composta por um campo de texto e um boto para adio dos
alunos e um componente de repetio para exibir todos os alunos cadastrados. Como a aplicao
no est conectada a uma base de dados, a lista dos alunos ser mantida durante o tempo de vida
do managed bean.

*+xml version#]'.-] encoding#]./F9B] +8
*R?DA/S;E "tml ;.@6IA ,922Q4A22?/? 5:/!6 '.- /ransitional22E$,
,"ttp122333.34.org2/C2x"tml'2?/?2x"tml'9transitional.dtd,8
*"tml xmlns#,"ttp122333.34.org2'ZZZ2x"tml, xmlns1"#,"ttp122java.sun.com2js&2"tml,
xmlns1ui#,"ttp122xmlns.jcp.org2js&2&acelets,8
*"1"ead8
*title8;rimeira pNgina GSF*2title8
*2"1"ead8
*"1body8
*"1&orm8
*"1panel(rid columns#,0,8
*"1output6abel value#,$ome1 , &or#,nome,28
*"1input/ext value#,^{aluno@ean.aluno.nome, id#,nome,28

*"1command@utton value#,Edicionar, action#,^{aluno@ean.adicionaEluno,28
*2"1panel(rid8
*2"1&orm8

*"1panel(roup rendered#,^{not empty aluno@ean.alunos,8
*"'8Elunos cadastrados*2"'8
*ul8
*ui1repeat value#,^{aluno@ean.alunos, var#,aluno,8
*li8
*"1output/ext value#,^{aluno.nome,28
*2li8
*2ui1repeat8
*2ul8
*2"1panel(roup8
*2"1body8
*2"tml8












Captulo 1( - Escopos JSF


Executando a aplicao uma pgina semelhante a pgina mostrada a seguir deve ser exibida.

importante perceber que quando o escopo do managed bean request, a cada requisio, ou
seja, cada vez que o usurio acionar o boto adicionar, a lista fica v
managed beans com escopo request duram o tempo de uma requisio.

Alterando o managed bean para o escopo de sesso, possvel perceber que os alunos
permanecem na lista cada vez que o usurio aciona o boto de adicionar.

pac%age br.com.rosicleia&rasson.cap'-escopos.controle;

import br.com.rosicleia&rasson.cap'-escopos.modelo.Eluno;

import java.util.Erray6ist;
import java.util.6ist;
import javax.&aces.bean.!anaged@ean;
import javax.&aces.bean.SessionScoped;

@!anaged@ean
@SessionScoped
public class Eluno@ean {

Como a seo muda a cada usurio ou navegador distinto, necessrio abrir a pgina em um
outro navegador para visualizar como o SessionScoped funciona. Como mostra a imagem a seguir, o
mesmo software em sees distin
Executando a aplicao uma pgina semelhante a pgina mostrada a seguir deve ser exibida.
importante perceber que quando o escopo do managed bean request, a cada requisio, ou
seja, cada vez que o usurio acionar o boto adicionar, a lista fica vazia. Isso ocorre porque os
managed beans com escopo request duram o tempo de uma requisio.
Alterando o managed bean para o escopo de sesso, possvel perceber que os alunos
permanecem na lista cada vez que o usurio aciona o boto de adicionar.
%age br.com.rosicleia&rasson.cap'-escopos.controle;
import br.com.rosicleia&rasson.cap'-escopos.modelo.Eluno;
import java.util.Erray6ist;
import java.util.6ist;
import javax.&aces.bean.!anaged@ean;
import javax.&aces.bean.SessionScoped;
@!anaged@ean
ssionScoped
public class Eluno@ean {
Como a seo muda a cada usurio ou navegador distinto, necessrio abrir a pgina em um
outro navegador para visualizar como o SessionScoped funciona. Como mostra a imagem a seguir, o
mesmo software em sees distintas possui em sua lista de alunos, valores distintos.
Rosiclia Frasson
113
Executando a aplicao uma pgina semelhante a pgina mostrada a seguir deve ser exibida.

importante perceber que quando o escopo do managed bean request, a cada requisio, ou
azia. Isso ocorre porque os
Alterando o managed bean para o escopo de sesso, possvel perceber que os alunos
import br.com.rosicleia&rasson.cap'-escopos.modelo.Eluno;
Como a seo muda a cada usurio ou navegador distinto, necessrio abrir a pgina em um
outro navegador para visualizar como o SessionScoped funciona. Como mostra a imagem a seguir, o
tas possui em sua lista de alunos, valores distintos.
Captulo 1( - Escopos JSF



Se o managed bean for alterado para escopo de aplicao, possvel perceber que mesmo em
sees distintas os valores contidos na lista de alunos continuam os mesmos.

pac%age br.com.rosicleia&rasson.
import br.com.rosicleia&rasson.cap'-escopos.modelo.Eluno;
import java.util.Erray6ist;
import java.util.6ist;
import javax.&aces.bean.EpplicationScoped;
import javax.&aces.bean.!anaged@ean;

@!anaged@ean
@EpplicationScoped
public clas
Se o managed bean for alterado para escopo de aplicao, possvel perceber que mesmo em
sees distintas os valores contidos na lista de alunos continuam os mesmos.
pac%age br.com.rosicleia&rasson.cap'-escopos.controle;
import br.com.rosicleia&rasson.cap'-escopos.modelo.Eluno;
import java.util.Erray6ist;
import java.util.6ist;
import javax.&aces.bean.EpplicationScoped;
import javax.&aces.bean.!anaged@ean;
@!anaged@ean
@EpplicationScoped
public class Eluno@ean {

Rosiclia Frasson
114

Se o managed bean for alterado para escopo de aplicao, possvel perceber que mesmo em
sees distintas os valores contidos na lista de alunos continuam os mesmos.
import br.com.rosicleia&rasson.cap'-escopos.modelo.Eluno;
Captulo 1( - Escopos JSF


Para finalizar resta exemplificar o escopo de viso. Como j mencionado o escopo de viso
existe na memria enquanto o usurio permanecer na pgina exibida. No exemplo exposto, o mtodo
adicionar um mtodo void. Isso significa que ao a
mesma. Portanto, para demonstrar este escopo necessrio uma modificao no mtodo adicionar,
para que o mesmo seja redirecionado. No exemplo mostrado ser redirecionado para a mesma
pgina, mas o comportamento ser o mesmo se a pgina redirecionada for diferente.

pac%age br.com.rosicleia&rasson.cap'-escopos.controle;

import br.com.rosicleia&rasson.cap'-escopos.modelo.Eluno;
import java.util.Erray6ist;
import java.util.6ist;
import javax.&aces.bean.!anaged@ea
import javax.&aces.bean.)ie3Scoped;


Para finalizar resta exemplificar o escopo de viso. Como j mencionado o escopo de viso
existe na memria enquanto o usurio permanecer na pgina exibida. No exemplo exposto, o mtodo
adicionar um mtodo void. Isso significa que ao acionar o boto adicionar, a pgina continua a
mesma. Portanto, para demonstrar este escopo necessrio uma modificao no mtodo adicionar,
para que o mesmo seja redirecionado. No exemplo mostrado ser redirecionado para a mesma
o ser o mesmo se a pgina redirecionada for diferente.
pac%age br.com.rosicleia&rasson.cap'-escopos.controle;
import br.com.rosicleia&rasson.cap'-escopos.modelo.Eluno;
import java.util.Erray6ist;
import java.util.6ist;
import javax.&aces.bean.!anaged@ean;
import javax.&aces.bean.)ie3Scoped;
Rosiclia Frasson
115

Para finalizar resta exemplificar o escopo de viso. Como j mencionado o escopo de viso
existe na memria enquanto o usurio permanecer na pgina exibida. No exemplo exposto, o mtodo
cionar o boto adicionar, a pgina continua a
mesma. Portanto, para demonstrar este escopo necessrio uma modificao no mtodo adicionar,
para que o mesmo seja redirecionado. No exemplo mostrado ser redirecionado para a mesma
o ser o mesmo se a pgina redirecionada for diferente.
import br.com.rosicleia&rasson.cap'-escopos.modelo.Eluno;
Captulo 1( - Escopos JSF Rosiclia Frasson

116


@!anaged@ean
@)ie3Scoped
public class Eluno@ean {

private 6ist*Eluno8 alunos # ne3 Erray6ist*8();
private Eluno aluno # ne3 Eluno();

public String adicionaEluno() {
t"is.alunos.add(t"is.aluno);
t"is.aluno # ne3 Eluno();
return ,index,;


Executando o projeto possvel perceber que a lista est sempre vazia. Isso ocorre porque
cada vez que o boto adicionar acionado a pgina redirecionada. O ViewScoped muito til em
pginas com chamadas ajax.

Captulo 11 - Facelets


Facelets

Facelets um framework utilizado para a
padronizados, bem como para a criao de componentes customizveis.
As aplicaes, em sua grande maioria, possuem um modelo padro para as pg
menu, o cabealho e o rodap tendem a ter a mesma estrutura no aplicativo inteiro. Codificar
estes componentes em todas as pginas torna difcil a manuteno das mesmas. O suporte a
templates do facelets permite a definio de uma estrutura visual
reaproveitada em diversas telas.


Na padronizao das telas com o uso do facelets possvel construir uma estrutura fixa
com o que semelhante em todas as telas como topo, menu e rodap.
Alm da facilidade de manuteno, reduo
consequente diminuio no tempo de desenvolvimento, a utilizao de facelets prov outras
vantagens. A principal delas que com a utilizao da tecnologia o cdigo a execuo do cdigo
fica de 30% a 50% mais rpida do qu
aplicao e est incorporado ao JSF 2.0.
Para construir um template para uma aplicao, necessrio identificar um padro em um
determinado conjunto de telas. Em posse deste padro, faz
utilizando trechos estticos e dinmicos. Vale ressaltar que um template nunca ser executado,
pois uma pgina incompleta, deste modo, importante que os templates sejam salvos dentro da
pasta WEB-INF para que o usurio no consiga ace
Em pginas que utilizam facelets necessrio importar o namespace de facelets:
http://xmlns.jcp.org/jsf/facelets. Seguem algumas tags dessa biblioteca:


Tag Descrio
ui:insert Define uma rea de substituio no template, ou seja,
exemplo, o menu, o topo e o corpo da pgina.
ui: include Insere um fragmento de tela dentro de uma pgina. Essa tag muito utilizada
quando o cdigo fonte de uma pgina fica muito extenso. Esse cdigo pode ser
separado em vrios a
ui:define Define o contedo de uma rea criada no template como ui:insert.
Facelets um framework utilizado para a construo de pginas com templates
bem como para a criao de componentes customizveis.
As aplicaes, em sua grande maioria, possuem um modelo padro para as pg
menu, o cabealho e o rodap tendem a ter a mesma estrutura no aplicativo inteiro. Codificar
estes componentes em todas as pginas torna difcil a manuteno das mesmas. O suporte a
templates do facelets permite a definio de uma estrutura visual padro que pode ser
reaproveitada em diversas telas.
Na padronizao das telas com o uso do facelets possvel construir uma estrutura fixa
com o que semelhante em todas as telas como topo, menu e rodap.
Alm da facilidade de manuteno, reduo drstica na quantidade de cdigo e
consequente diminuio no tempo de desenvolvimento, a utilizao de facelets prov outras
vantagens. A principal delas que com a utilizao da tecnologia o cdigo a execuo do cdigo
fica de 30% a 50% mais rpida do que em pginas jsp. O facelets independente de servidor de
aplicao e est incorporado ao JSF 2.0.
Para construir um template para uma aplicao, necessrio identificar um padro em um
determinado conjunto de telas. Em posse deste padro, faz-se a mont
utilizando trechos estticos e dinmicos. Vale ressaltar que um template nunca ser executado,
pois uma pgina incompleta, deste modo, importante que os templates sejam salvos dentro da
INF para que o usurio no consiga acess-las diretamente.
Em pginas que utilizam facelets necessrio importar o namespace de facelets:
http://xmlns.jcp.org/jsf/facelets. Seguem algumas tags dessa biblioteca:
Define uma rea de substituio no template, ou seja, demarca onde ser, por
exemplo, o menu, o topo e o corpo da pgina.
Insere um fragmento de tela dentro de uma pgina. Essa tag muito utilizada
quando o cdigo fonte de uma pgina fica muito extenso. Esse cdigo pode ser
separado em vrios arquivos, o que facilita a manuteno.
Define o contedo de uma rea criada no template como ui:insert.
Rosiclia Frasson
117
construo de pginas com templates
As aplicaes, em sua grande maioria, possuem um modelo padro para as pginas. O
menu, o cabealho e o rodap tendem a ter a mesma estrutura no aplicativo inteiro. Codificar
estes componentes em todas as pginas torna difcil a manuteno das mesmas. O suporte a
padro que pode ser

Na padronizao das telas com o uso do facelets possvel construir uma estrutura fixa
drstica na quantidade de cdigo e
consequente diminuio no tempo de desenvolvimento, a utilizao de facelets prov outras
vantagens. A principal delas que com a utilizao da tecnologia o cdigo a execuo do cdigo
e em pginas jsp. O facelets independente de servidor de
Para construir um template para uma aplicao, necessrio identificar um padro em um
se a montagem do esqueleto
utilizando trechos estticos e dinmicos. Vale ressaltar que um template nunca ser executado,
pois uma pgina incompleta, deste modo, importante que os templates sejam salvos dentro da
Em pginas que utilizam facelets necessrio importar o namespace de facelets:
demarca onde ser, por
Insere um fragmento de tela dentro de uma pgina. Essa tag muito utilizada
quando o cdigo fonte de uma pgina fica muito extenso. Esse cdigo pode ser
rquivos, o que facilita a manuteno.
Define o contedo de uma rea criada no template como ui:insert.
Captulo 11 - Facelets


ui:composition Define o relacionamento de composio entre a tela e o template.


PASSO-A-PASSO

Criao de um template

Como j mencionado um template nunca deve ser executado, pois trata
incompleta. Dessa forma recomendado que os templates fiquem dentra da pasta WEB
usurio no tenha acesso a mesma.
1. Aps a criao de um novo projeto, necessrio criar
INF. Dentro da pasta criada, necessrio um arquivo com extenso .xhtml. No caso ilustrado foi criado o
arquivo template.xhtml.
2. No template criado necessrio definir os trechos estticos e dinmicos. O
apresentado possui o trecho dinmico contedo e os trechos estticos: topo, menuLateral e rodap.

*+xml version#]'.-] encoding#]./F
*R?DA/S;E "tml ;.@6IA ,
,"ttp122333.34.org2/C2x"tml'2?/?2x"
*"tml xmlns#,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1ui#,"ttp122xmlns.jcp.org2js&2&acelets,
xmlns1"#,"ttp122xmlns.jcp.org2js&2"tml,8

*"1"ead8

*2"1"ead8

*"1body8

*div id#,topo,8
/opo
*2div8

*div id#,conteudo,8
Define o relacionamento de composio entre a tela e o template.
o um template nunca deve ser executado, pois trata
incompleta. Dessa forma recomendado que os templates fiquem dentra da pasta WEB
usurio no tenha acesso a mesma.
1. Aps a criao de um novo projeto, necessrio criar uma pasta templates dentro do diretrio WEB
INF. Dentro da pasta criada, necessrio um arquivo com extenso .xhtml. No caso ilustrado foi criado o



2. No template criado necessrio definir os trechos estticos e dinmicos. O
apresentado possui o trecho dinmico contedo e os trechos estticos: topo, menuLateral e rodap.
*+xml version#]'.-] encoding#]./F9B] +8
*R?DA/S;E "tml ;.@6IA ,922Q4A22?/? 5:/!6 '.- /ransitional22E$,
,"ttp122333.34.org2/C2x"tml'2?/?2x"tml'9transitional.dtd,8
*"tml xmlns#,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1ui#,"ttp122xmlns.jcp.org2js&2&acelets,
xmlns1"#,"ttp122xmlns.jcp.org2js&2"tml,8
*div id#,topo,8
*div id#,conteudo,8
Rosiclia Frasson
118
Define o relacionamento de composio entre a tela e o template.
o um template nunca deve ser executado, pois trata-se de uma pgina
incompleta. Dessa forma recomendado que os templates fiquem dentra da pasta WEB-INF para que o
uma pasta templates dentro do diretrio WEB-
INF. Dentro da pasta criada, necessrio um arquivo com extenso .xhtml. No caso ilustrado foi criado o
2. No template criado necessrio definir os trechos estticos e dinmicos. O trecho de cdigo
apresentado possui o trecho dinmico contedo e os trechos estticos: topo, menuLateral e rodap.
22Q4A22?/? 5:/!6 '.- /ransitional22E$,
Captulo 11 - Facelets


*ui1insert name#,conteudo,8Aontecdo*2ui1insert8
*2div8

*div id#,menu6ateral,8
!enu 6ateral
*2div8

*div id#,rodape,8
CodapT
*2div8

*2"1body8

*2"tml8

3. Na utilizao deste template, importante definir o que ser colocado no template nos trechos
dinmicos. Neste caso o nico trecho dinmico o contedo. Portanto a pgina index, cujo cdigo est
mostrado a seguir possui apenas a definio do contedo, o
os que foram definidos no template.

*ui1composition xmlns1ui#,"ttp122java.sun.com2js&2&acelets,
template#,.2QE@
xmlns #,"ttp122333.34.org2'ZZZ2x"tml,8

*ui1de&ine name#,conteudo,8
;Ngina inicial
*2ui1de&ine8

*2ui1composition8

4. Ao executar a pgina index do projeto, deve ser exibida uma pgina semelhante a imagem a seguir.

importante perceber que a pgina exibida possui trechos definid
index.

*ui1insert name#,conteudo,8Aontecdo*2ui1insert8
*div id#,menu6ateral,8
!enu 6ateral
*div id#,rodape,8
Na utilizao deste template, importante definir o que ser colocado no template nos trechos
dinmicos. Neste caso o nico trecho dinmico o contedo. Portanto a pgina index, cujo cdigo est
mostrado a seguir possui apenas a definio do contedo, o menu, rodap e cabealho exibidos sero
os que foram definidos no template.
*ui1composition xmlns1ui#,"ttp122java.sun.com2js&2&acelets,
template#,.2QE@9I$F2templates2template.x"tml,
xmlns #,"ttp122333.34.org2'ZZZ2x"tml,8
*ui1de&ine name#,conteudo,8
;Ngina inicial
*2ui1de&ine8
*2ui1composition8
4. Ao executar a pgina index do projeto, deve ser exibida uma pgina semelhante a imagem a seguir.
importante perceber que a pgina exibida possui trechos definidos no template e na pgina
Rosiclia Frasson
119
Na utilizao deste template, importante definir o que ser colocado no template nos trechos
dinmicos. Neste caso o nico trecho dinmico o contedo. Portanto a pgina index, cujo cdigo est
menu, rodap e cabealho exibidos sero
*ui1composition xmlns1ui#,"ttp122java.sun.com2js&2&acelets,
I$F2templates2template.x"tml,
4. Ao executar a pgina index do projeto, deve ser exibida uma pgina semelhante a imagem a seguir.

os no template e na pgina
Captulo 11 - Facelets


5. O posicionamento de cada trecho deve ser feito utilizando CSS.



6. Para simplificar a construo das pginas, tambm possvel que as mesmas sejam divididas. No
exemplo mostrado o menu poderia ser criado em uma pgina distinta e incluso no template.

*ui1composition xmlns1ui#,"ttp122java.sun.com2js&2&acelet
5. O posicionamento de cada trecho deve ser feito utilizando CSS.
^topo {
position1 relative;
bac%ground9color1 ^-4=&ab;
padding1 Ipx;
margin1 -px -px '-px -px;


^rodape {
position1 relative;
bac%ground9color1 ^c0d&e&;
padding1 Ipx;
margin1 '-px -px -px -px;


^menu6ateral {
&loat1 le&t;
bac%ground9color1 ^ece4aI;
padding1 Ipx;
3idt"1 'I-px;


^conteudo {
&loat1 rig"t;
bac%ground9color1 ^cc&&cc;
padding1 Ipx;
3idt"1 UI-px;

6. Para simplificar a construo das pginas, tambm possvel que as mesmas sejam divididas. No
exemplo mostrado o menu poderia ser criado em uma pgina distinta e incluso no template.
*ui1composition xmlns1ui#,"ttp122java.sun.com2js&2&acelet
Rosiclia Frasson
120

6. Para simplificar a construo das pginas, tambm possvel que as mesmas sejam divididas. No
exemplo mostrado o menu poderia ser criado em uma pgina distinta e incluso no template.
*ui1composition xmlns1ui#,"ttp122java.sun.com2js&2&acelets,
Captulo 11 - Facelets


xmlns #,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122xmlns.jcp.org2js&2"tml,8

*"1&orm8
*ul8
*li8Aadastro*2li8
*li8Celatario*2li8
*2ul8

*2"1&orm8

*2ui1composition8

7. Na pgina onde o menu deve ser incluso, neste caso, o template, deve ser adicionado o comando a
seguir.



xmlns #,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122xmlns.jcp.org2js&2"tml,8
*"1&orm8
*ul8
*li8Aadastro*2li8
*li8Celatario*2li8
*2ul8
*2"1&orm8
*2ui1composition8
pgina onde o menu deve ser incluso, neste caso, o template, deve ser adicionado o comando a
*div id#,menu6ateral,8
*ui1include src#,menu.x"tml,28
*2div8
Rosiclia Frasson
121
pgina onde o menu deve ser incluso, neste caso, o template, deve ser adicionado o comando a

Captulo 12 - Filtros Rosiclia Frasson

122

Filtros

Lanados na especificao Servlet 2.3, os filtros so classes que permitem que cdigos
sejam executados antes da requisio e depois que a resposta gerada, ou seja, eles permitem
que os objetos HTTPServletRequest e HTTPServletResponse sejam acessados antes dos
servlets. Os filtros interceptam requisies e respostas, sendo totalmente transparentes para os
clientes e para os servlets.
A nvel de implementao um filtro uma classe Java que implementa a interface
javax.servlet.Filter.

public class G;EFilter implements Filter{

A interface Filter exige a implementao de trs mtodos: init, destroy e doFilter.

@Dverride
public void init(FilterAon&ig &ilterAon&ig) t"ro3s ServletException {


@Dverride
public void doFilter(ServletCe<uest re<uestJ ServletCesponse responseJ FilterA"ain c"ain) t"ro3s
IDExceptionJ ServletException {


@Dverride
public void destroy() {


init: mtodo executado quando o filtro carregado pelo container. Como parmetro
passado um FilterConfig. Um objeto FilterConfig representa a configurao para o filtro.
Desse objeto possvel obter o nome do filtro, os parmetros de inicializao e o
ServletContext.
destroy: mtodo executado quando o filtro descarregado no container. Este mtodo avisa
o filtro que ele est sendo desativado, para que o mesmo possa liberar eventuais recursos
da memria.
doFilter: mtodo que executa a filtragem. O mtodo doFilter recebe trs parmetros:
ServletRequest, ServletResponse e FilterChain. Os objetos ServletRequest e
ServletResponse so os mesmos que sero passados a um servlet.


No interessante que um filtro processe toda a requisio. A grande utilidade dos filtros
a interceptao de vrios requests semelhantes, sendo assim, os filtros so interessantes para
encapsular tarefas recorrentes. Cada filtro encapsula apenas uma responsabilidade. Porm, eles
podem ser concatenados ou encadeados para permitir que uma requisio passe por mais de um
filtro.
O objeto FilterChain utilizado pelo Filter para executar o prximo filtro, ou, se este for o
ltimo, indicar ao container que este deve seguir seu processamento. Sendo assim, os comandos
Captulo 12 - Filtros Rosiclia Frasson

123

colocados antes da chamada chain.doFilter so executados na ida e os comandos colocados
aps so executados na volta.

c"ain.doFilter(re<uestJ response);

importante ressaltar que em todas as requisies feitas ao container verificado se
existe um filtro associado ao recurso solicitado. Em caso afirmativo, a requisio redirecionada
para o filtro. Este por sua vez executa os seus comandos e aps permite que o processamento
normal do request prossiga. Os filtros tambm podem ser utilizados para tomada de decises, ou
seja, eles podem decidir se uma requisio executada ou se interrompem o caminho normal da
requisio.
O uso de filtros permite que informaes sejam armazenadas na requisio. Para efetuar
este armazenamento utilizado o mtodo setAttribute no request. O mtodo setAttribute necessita
de uma identificao para o objeto que est sendo armazenado na requisio e o objeto que deve
ser guardado. Para acessar este objeto utilizado o mtodo getAttribute.

re<uest.setEttribute(,Entity!anager,J manager);

Para funcionar os filtros devem ser registrados. Esse registro pode ser feito no web.xml ou
atravs de anotao. A seguir est sendo demonstrado como registrar um filtro atravs de
anotao. O atributo servletNames define os servlets que sero filtrados pelo filtro.

@QebFilter(servlet$ames # ,Faces Servlet,)


PASSO-A-PASSO

Conexo com banco de dados com Filter

A inicializao e finalizao de uma unidade de persistncia deve ser efetuada apenas uma
vez durante a execuo da aplicao. Como j mencionado, os filtros possuem esta caracterstica.
Eles so carregados quando a aplicao executada e destrudos quando a aplicao
finalizada. Sendo assim, ser demonstrado a utilizao de um filtro para a criao da fbrica de
conexo e controle das transaes com a base de dados.

1. Aps criar um novo projeto, o primeiro passo a criao da unidade de persistncia. No
Netbeans possvel a criao de uma unidade de persistncia de forma automtica como
mostrado no captulo 1. O cdigo da unidade de persistncia deve ficar similar ao cdigo abaixo.

*+xml version#,'.-, encoding#,./F9B,+8
*persistence version#,0.-, xmlns#,"ttp122java.sun.com2xml2ns2persistence,
xmlns1xsi#,"ttp122333.34.org20--'25!6Sc"ema9instance,
xsi1sc"ema6ocation#,"ttp122java.sun.com2xml2ns2persistence
"ttp122java.sun.com2xml2ns2persistence2persistence707-.xsd,8
*persistence9unit name#,Aap''Aonexao@ancoFiltro;., transaction9
Captulo 12 - Filtros Rosiclia Frasson

124

type#,CESD.CAE76DAE6,8
*provider8org."ibernate.ejb.:ibernate;ersistence*2provider8
*properties8
*property name#,"ibernate."bm0ddl.auto,
value#,update,28
*property name #,"ibernate.dialect,
value #,org."ibernate.dialect.!ySF6?ialect,28
*property name #,javax.persistence.jdbc.driver,
value #,com.mys<l.jdbc.?river,28
*property name #,javax.persistence.jdbc.user,
value #,root,28
*property name #,javax.persistence.jdbc.pass3ord,
value #,,28
*property name #,javax.persistence.jdbc.url,
value #,jdbc1mys<l122local"ost144-=2Aap'0Aonexao@ancoFiltro,28
*2properties8
*2persistence9unit8
*2persistence8

2. Com o persistence.xml criado, necessrio criar uma classe, neste exemplo, com o nome de
JPAFilter dentro do pacote filter. Essa classe deve implementar a interface javax.servlet.Filter.

import javax.servlet.Filter;
public class G;EFilter implements Filter{


3. A interface Filter exige que sejam implementados os mtodos init, destroy e doFilter.

@Dverride
public void init(FilterAon&ig &ilterAon&ig) t"ro3s ServletException {


@Dverride
public void doFilter(ServletCe<uest re<uestJ ServletCesponse responseJ FilterA"ain c"ain) t"ro3s
IDExceptionJ ServletException {


@Dverride
public void destroy() {


4. A classe EntityManagerFactory descobre quem cria as conexes e necessrio uma varivel
para armazenar uma instncia da mesma.

private Entity!anagerFactory &actory;

5. Para obter uma instncia de EntityManagerFactory utilizado o mtodo
Captulo 12 - Filtros Rosiclia Frasson

125

createEntityManagerFactory indicando qual a persistence-unit que foi definida no
persistence.xml, no nosso caso Cap11ConexaoBancoFiltro. Esse procedimento feito no mtodo
init.

public void init(FilterAon&ig &ilterAon&ig) t"ro3s ServletException {
t"is.&actory # ;ersistence.createEntity!anagerFactory(,Aap''Aonexao@ancoFiltro;.,);


6. O mtodo destroy responsvel por destruir a instncia de EntityManagerFactory.

public void destroy() {
t"is.&actory.close();


7. O mtodo doFilter abre a conexo, armazena o gerenciador de entidades no request, inicializa
os recursos da transao com o mtodo begin. O mtodo commit confirma a transao caso no
ocorra algum erro ou rollback caso algum erro ocorrer.

public void doFilter(ServletCe<uest re<uestJ ServletCesponse responseJ FilterA"ain c"ain) t"ro3s
IDExceptionJ ServletException {
Entity!anager manager # t"is.&actory.createEntity!anager();
re<uest.setEttribute(,Entity!anager,J manager);
manager.get/ransaction().begin();
c"ain.doFilter(re<uestJ response);

try {
manager.get/ransaction().commit();
catc" (Exception e) {
manager.get/ransaction().rollbac%();
&inally {
manager.close();



8. Para funcionar, o filtro tem que ser registrado. A anotao exibida a seguir indica que o filtro
ser aplicado no Faces Servlet, que o servlet do JSF.

@QebFilter(servlet$ames # ,Faces Servlet,)

9. Com o intuito de testar o filtro, ser construda a aplicao completa. Sendo assim, o prximo
passo criar os beans da aplicao. Neste caso, ser simulado um software para utilizao de um
rh para controle dos funcionrios. Os beans j esto com as anotaes da JPA.

pac%age br.com.rosicleia&rasson.cap'0conexaobanco&iltro.model;

import javax.persistence.Entity;
Captulo 12 - Filtros Rosiclia Frasson

126

import javax.persistence.(enerated)alue;
import javax.persistence.Id;
import javax.persistence.6ob;

@Entity
public class Aargo {

@Id
@(enerated)alue
private int codigo;
private String nome;
@6ob
private String descricao;
22(ets e sets


pac%age br.com.rosicleia&rasson.cap''conexaobanco&iltro.model;

import javax.persistence.Entity;
import javax.persistence.(enerated)alue;
import javax.persistence.Id;

@Entity
public class Endereco {

@Id
@(enerated)alue
private int codigo;
private String endereco;
private String bairro;
private String cidade;
private String estado;
private int numero;
private String complemento;
22(ets e sets


pac%age br.com.rosicleia&rasson.cap''conexaobanco&iltro.model;

import java.util.?ate;
import javax.persistence.Aascade/ype;
import javax.persistence.Aolumn;
import javax.persistence.Entity;
import javax.persistence.(enerated)alue;
import javax.persistence.Id;
import javax.persistence.!any/oDne;
import javax.persistence.Dne/oDne;
import javax.persistence./emporal;
import javax.persistence./emporal/ype;

Captulo 12 - Filtros Rosiclia Frasson

127

@Entity
public class Funcionario {

@Id
@(enerated)alue
private int codigo;
private String nome;
private String cp&;
@/emporal(/emporal/ype.?E/E)
private ?ate data$ascimento;
@!any/oDne
private Aargo cargo;
private String tele&one;
private String email;
@Dne/oDne(cascade # Aascade/ype.E66)
private Endereco endereco;

public Funcionario() {
endereco # ne3 Endereco();

22(ets e sets


10. A camada de persistncia ser construda utilizando um DAO genrico. Dessa forma deve
conter uma interface com todos os mtodos comuns e a implementao desta. importante
perceber que diferente do CRUD apresentado no captulo 2, com a utilizao de filtros a classe
DAOJPA no possui os comandos referentes ao controle de transaes. Este controle est
implementado no JPAFilter.
Tambm no necessria a criao de uma classe para servir como fbrica de EntityManager,
esta fbrica tambm est embutida no JPAFilter.

pac%age br.com.rosicleia&rasson.cap''conexaobanco&iltro.model.persistencia.dao;

import java.io.Seriali>able;
import java.util.6ist;

public inter&ace ?ED*/J I extends Seriali>able8 {

void save(/ entity);

void remove(Alass*/8 classeJ I p%);

/ get@yId(Alass*/8 classeJ I p%);

6ist*/8 getEll(Alass*/8 classe);


pac%age br.com.rosicleia&rasson.cap''conexaobanco&iltro.model.persistencia;

Captulo 12 - Filtros Rosiclia Frasson

128

import br.com.rosicleia&rasson.cap''conexaobanco&iltro.model.persistencia.dao.?ED;
import java.io.Seriali>able;
import java.util.6ist;
import javax.persistence.Entity!anager;
import javax.persistence.$oCesultException;
import javax.persistence.Fuery;

public class ?EDG;E*/J I extends Seriali>able8 implements ?ED*/J I8 {

private Entity!anager manager;

public ?EDG;E(Entity!anager manager) {
t"is.manager # manager;


@Dverride
public void save(/ entity) {
t"is.manager.merge(entity);


@Dverride
public void remove(Alass*/8 classeJ I p%) {
/ entity # t"is.get@yId(classeJ p%);
t"is.manager.remove(entity);


@Dverride
public / get@yId(Alass*/8 classeJ I p%) {
try {
return t"is.manager.&ind(classeJ p%);
catc" ($oCesultException e) {
return null;



@Dverride
public 6ist*/8 getEll(Alass*/8 classe) {
Fuery < # t"is.manager.createFuery(,select x &rom ,
M classe.getSimple$ame() M , x,);
return <.getCesult6ist();



11. Para que as entidades possam utilizar o DAO genrico, necessrio criar a interface e sua
implementao para cada uma delas.

pac%age br.com.rosicleia&rasson.cap''conexaobanco&iltro.model.persistencia.dao;

import br.com.rosicleia&rasson.cap''conexaobanco&iltro.model.Aargo;

public inter&ace Aargo?ED extends ?ED*AargoJ Integer8{
Captulo 12 - Filtros Rosiclia Frasson

129




pac%age br.com.rosicleia&rasson.cap''conexaobanco&iltro.model.persistencia;

import br.com.rosicleia&rasson.cap''conexaobanco&iltro.model.Aargo;
import br.com.rosicleia&rasson.cap''conexaobanco&iltro.model.persistencia.dao.Aargo?ED;
import javax.persistence.Entity!anager;

public class Aargo?EDG;E extends ?EDG;E*AargoJ Integer8 implements Aargo?ED {

public Aargo?EDG;E(Entity!anager manager) {
super(manager);



pac%age br.com.rosicleia&rasson.cap''conexaobanco&iltro.model.persistencia.dao;

import br.com.rosicleia&rasson.cap''conexaobanco&iltro.model.Endereco;

public inter&ace Endereco?ED extends ?ED*EnderecoJ Integer8{



pac%age br.com.rosicleia&rasson.cap''conexaobanco&iltro.model.persistencia;

import br.com.rosicleia&rasson.cap''conexaobanco&iltro.model.Endereco;
import br.com.rosicleia&rasson.cap''conexaobanco&iltro.model.persistencia.dao.Endereco?ED;
import javax.persistence.Entity!anager;

public class Endereco?EDG;E extends ?EDG;E*EnderecoJ Integer8 implements Endereco?ED {

public Endereco?EDG;E(Entity!anager manager) {
super(manager);



pac%age br.com.rosicleia&rasson.cap''conexaobanco&iltro.model.persistencia.dao;

import br.com.rosicleia&rasson.cap''conexaobanco&iltro.model.Funcionario;

public inter&ace Funcionario?ED extends ?ED*FuncionarioJ Integer8{


pac%age br.com.rosicleia&rasson.cap''conexaobanco&iltro.model.persistencia;

Captulo 12 - Filtros Rosiclia Frasson

130

import br.com.rosicleia&rasson.cap''conexaobanco&iltro.model.Funcionario;
import br.com.rosicleia&rasson.cap''conexaobanco&iltro.model.persistencia.dao.Funcionario?ED;
import javax.persistence.Entity!anager;

public class Funcionario?EDG;E extends ?EDG;E*FuncionarioJ Integer8 implements Funcionario?ED {

public Funcionario?EDG;E(Entity!anager manager) {
super(manager);



12. Aps a construo da camada de persistncia, necessria a construo dos managed beans
para interagir com as telas da aplicao. Segue o cdigo da classe CargoBean.

pac%age br.com.rosicleia&rasson.cap'0conexaobanco&iltro.controller;

import br.com.rosicleia&rasson.cap'0conexaobanco&iltro.model.Aargo;
import br.com.rosicleia&rasson.cap'0conexaobanco&iltro.model.persistencia.Aargo?EDG;E;
import br.com.rosicleia&rasson.cap'0conexaobanco&iltro.model.persistencia.dao.Aargo?ED;
import java.util.6ist;
import javax.&aces.bean.!anaged@ean;
import javax.&aces.context.ExternalAontext;
import javax.&aces.context.FacesAontext;
import javax.persistence.Entity!anager;
import javax.servlet."ttp.:ttpServletCe<uest;

@!anaged@ean
public class Aargo@ean {

private Aargo cargo;
private 6ist*Aargo8 listaAargos;

public Aargo@ean() {
cargo # ne3 Aargo();


public String insere() {
Entity!anager manager # t"is.get!anager();
Aargo?ED dao # ne3 Aargo?EDG;E(manager);
dao.save(cargo);
t"is.cargo # ne3 Aargo();
t"is.listaAargos # null;
return ,2paginas2lista9cargos.x"tml,;


public String preparaElteracao() {
Entity!anager manager # t"is.get!anager();
Aargo?ED dao # ne3 Aargo?EDG;E(manager);
t"is.cargo # dao.get@yId(Aargo.classJ cargo.getAodigo());
return ,2paginas2cargo.x"tml,;

Captulo 12 - Filtros Rosiclia Frasson

131


public void remove() {
Entity!anager manager # t"is.get!anager();
Aargo?ED dao # ne3 Aargo?EDG;E(manager);
dao.remove(Aargo.classJ cargo.getAodigo());
t"is.listaAargos # null;


private Entity!anager get!anager() {
FacesAontext &c # FacesAontext.getAurrentInstance();
ExternalAontext ec # &c.getExternalAontext();
:ttpServletCe<uest re<uest # (:ttpServletCe<uest) ec.getCe<uest();
return (Entity!anager) re<uest.getEttribute(,Entity!anager,);


public Aargo getAargo() {
return cargo;


public void setAargo(Aargo cargo) {
t"is.cargo # cargo;


public 6ist*Aargo8 get6istaAargos() {
i& (t"is.listaAargos ## null) {
Entity!anager manager # t"is.get!anager();
Aargo?ED dao # ne3 Aargo?EDG;E(manager);
t"is.listaAargos # dao.getEll(Aargo.class);

return listaAargos;



13. Na classe FuncionarioBean exibida a seguir, importante perceber que efetuada uma busca
na base de dados para que o cargo escolhido seja atribudo ao funcionrio. Uma alternativa a
essa busca seria a criao de um conversor da classe Cargo.

pac%age br.com.rosicleia&rasson.cap'0conexaobanco&iltro.controller;

import br.com.rosicleia&rasson.cap'0conexaobanco&iltro.model.Aargo;
import br.com.rosicleia&rasson.cap'0conexaobanco&iltro.model.Funcionario;
import br.com.rosicleia&rasson.cap'0conexaobanco&iltro.model.persistencia.Aargo?EDG;E;
import br.com.rosicleia&rasson.cap'0conexaobanco&iltro.model.persistencia.Funcionario?EDG;E;
import br.com.rosicleia&rasson.cap'0conexaobancmodel.persistencia.dao.Aargo?ED;
import br.com.rosicleia&rasson.cap'0conexaobanco&iltro.model.persistencia.dao.Funcionario?ED;
import java.util.6ist;
import javax.&aces.bean.!anaged@ean;
import javax.&aces.context.ExternalAontext;
import javax.&aces.context.FacesAontext;
import javax.persistence.Entity!anager;
import javax.servlet."ttp.:ttpServletCe<uest;
Captulo 12 - Filtros Rosiclia Frasson

132


@!anaged@ean
public class Funcionario@ean {

private Funcionario &uncionario;
private 6ist*Funcionario8 listaFuncionarios;
private int cargoId;

public Funcionario@ean() {
&uncionario # ne3 Funcionario();


public String insere() {
Entity!anager manager # t"is.get!anager();
Aargo?ED cargo?ao # ne3 Aargo?EDG;E(manager);
Funcionario?ED dao # ne3 Funcionario?EDG;E(manager);

i& (t"is.cargoId R# -) {
Aargo cargo # cargo?ao.get@yId(Aargo.classJ cargoId);
t"is.&uncionario.setAargo(cargo);


dao.save(&uncionario);
&uncionario # ne3 Funcionario();
t"is.listaFuncionarios # null;
return ,2paginas2lista9&uncionarios.x"tml,;


public String preparaElteracao() {
Entity!anager manager # t"is.get!anager();
Funcionario?ED dao # ne3 Funcionario?EDG;E(manager);
t"is.&uncionario # dao.get@yId(Funcionario.classJ &uncionario.getAodigo());
return ,2paginas2&uncionario.x"tml,;


public void remove() {
Entity!anager manager # t"is.get!anager();
Funcionario?ED dao # ne3 Funcionario?EDG;E(manager);
dao.remove(Funcionario.classJ &uncionario.getAodigo());


private Entity!anager get!anager() {
FacesAontext &c # FacesAontext.getAurrentInstance();
ExternalAontext ec # &c.getExternalAontext();
:ttpServletCe<uest re<uest # (:ttpServletCe<uest) ec.getCe<uest();
return (Entity!anager) re<uest.getEttribute(,Entity!anager,);


public Funcionario getFuncionario() {
return &uncionario;


public void setFuncionario(Funcionario &uncionario) {
Captulo 12 - Filtros


t"is.&uncionario # &uncionario;


public int getAargoId() {
return cargoId;


public void setAargoId(int cargoId) {
t"is.cargoId # cargoId;


public 6ist*Funcionario8 get6istaFuncionarios() {
i& (t"is.listaFuncionarios ##
Entity!anager manager # t"is.get!anager();
Funcionario?ED dao # ne3 Funcionario?EDG;E(manager);
t"is.listaFuncionarios # dao.getEll(Funcionario.class);

return listaFuncionarios;



14. Dentro da pasta Pginas Web necessrio criar a seguinte estrutura de pastas.

15. A camada de visualizao do aplicativo deve ser iniciada com a criao do arquivo template. A
estrutura das pginas da aplicao deve ser similar a imagem seguinte.

Sendo assim, o template deve possuir os blocos estticos cabealho, menu lateral e rodap e o
# &uncionario;
public void setAargoId(int cargoId) {
public 6ist*Funcionario8 get6istaFuncionarios() {
i& (t"is.listaFuncionarios ## null) {
Entity!anager manager # t"is.get!anager();
Funcionario?ED dao # ne3 Funcionario?EDG;E(manager);
t"is.listaFuncionarios # dao.getEll(Funcionario.class);
ntro da pasta Pginas Web necessrio criar a seguinte estrutura de pastas.

15. A camada de visualizao do aplicativo deve ser iniciada com a criao do arquivo template. A
estrutura das pginas da aplicao deve ser similar a imagem seguinte.

o assim, o template deve possuir os blocos estticos cabealho, menu lateral e rodap e o
Rosiclia Frasson
133
ntro da pasta Pginas Web necessrio criar a seguinte estrutura de pastas.
15. A camada de visualizao do aplicativo deve ser iniciada com a criao do arquivo template. A
o assim, o template deve possuir os blocos estticos cabealho, menu lateral e rodap e o
Captulo 12 - Filtros Rosiclia Frasson

134

bloco dinmico contedo. Por questes de organizao e para facilitar uma posterior manuteno
o menu lateral ser codificado em uma pgina distinta e incluso no template. A seguir constam os
cdigos do template, menu e da pgina index.

*+xml version#]'.-] encoding#]./F9B] +8
*R?DA/S;E "tml ;.@6IA ,922Q4A22?/? 5:/!6 '.- /ransitional22E$,
,"ttp122333.34.org2/C2x"tml'2?/?2x"tml'9transitional.dtd,8
*"tml xmlns#,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122xmlns.jcp.org2js&2"tml,
xmlns1ui#,"ttp122xmlns.jcp.org2js&2&acelets,8

*"1"ead8
*title8(estHo de Cecursos :umanos*2title8
*"1outputStyles"eet library#,css, name#,style.css,28
*2"1"ead8

*"1body8

*div id#,cabecal"o,8
*"'8(estHo de Cecursos :umanos*2"'8
*p8)ersHo '.-*2p8
*2div8

*div id#,pagina,8

*div id#,conteudo,8
*ui1insert name#,conteudo,8
*2ui1insert8
*2div8

*div id#,menu6ateral,8
*ui1include src#,..2menu.x"tml,8
*2ui1include8
*2div8

*2div8


*div style#,clear1bot",8knbsp;*2div8

*div id#,rodape,8
*p8kcopy;0-'U Ell Cig"ts Ceserved knbsp;kbull;knbsp; CosiclTia Frasson*2p8
*2div8

*2"1body8

*2"tml8

* *ui1composition xmlns1ui#,"ttp122xmlns.jcp.org2js&2&acelets,
xmlns #,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122xmlns.jcp.org2js&2"tml,8
Captulo 12 - Filtros Rosiclia Frasson

135


!enu

*2ui1composition8

*ui1composition xmlns1ui#,"ttp122xmlns.jcp.org2js&2&acelets,
template#,.2QE@9I$F2templates2template.x"tml,
xmlns #,"ttp122333.34.org2'ZZZ2x"tml,8

*ui1de&ine name#,conteudo,8
;Ngina inicial
*2ui1de&ine8

*2ui1composition8

16. Executando o projeto deve ser exibida uma pgina similar a imagem a seguir.


17. Para melhorar o aspecto da pgina sero inclusas algumas regras no arquivo style.css.

body{
margin1 -;
padding1 -;
bac%ground1 ^F=F=F=;
&ont9si>e1 'Upx;
text9align1 justi&y;


body inputJ textareaJ selectJ option{
&ont9&amily1 ErialJ :elveticaJ sans9seri&;
color1 ^B4B0=E;
&ont9si>e1 '0px;
Captulo 12 - Filtros Rosiclia Frasson

136



body input{
3idt"1 0--px;


"'J "0J "4{
&ont9&amily1 ErialJ :elveticaJ sans9seri&;
&ont93eig"t1 normal;
color1 ^======;


"' {
letter9spacing1 90px;
&ont9si>e1 4em;


pJul{
line9"eig"t1 0--V;


a{
color1 ^4U@E-';


a1"over{
color1 ^4U@E-';


^cabecal"o{
3idt"1 Z0-px;
"eig"t1 '--px;
margin1 - auto;


^cabecal"o "'J p{
margin1 -;
padding1 -;


^cabecal"o "'{
&ont9si>e1 I0px;
color1 ^0-E--';


^cabecal"o p{
margin9top1 9'Ipx;
padding1 -px -px -px Upx;
&ont9si>e1 0-px;
&ont93eig"t1 normal;
color1 ^B=EE==;
text9trans&orm1 lo3ercase;

Captulo 12 - Filtros Rosiclia Frasson

137


^pagina{
3idt"1 Z0-px;
margin1 - auto;
bac%ground1 ^&&&&&&;
border9radius1 '-px;
box9s"ado31 -px -px '-px ^cccccc;
position1 relative;


^conteudo{
3idt"1 ==-px;
margin1 -;
color1 ^======;
&loat1 rig"t;


^menu6ateral{
bac%ground1 ^B=EE==;
3idt"1 0--px;
color1 ^FFFFFF;
border9radius1 '-px - - '-px;
border1 '-px solid ^&&&&&&;


^rodape{
3idt"1 B--px;
margin1 - auto;
"eig"t1 I-px;
text9align1 center;
&ont9si>e1 ''px;
&ont9&amily1 ErialJ :elveticaJ sans9seri&;
color1 ^B=EE==;
margin9bottom1 0_px;


18. Ao executar a aplicao possvel perceber que o aspecto da pgina melhorou
consideravelmente.


19. O prximo passo implementar o menu. Seguem os comandos do arquivo menu.xhtml e as
Captulo 12 - Filtros Rosiclia Frasson

138

regras de estilo aplicadas ao menu.

*ui1composition xmlns1ui#,"ttp122java.sun.com2js&2&acelets,
xmlns #,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122xmlns.jcp.org2js&2"tml,8

*"1&orm8

*ul8

*li8
*"08Aadastros*2"08
*ul8
*li8*"1command6in% value#,Aargo,
action#,2&aces2paginas2cargo.x"tml,28*2li8
*li8*"1command6in% value#,FuncionNrio,
action#,2&aces2paginas2&uncionario.x"tml,28*2li8
*2ul8
*2li8

*li8
*"086istagens*2"08
*ul8
*li8*"1command6in% value#,Aargo,
action#,2&aces2paginas2lista9cargos.x"tml,28*2li8
*li8*"1command6in% value#,FuncionNrio,
action#,2&aces2paginas2lista9&uncionarios.x"tml,28*2li8
*2ul8
*2li8

*li8
*"08Celatarios*2"08
*ul8
*li8*"1command6in% value#,Aargo, 28*2li8
*li8*"1command6in% value#,FuncionNrio, 28*2li8
*2ul8
*2li8

*2ul8

*2"1&orm8

*2ui1composition8

^menu6ateral ul{
margin1 '-px;
padding1 -;
list9style1 none;


^menu6ateral li{
Captulo 12 - Filtros Rosiclia Frasson

139

margin1 -;
padding1 -;


^menu6ateral li ul{
margin9bottom1 U-px;
padding1 - 'Ipx;


^menu6ateral li ul li{
margin1 -;
padding1 -;
line9"eig"t1 4Ipx;
border9bottom1 'px ^E4F4BZ das"ed;


^menu6ateral "0{
3idt"1 'B-px;
"eig"t1 40px;
padding9le&t1 '-px;
bac%ground9image1 93eb%it9gradient(linearJle&t topJle&t bottomJ color9stop(-J ^'?Z@-')Jcolor9stop('J
^4I@E-'));
bac%ground9image1 9o9linear9gradient(bottomJ ^'?Z@-' -VJ ^4I@E-' '--V);
bac%ground9image1 9mo>9linear9gradient(bottomJ ^'?Z@-' -VJ ^4I@E-' '--V);
bac%ground9image1 93eb%it9linear9gradient(bottomJ ^'?Z@-' -VJ ^4I@E-' '--V);
bac%ground9image1 9ms9linear9gradient(bottomJ ^'?Z@-' -VJ ^4I@E-' '--V);
bac%ground9image1 linear9gradient(to bottomJ ^'?Z@-' -VJ ^4I@E-' '--V);
&ont9si>e1 'Bpx;
color1 ^FFFFFF;


^menu6ateral a{
text9decoration1 none;
color1 ^FFFFFF;
&ont93eig"t1 bold;


^menu6ateral a1"over{
text9decoration1 none;


20. Ao executar a aplicao, possvel observar o menu criado.
Captulo 12 - Filtros Rosiclia Frasson

140



21. Criado o menu, necessrio construir as pginas correspondentes a manuteno dos cargos
e funcionrios do aplicativo. Inicialmente ser construdo a pgina referente ao cadastro de cargo.
Segue o cdigo correspondente.

*ui1composition xmlns1ui#,"ttp122xmlns.jcp.org2js&2&acelets,
template#,..2QE@9I$F2templates2template.x"tml,
xmlns #,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122xmlns.jcp.org2js&2"tml,8

*ui1de&ine name#,conteudo,8
*"1&orm acceptc"arset#,ISD9BBIZ9',8

*"1messages errorStyle#,color1red, layout#,table,28

*"1input:idden value#,^{cargo@ean.cargo.codigo,28

*&ieldset8
*legend8Aadastro de Aargo*2legend8

*"1panel(rid columns#,4,8

*"1output6abel value#,$ome1 , &or#,nome,28
*"1input/ext id#,nome,
value#,^{cargo@ean.cargo.nome, si>e#,=4,
re<uired#,true,
re<uired!essage#,l necessNrio in&ormar o nome do cargo.,28
*"1message &or#,nome, errorStyle#,color1red; display1bloc%,28
Captulo 12 - Filtros Rosiclia Frasson

141


*"1output6abel value#,?escri`Ho1 , &or#,descricao,28
*"1input/extarea id#,descricao,
value#,^{cargo@ean.cargo.descricao,
cols#,I-, ro3s#,'-,28
*"1output6abel28

*2"1panel(rid8

*2&ieldset8

*br 28
*"1panel(roup8
*"1command@utton value#,Salvar,
action#,^{cargo@ean.insere, access%ey#,S,
styleAlass#,botao,28
*"1command@utton value#,Aancelar, type#,reset, styleAlass#,botao,28
*2"1panel(roup8

*2"1&orm8
*2ui1de&ine8

*2ui1composition8
.
22. Ao executar a aplicao e acessar o menu cadastro cargo deve ser exibido na rea reservada
ao contedo um formulrio similar ao apresentado na figura a seguir.



23. Com o intuito de melhorar a aparncia deste sero inclusas algumas regras CSS.

.botao{
bac%ground193eb%it9gradient( linearJ le&t topJ le&t bottomJ color9stop(-.-IJ ^'-Bc--)J color9stop('J
^4_b&-') );
Captulo 12 - Filtros Rosiclia Frasson

142

bac%ground19mo>9linear9gradient( center topJ ^'-Bc-- IVJ ^4_b&-' '--V );
&ilter1progid1?5Image/rans&orm.!icroso&t.gradient(startAolorstr#]^'-Bc--]J endAolorstr#]^4_b&-']);
bac%ground9color1^'-Bc--;
93eb%it9border9top9le&t9radius1=px;
9mo>9border9radius9tople&t1=px;
border9top9le&t9radius1=px;
93eb%it9border9top9rig"t9radius1=px;
9mo>9border9radius9toprig"t1=px;
border9top9rig"t9radius1=px;
93eb%it9border9bottom9rig"t9radius1=px;
9mo>9border9radius9bottomrig"t1=px;
border9bottom9rig"t9radius1=px;
93eb%it9border9bottom9le&t9radius1=px;
9mo>9border9radius9bottomle&t1=px;
border9bottom9le&t9radius1=px;
text9indent1-;
border1'px solid ^dcdcdc;
display1inline9bloc%;
color1^&&&&&&;
&ont9&amily1arial;
&ont9si>e1'4px;
&ont93eig"t1normal;
&ont9style1normal;
"eig"t14-px;
line9"eig"t1I-px;
3idt"1B-px;
text9decoration1none;
text9align1center;

.botao1"over {
bac%ground193eb%it9gradient( linearJ le&t topJ le&t bottomJ color9stop(-.-IJ ^4_b&-')J color9stop('J
^'-Bc--) );
bac%ground19mo>9linear9gradient( center topJ ^4_b&-' IVJ ^'-Bc-- '--V );
&ilter1progid1?5Image/rans&orm.!icroso&t.gradient(startAolorstr#]^4_b&-']J endAolorstr#]^'-Bc--]);
bac%ground9color1^4_b&-';


.botao1active {
position1relative;
top1'px;


^conteudo{
padding1 0-px;


&ieldset{
border9radius1 Ipx;


24. Ao executar a aplicao possvel perceber que o formulrio ficou com aspecto melhor.
Captulo 12 - Filtros Rosiclia Frasson

143



25. Neste momento, possvel testar se os dados inseridos no formulrio esto sendo persistidos
na base de dados.



26. Alm da insero, importante que os dados cadastrados possam ser visualizados no
aplicativo. Tambm so necessrias as opes de edio e remoo de dados cadastrados.
Neste exemplo, as funcionalidades citadas esto implementadas na pgina lista-cargos.
No cdigo a seguir merece destaque a tag f:setPropertyActionListener que passa a classe
CargoBean o cargo selecionado.

Captulo 12 - Filtros Rosiclia Frasson

144

*ui1composition xmlns1ui#,"ttp122xmlns.jcp.org2js&2&acelets,
template#,..2QE@9I$F2templates2template.x"tml,
xmlns #,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122xmlns.jcp.org2js&2"tml,
xmlns1&#,"ttp122xmlns.jcp.org2js&2core,8

*ui1de&ine name#,conteudo,8
*"1&orm acceptc"arset#,ISD9BBIZ9',8

*"1data/able value#,^{cargo@ean.listaAargos,
var#,cargo,
styleAlass#,tabela,
"eaderAlass#,cabecal"o,
cellpadding #,'-,8
*&1&acet name#,"eader,8
*"1output/ext value#,Aargos, 28
*2&1&acet8

*"1column8
*&1&acet name#,"eader,8
*"1output/ext value#,Aadigo, 28
*2&1&acet8
*"1output/ext value#,^{cargo.codigo,28
*2"1column8

*"1column8
*&1&acet name#,"eader,8
*"1output/ext value#,Aargo, 28
*2&1&acet8
*"1output/ext value#,^{cargo.nome,28
*2"1column8

*"1column8
*&1&acet name#,"eader,8
*"1command6in% action#,2&aces2paginas2cargo.x"tml,8
*"1grap"icImage library#,imagens, name#,add.png, 28
*2"1command6in%8
*2&1&acet8
*"1command6in%
action#,^{cargo@ean.preparaElteracao,8
*&1set;ropertyEction6istener value#,^{cargo,
target#,^{cargo@ean.cargo,28
*"1grap"icImage library#,imagens, name#,edit.png,28
*2"1command6in%8
*"1command6in%
action#,^{cargo@ean.remove,8
*&1set;ropertyEction6istener value#,^{cargo,
target#,^{cargo@ean.cargo,28
*"1grap"icImage library#,imagens, name#,delete.png,28
*2"1command6in%8
*2"1column8
*2"1data/able8

Captulo 12 - Filtros Rosiclia Frasson

145

*2"1&orm8
*2ui1de&ine8

*2ui1composition8

27. Para melhorar o aspecto da tabela devem ser inclusas algumas imagens - add, delete e edit -
e regras CSS para formatao da tabela.

.tabela{
margin1-px;padding1-px;
3idt"1'--V;
box9s"ado31 Ipx Ipx 0px ^BBBBBB;
border1'px solid ^4&_&--;


.tabela table{
border9collapse1 collapse;
border9spacing1 -;
3idt"1'--V;
"eig"t1'--V;
margin1-px;
padding1-px;



.tabela tr1nt"9c"ild(odd){
bac%ground9color1^dU&&aa;


.tabela tr1nt"9c"ild(even){
bac%ground9color1^&&&&&&;


.tabela td{
vertical9align1middle;
border1'px solid ^4&_&--;
border93idt"1-px 'px 'px -px;
text9align1center;
padding1_px;
&ont9si>e1'0px;
&ont9&amily1Erial;
&ont93eig"t1normal;
color1^------;


.tabela tr1last9c"ild td{
border93idt"1-px 'px -px -px;


.tabela tr td1last9c"ild{
border93idt"1-px -px 'px -px;
Captulo 12 - Filtros Rosiclia Frasson

146



.tabela tr1last9c"ild td1last9c"ild{
border93idt"1-px -px -px -px;


.tabela .cabecal"o{
bac%ground19o9linear9gradient(bottomJ ^I&b&-- IVJ ^4&_&-- '--V); bac%ground193eb%it9gradient(
linearJ le&t topJ le&t bottomJ color9stop(-.-IJ ^I&b&--)J color9stop('J ^4&_&--) );
bac%ground19mo>9linear9gradient( center topJ ^I&b&-- IVJ ^4&_&-- '--V );
&ilter1progid1?5Image/rans&orm.!icroso&t.gradient(startAolorstr#,^I&b&--,J endAolorstr#,^4&_&--,);
bac%ground1 9o9linear9gradient(topJ^I&b&--J4&_&--);
bac%ground9color1^I&b&--;
border1-px solid ^4&_&--;
text9align1center;
border93idt"1-px -px 'px 'px;
&ont9si>e1'Upx;
&ont9&amily1Erial;
&ont93eig"t1bold;
color1^&&&&&&;


.tabela tr1&irst9c"ild td1&irst9c"ild{
border93idt"1-px -px 'px -px;


.tabela tr1&irst9c"ild td1last9c"ild{
border93idt"1-px -px 'px 'px;


28. Ao executar a aplicao possvel verificar os cargos cadastrados e testar a edio e
remoo dos dados.


29. As telas de cadastro e listagem tambm devem ser codificadas para o funcionrio.

*ui1composition xmlns1ui#,"ttp122xmlns.jcp.org2js&2&acelets,
template#,..2QE@9I$F2templates2template.x"tml,
Captulo 12 - Filtros Rosiclia Frasson

147

xmlns #,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122xmlns.jcp.org2js&2"tml,
xmlns1&#,"ttp122xmlns.jcp.org2js&2core,8

*ui1de&ine name#,conteudo,8
*"1&orm acceptc"arset#,ISD9BBIZ9',8

*"1messages errorStyle#,color1red, layout#,table,28

*"1input:idden value#,^{&uncionario@ean.&uncionario.codigo,28

*&ieldset8
*legend8Aadastro de FuncionNrio*2legend8

*"1panel(rid columns#,0,8

*"1output6abel value#,$ome1 , &or#,nome,28
*"1panel(roup8
*"1input/ext id#,nome,
value#,^{&uncionario@ean.&uncionario.nome,
re<uired#,true,
re<uired!essage#,l necessNrio in&ormar o nome do &uncionNrio. ,28
*"1message &or#,nome, errorStyle#,color1red,28
*2"1panel(roup8

*"1output6abel value#,A;F1 , &or#,cp&,28
*"1panel(roup8
*"1input/ext id#,cp&,
value#,^{&uncionario@ean.&uncionario.cp&,
re<uired#,true,
re<uired!essage#,l necessNrio in&ormar o A;F.,28
*"1message &or#,cp&, errorStyle#,color1red,28
*2"1panel(roup8

*"1output6abel value#,?ata de $ascimento1 , &or#,dt$ascimento,28
*"1panel(roup8
*"1input/ext id#,dt$ascimento,
value#,^{&uncionario@ean.&uncionario.data$ascimento,
re<uired#,true,
re<uired!essage#,l necessNrio in&ormar a data de nascimento.,
converter!essage#,?ata no &ormato invNlido. .tili>e dd2mm2aaaa,8
*&1convert?ate/ime pattern#,dd2!!2yyyy, type#,date,28
*2"1input/ext8
*"1message &or#,dt$ascimento, errorStyle#,color1red,28
*2"1panel(roup8

*"1output6abel value#,Aargo1 , &or#,cargo,28
*"1selectDne!enu id#,cargo,
value#,^{&uncionario@ean.cargoId,8
*&1selectItems value#,^{cargo@ean.listaAargos, var#,cargo,
item6abel#,^{cargo.nome, item)alue#,^{cargo.codigo,28
*2"1selectDne!enu8

Captulo 12 - Filtros Rosiclia Frasson

148

*"1output6abel value#,/ele&one1 , &or#,tele&one,28
*"1input/ext id#,tele&one,
value#,^{&uncionario@ean.&uncionario.tele&one,28

*"1output6abel value#,Email1 , &or#,email,28
*"1input/ext id#,email,
value#,^{&uncionario@ean.&uncionario.email,28
*2"1panel(rid8

*"r 28
*"1output/ext value#,Endere`o,28

*"1panel(rid columns#,U,8

*"1output6abel value#,Endere`o1 , &or#,endereco,28
*"1input/ext id#,endereco, value#,^{&uncionario@ean.&uncionario.endereco.endereco,28

*"1output6abel value#,$cmero1 , &or#,numero,28
*"1panel(roup8
*"1input/ext id#,numero,
value#,^{&uncionario@ean.&uncionario.endereco.numero,
validator!essage#,D ncmero nHo pode ser negativo.,8
*&1validate6ongCange minimum#,-,28
*2"1input/ext8
*"1message &or#,numero,28
*2"1panel(roup8

*"1output6abel value#,Aomplemento1 , &or#,complemento,28
*"1input/ext id#,complemento,
value#,^{&uncionario@ean.&uncionario.endereco.complemento,28

*"1output6abel value#,@airro1 , &or#,bairro,28
*"1input/ext id#,bairro, value#,^{&uncionario@ean.&uncionario.endereco.bairro,28

*"1output6abel value#,Estado1 , &or#,estado,28
*"1input/ext id#,estado, value#,^{&uncionario@ean.&uncionario.endereco.estado,28
*"1output6abel value#,Aidade1 , &or#,cidade,28
*"1input/ext id#,cidade, value#,^{&uncionario@ean.&uncionario.endereco.cidade,28
*2"1panel(rid8

*2&ieldset8

*br 28
*"1panel(roup8
*"1command@utton value#,Salvar,
action#,^{&uncionario@ean.insere,
styleAlass#,botao,28
*"1command@utton value#,Aancelar, type#,reset, styleAlass#,botao,28
*2"1panel(roup8

*2"1&orm8
*2ui1de&ine8

Captulo 12 - Filtros Rosiclia Frasson

149

*2ui1composition8

*ui1composition xmlns1ui#,"ttp122xmlns.jcp.org2js&2&acelets,
template#,..2QE@9I$F2templates2template.x"tml,
xmlns #,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122xmlns.jcp.org2js&2"tml,
xmlns1&#,"ttp122xmlns.jcp.org2js&2core,8

*ui1de&ine name#,conteudo,8
*"1&orm acceptc"arset#,ISD9BBIZ9',8
*"1data/able value#,^{&uncionario@ean.listaFuncionarios,
var#,&uncionario,
styleAlass#,tabela,
"eaderAlass#,cabecal"o,8
*&1&acet name#,"eader,8
*"1output/ext value#,FuncionNrios,28
*2&1&acet8

*"1column8
*&1&acet name#,"eader,8
*"1output/ext value#,Aadigo, 28
*2&1&acet8
*"1output/ext value#,^{&uncionario.codigo,28
*2"1column8

*"1column8
*&1&acet name#,"eader,8
*"1output/ext value#,$ome, 28
*2&1&acet8
*"1output/ext value#,^{&uncionario.nome,28
*2"1column8

*"1column8
*&1&acet name#,"eader,8
*"1output/ext value#,?ata de nascimento, 28
*2&1&acet8
*"1output/ext value#,^{&uncionario.data$ascimento,8
*&1convert?ate/ime pattern#,dd2!!2yyyy, type#,date,28
*2"1output/ext8
*2"1column8

*"1column8
*&1&acet name#,"eader,8
*"1output/ext value#,Aargo, 28
*2&1&acet8
*"1output/ext value#,^{&uncionario.cargo.nome,28
*2"1column8

*"1column8
*&1&acet name#,"eader,8
*"1command6in% action#,2&aces2paginas2&uncionario.x"tml,8
*"1grap"icImage library#,imagens, name#,add.png, 28
Captulo 12 - Filtros Rosiclia Frasson

150

*2"1command6in%8
*2&1&acet8
*"1command6in%
action#,^{&uncionario@ean.preparaElteracao,8
*&1set;ropertyEction6istener value#,^{&uncionario,
target#,^{&uncionario@ean.&uncionario,28
*"1grap"icImage library#,imagens, name#,edit.png,28
*2"1command6in%8
*"1command6in%
action#,^{&uncionario@ean.remove,8
*&1set;ropertyEction6istener value#,^{&uncionario,
target#,^{&uncionario@ean.&uncionario,28
*"1grap"icImage library#,imagens, name#,delete.png,28
*2"1command6in%8
*2"1column8
*2"1data/able8
*2"1&orm8
*2ui1de&ine8
*2ui1composition8

30. A aparncia das telas responsveis pela manuteno dos funcionrios devem ser similares as
imagens a seguir.



Captulo 12 - Filtros Rosiclia Frasson

151



PASSO-A-PASSO

Mecanismo de Autenticao

Em aplicaes comerciais necessrio que o aplicativo possua um mecanismo de
autenticao de usurios. Com JSF existem diversas maneiras de efetuar a autenticao. No
exemplo apresentado a seguir utilizado o Filter para este controle.

1. Algumas alteraes no projeto criado anteriormente devem ser efetuadas. Primeiramente
necessria a insero dos campos login e senha na classe Funcionario.

pac%age br.com.rosicleia&rasson.cap'0autenticacao&iltro.model;

import java.util.?ate;
import javax.persistence.Aascade/ype;
import javax.persistence.Aolumn;
import javax.persistence.Entity;
import javax.persistence.(enerated)alue;
import javax.persistence.Id;
import javax.persistence.!any/oDne;
import javax.persistence.Dne/oDne;
import javax.persistence./emporal;
import javax.persistence./emporal/ype;

@Entity
public class Funcionario {

@Id @(enerated)alue
private int codigo;
private String nome;
private String cp&;
@/emporal(/emporal/ype.?E/E)
private ?ate data$ascimento;
@!any/oDne
private Aargo cargo;
private String tele&one;
private String email;
@Dne/oDne(cascade # Aascade/ype.E66)
Captulo 12 - Filtros Rosiclia Frasson

152

private Endereco endereco;
@Aolumn(uni<ue # true)
private String login;
private String sen"a;

public Funcionario() {
endereco # ne3 Endereco();


22(ets e sets


2. Os campos login e senha devem ser inclusos na pgina de cadastro de funcionrios.

*"r 28
*"1panel(roup id#,dados6ogin,8
*"1panel(rid columns#,U,8
*"1output6abel &or#,login, value#,6ogin1 ,28
*"1input/ext id#,login, value#,^{&uncionario@ean.&uncionario.login, 28


*"1output6abel &or#,sen"a, value#,Sen"a1 ,28
*"1input/ext id#,sen"a, value#,^{&uncionario@ean.&uncionario.sen"a,28
*2"1panel(rid8
*2"1panel(roup8

3. Um filtro para o controle de acesso deve ser criado.

pac%age br.com.rosicleia&rasson.cap'0autenticacao&iltro.&ilter;

import java.io.IDException;
import javax.servlet.Filter;
import javax.servlet.FilterA"ain;
import javax.servlet.FilterAon&ig;
import javax.servlet.ServletException;
import javax.servlet.ServletCe<uest;
import javax.servlet.ServletCesponse;
import javax.servlet."ttp.:ttpServletCe<uest;
import javax.servlet."ttp.:ttpServletCesponse;
import javax.servlet."ttp.:ttpSession;

public class AontroleEcessoFilter implements Filter {

@Dverride
public void init(FilterAon&ig &ilterAon&ig) t"ro3s ServletException {


@Dverride
public void doFilter(ServletCe<uest re<uestJ ServletCesponse responseJ FilterA"ain c"ain) t"ro3s
Captulo 12 - Filtros Rosiclia Frasson

153

IDExceptionJ ServletException {
try {
:ttpServletCe<uest "ttpCe< # (:ttpServletCe<uest) re<uest;
:ttpServletCesponse "ttpCes # (:ttpServletCesponse) response;
:ttpSession session # "ttpCe<.getSession(true);
String url # "ttpCe<.getCe<uest.C6().toString();
i& (session.getEttribute(,usuario6ogado,) ## null kk precisaEutenticar(url)) {
"ttpCes.sendCedirect("ttpCe<.getAontext;at"() M ,2&aces2login.x"tml,);
else {
c"ain.doFilter(re<uestJ response);

catc" (Exception e) {
e.printStac%/race();



@Dverride
public void destroy() {


private boolean precisaEutenticar(String url) {
return Rurl.contains(,login.x"tml,) kk Rurl.contains(,javax.&aces.resource,);



4. Na existncia de mais de um filtro em uma aplicao, recomendado que o registro dos filtros seja
feito no web.xml ao invs de utilizar anotaes.
*&ilter8
*&ilter9name8AontroleEcesso*2&ilter9name8
*&ilter9class8br.com.rosicleia&rasson.r".&ilter.AontroleEcesso*2&ilter9class8
*2&ilter8
*&ilter9mapping8
*&ilter9name8AontroleEcesso*2&ilter9name8
*servlet9name8Faces Servlet*2servlet9name8
*2&ilter9mapping8
*&ilter8
*&ilter9name8G;EFilter*2&ilter9name8
*&ilter9class8br.com.rosicleia&rasson.r".&ilter.G;EFilter*2&ilter9class8
*2&ilter8
*&ilter9mapping8
*&ilter9name8G;EFilter*2&ilter9name8
*servlet9name8Faces Servlet*2servlet9name8
*2&ilter9mapping8

5. Para verificar se o usurio que est tentando se autenticar est cadastrado, necessrio efetuar
uma busca na base de dados. Deste modo, as classes FuncionarioDAO e FuncionarioDAOJPA
devem ser alteradas.

pac%age br.com.rosicleia&rasson.cap'0autenticacao&iltro.model.persistencia.dao;

Captulo 12 - Filtros Rosiclia Frasson

154

import br.com.rosicleia&rasson.cap'0autenticacao&iltro.model.Funcionario;

public inter&ace Funcionario?ED extends ?ED*FuncionarioJ Integer8 {

boolean login(String usuarioJ String sen"a);


pac%age br.com.rosicleia&rasson.cap'0autenticacao&iltro.model.persistencia;

import br.com.rosicleia&rasson.cap'0autenticacao&iltro.model.Funcionario;
import br.com.rosicleia&rasson.cap'0autenticacao&iltro.model.persistencia.dao.Funcionario?ED;
import javax.persistence.Entity!anager;
import javax.persistence.Fuery;

public class Funcionario?EDG;E extends ?EDG;E*FuncionarioJ Integer8 implements Funcionario?ED {

private Entity!anager manager;

public Funcionario?EDG;E(Entity!anager manager) {
super(manager);
t"is.manager # manager;


@Dverride
public boolean login(String loginJ String sen"a) {
Fuery < # t"is.manager.createFuery(,select & &rom Funcionario & 3"ere &.login # 1login and &.sen"a #
1sen"a,J Funcionario.class);
<.set;arameter(,sen"a,J sen"a);
<.set;arameter(,login,J login);
i& (<.getCesult6ist().si>e() 8 -) {
return true;

return &alse;



6. O passo seguinte a construo de um managed bean para controlar a autenticao do usurio.

pac%age br.com.rosicleia&rasson.cap'0autenticacao&iltro.controller;

import br.com.rosicleia&rasson.cap'0autenticacao&iltro.model.persistencia.Funcionario?EDG;E;
import br.com.rosicleia&rasson.cap'0autenticacao&iltro.model.persistencia.dao.Funcionario?ED;
import javax.&aces.application.Faces!essage;
import javax.&aces.bean.!anaged@ean;
import javax.&aces.bean.SessionScoped;
import javax.&aces.context.ExternalAontext;
import javax.&aces.context.FacesAontext;
import javax.persistence.Entity!anager;
import javax.servlet."ttp.:ttpServletCe<uest;
import javax.servlet."ttp.:ttpSession;
Captulo 12 - Filtros Rosiclia Frasson

155


@!anaged@ean
@SessionScoped
public class 6ogin@ean {

private String usuario;
private String sen"a;

public String autentica() {
FacesAontext &c # FacesAontext.getAurrentInstance();
Entity!anager manager # t"is.get!anager();
Funcionario?ED dao # ne3 Funcionario?EDG;E(manager);
i& (dao.login(usuarioJ sen"a)) {
ExternalAontext ec # &c.getExternalAontext();
:ttpSession session # (:ttpSession) ec.getSession(&alse);
session.setEttribute(,usuario6ogado,J true);
return ,2paginas2cargo.x"tml,;
else {
Faces!essage &m # ne3 Faces!essage(,.suario e2ou sen"a invNlidos,);
&m.setSeverity(Faces!essage.SE)ECI/S7ECCDC);
&c.add!essage(nullJ &m);
return ,2login,;



public String registraSaida() {
FacesAontext &c # FacesAontext.getAurrentInstance();
ExternalAontext ec # &c.getExternalAontext();
:ttpSession session # (:ttpSession) ec.getSession(&alse);
session.removeEttribute(,usuario,);
return ,2login,;


private Entity!anager get!anager() {
FacesAontext &c # FacesAontext.getAurrentInstance();
ExternalAontext ec # &c.getExternalAontext();
:ttpServletCe<uest re<uest # (:ttpServletCe<uest) ec.getCe<uest();
return (Entity!anager) re<uest.getEttribute(,Entity!anager,);


public String get.suario() {
return usuario;


public void set.suario(String usuario) {
t"is.usuario # usuario;


public String getSen"a() {
return sen"a;


public void setSen"a(String sen"a) {
Captulo 12 - Filtros Rosiclia Frasson

156

t"is.sen"a # sen"a;



7. Para que o usurio possa efetuar a autenticao necessria a pgina de login, exibida a seguir.

*+xml version#]'.-] encoding#]./F9B] +8
*R?DA/S;E "tml ;.@6IA ,922Q4A22?/? 5:/!6 '.- /ransitional22E$,
,"ttp122333.34.org2/C2x"tml'2?/?2x"tml'9transitional.dtd,8
*"tml xmlns#,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122xmlns.jcp.org2js&2"tml,
xmlns1pt#,"ttp122xmlns.jcp.org2js&2passt"roug",8

*"1"ead8
*title8(estHo de Cecursos :umanos*2title8
*"1outputStyles"eet library#,css, name#,style.css,28
*2"1"ead8

*"1body8

*div id#,pagina6ogin,8
*"086D(I$ *2"08
*"1&orm8
*"1panel(rid columns#,',8

*"1input/ext value#,^{login@ean.usuario, id#,usuario, pt1place"older#,.suNrio, 28
*br 28

*"1inputSecret value#,^{login@ean.sen"a, id#,sen"a, pt1place"older#,Sen"a,28

*br 28

*"1command@utton value#,Dm, action#,^{login@ean.autentica, styleAlass#,botao6ogin,28
*2"1panel(rid8

*2"1&orm8

*"1messages 28
*2div8

*2"1body8
*2"tml8

8. Com o intuito de melhorar a aparncia da pgina de login, devem ser aplicadas algumas regras
CSS.

^pagina6ogin{
position1absolute;
le&t1I-V;
top1I-V;
Captulo 12 - Filtros Rosiclia Frasson

157

margin9le&t19'-Ipx;
margin9top19'--px;
3idt"1 0'-px;
bac%ground1 ^&&&&&&;
border9radius1 '-px;
box9s"ado31 -px -px '-px ^cccccc;
padding1 0-px;


^pagina6ogin .botao6ogin{
&ont1bold 'Bpx ErialJ :elveticaJ sans9seri&;
&ont9style1normal;
color1^&&&&&&;
bac%ground1^IeIeIU;
border1-px solid ^&&&&&&;
text9s"ado319'px 9'px 'px ^000000;
box9s"ado310px 0px Ipx ^------;
9mo>9box9s"ado310px 0px Ipx ^------;
93eb%it9box9s"ado310px 0px Ipx ^------;
border9radius1-px '-px '-px '-px;
9mo>9border9radius1-px '-px '-px '-px;
93eb%it9border9radius1-px '-px '-px '-px;
3idt"1__px;
"eig"t1 U-px;
padding1'-px 0-px;
cursor1pointer;
margin1- auto;


^pagina6ogin input{
"eig"t1 0-px;


9. importante acrescentar no template um link para que o usurio possa fazer o logout. Dessa
forma, dentro do cabealho deve existir a div seo exibida a seguir.

*div id#,secao,8
*"1&orm8
*"1outputFormat value#,DlN {-,8
*&1param value#,^{login@ean.usuario, 28
*2"1outputFormat8
*br 28
*"1command6in% value#,6ogout, action#,^{login@ean.registraSaida, 28
*2"1&orm8
*2div8

10. Para alinhar corretamente a div seo algumas regras CSS.

^cabecal"o ^secao{
margin9top1 90-px;
Captulo 12 - Filtros Rosiclia Frasson

158

&loat1 rig"t;


^cabecal"o ^secao a{
text9decoration1 none;


^cabecal"o ^secao a1"over{
text9decoration1 underline;



Captulo 13 - )i*liotecas +e coponentes Rosiclia Frasson

159

Bibliotecas de componentes

O JSF possui em sua implementao padro todos os componentes bsicos da HTML. Em
muitos casos esses componentes so suficientes, embora a tecnologia permite que os
desenvolvedores criem seus prprios componentes que podem ser utilizados em diversos
projetos. O uso de componentes prontos melhora a qualidade visual da aplicao alm de
aumentar a produtividade.
Devido a grande demanda por componentes mais robustos surgiram diversas bibliotecas
prontas para uso em projetos JSF. Entre as bibliotecas mais utilizadas pelos desenvolvedores
podem ser citadas: ADF Faces, IceFaces, Primefaces e RichFaces.


RichFaces



O RichFaces uma biblioteca de responsabilidade da JBoss que pertence ao grupo Red
Hat. Possui cdigo aberto, suporte a ajax e em torno de 60 componentes prontos para utilizao.
O desenvolvedor tambm pode criar seus prprios componentes. No showcase, os componentes
so exibidos juntamente com o cdigo necessrio para a sua utilizao.
Dentre os componentes mais importantes podem ser citados calendrio, auto complete,
tabela com paginao e o menu dropdow.
O esquema de cores apresentadas pelos componentes da biblioteca pode ser alterado
com a utilizao de temas. Atualmente no showcase do primefaces existem 7 temas definidos.
A documentao do framework bastante diversificada contendo alm do guia do
desenvolvedor, FAQ e screeencasts. Tambm contm um frum para esclarecimento de dvidas.



Captulo 13 - )i*liotecas +e coponentes Rosiclia Frasson

160

Icefaces



O Icefaces uma biblioteca de componentes open source desenvolvida pela IceSoft
(http://www.icesoft.org/java/projects/ICEfaces/overview.jsf). Possui como finalidade a integrao
entre as tecnologias JSF e ajax de forma nativa. Sendo assim, todos os componentes do icefaces
do suporte a ajax.
Possui em torno de 40 componentes dentre os quais podem ser citados tabela com
paginao, calendrio, campos de texto com mscara, barra de progresso e gerao de grficos
estatsticos. O show case pode ser acessado em: http://icefaces-showcase.icesoft.org e possui a
descrio do componente, ilustrao, cdigo fonte para utilizao e um link para a documentao.
A documentao extensa contendo tutoriais, vdeos e documentao no formato wiki.
Alm de disponibilizar frum e chat para apoio.


Primefaces

O primefaces desenvolvido pela Prime Teknoloji (Turquia) e pode ser acessado em:
http://www.primefaces.org. um framework open source. Possui suporte nativo a ajax e em torno
de 150 componentes em seu showcase, sendo considerada a biblioteca de componentes mais
avanada do mercado.
O framework prov uma verso melhorada de praticamente todos os componentes JSF -
entrada e sada de textos, menus de seleo e botes. Alm disso, o primefaces possui uma
ampla gama de recursos diferenciados como captcha, gerador de grficos estatsticos, galeria de
imagens, barra de progresso, entre outros. Um detalhe importante que no showcase todos os
componentes so apresentados juntamente com as linhas de cdigo necessrias para a sua
utilizao. O primefaces possui tambm cerca de 30 temas pr-definidos que alteram a aparncia
dos componentes. O framework ainda disponibiliza uma verso para dispositivos mveis.
Captulo 13 - )i*liotecas +e coponentes Rosiclia Frasson

161

A documentao do primefaces de fcil acesso contendo a demonstrao de todos os
componentes. O framework conta ainda com frum e extensa comunidade com ativa participao
e colaborao.
Uma grande vantagem da utilizao do primefaces a sua facilidade de configurao.
Para utiliz-lo apenas um nico arquivo jar necessrio. No necessrio nenhum arquivo xml
de configurao e no h dependncias.


Captulo 14 - Prie,aces Rosiclia Frasson

162

Primefaces

Como descrito no captulo anterior, o primefaces atualmente uma boa escolha para uma
biblioteca de componentes. Embora dentre os frameworks de componentes utilizados, o
primefaces seja o mais recente, a sua utilizao cresceu drasticamente nos ltimos anos. A seguir
est ilustrada uma pesquisa feita por meio do Google Trends que indica a popularidade do
framework.



Pelos motivos citados, o primefaces ser a biblioteca de componentes utilizada neste
material.


Componentes

O rico conjunto de componentes presente na biblioteca do primefaces um dos principais
motivos de sua ascenso. Em virtude da quantidade de componentes nem todos sero citados
neste material. Porm, todo o conjunto pode ser consultado no showcase da biblioteca:
http://www.primefaces.org/showcase/ui/home.jsf.
Alguns componentes citados existem no JSF puro. No entanto, utilizando os componentes
do primefaces, podem ser aproveitados os conjuntos de skins que a biblioteca oferece. Para
utilizar os componentes do primefaces necessrio incluir o namespace:

xmlns1p#,"ttp122prime&aces.org2ui,

A seguir, alguns componentes do primefaces:

Componente Descrio
p:panel Painel onde podem ser alocados outros componentes. O painel pode conter
um cabealho.

*p1panel "eader#,Aadastro de Aargo,8
Captulo 14 - Prie,aces Rosiclia Frasson

163

*2p1panel8


p:inputText Campo de entrada de dados com apenas uma linha.

*p1input/ext id#,nome, si>e#,I-,
value#,^{cargo@ean.cargo.nome,
re<uired#,true,
re<uired!essage#,l necessNrio in&ormar o nome do cargo.,28


p:selectOneMen
u
Componente conhecido como combo box.

*p1selectDne!enu id#,cargo, value#,^{&uncionario@ean.cargoId,
style#,3idt"1'I-px;,8
*&1selectItem item6abel#,Selecione, item)alue#,, 28
*&1selectItems value#,^{cargo@ean.listaAargos, var#,cargo,
item6abel#,^{cargo.nome, item)alue#,^{cargo.codigo,28
*2p1selectDne!enu8

*
p:calendar Componente de entrada usado para selecionar uma data.

*p1calendar id#,dt$ascimento,
value#,^{&uncionario@ean.&uncionario.data$ascimento,
re<uired#,true,
re<uired!essage#,l necessNrio in&ormar a data de nascimento.,
converter!essage#,?ata no &ormato invNlido. .tili>e dd2mm2aaaa,
pattern#,dd2!!2yyyy,8
*&1convert?ate/ime pattern#,dd2!!2yyyy, type#,date,28
*2p1calendar8
Captulo 14 - Prie,aces Rosiclia Frasson

164

*
p:inputMask Campo de entrada de texto que permite a adio de uma mscara.

*p1input!as% id#,tele&one,
value#,^{&uncionario@ean.&uncionario.tele&one,
mas%#,(ZZ) ZZZZ9ZZZZ,28

*
p:inputTextarea Campo de entrada de texto composto por mais de uma linha.

*p1input/extarea id#,descricao,
value#,^{cargo@ean.cargo.descricao,
cols#,I-, ro3s#,'-,28

*
p:password Campo de senha.

*p1pass3ord id#,sen"a, value#,^{&uncionario@ean.&uncionario.sen"a,
&eedbac%#,true,28


Captulo 14 - Prie,aces Rosiclia Frasson

165

p:commandButt
on
Boto utilizado para envio de dados em um formulrio.

*p1command@utton
action#,^{cargo@ean.remove, icon#,ui9icon9close,8
*&1set;ropertyEction6istener value#,^{cargo,
target#,^{cargo@ean.cargo,28
*2p1command@utton8



p:dataTable Tabela. Neste componente podem ser includas informaes como
quantidade de linhas, paginao, ordenao de elementos, pesquisa, entre
outros.

*p1data/able id#,tabela, var#,cargo, value#,^{cargo@ean.listaAargos,
sort!ode#,multiple, ro3s#,B, paginator#,true,8
*&1&acet name#,"eader,8
Aargos
*2&1&acet8

*p1column sort@y#,codigo, "eader/ext#,Aadigo,8
*"1output/ext value#,^{cargo.codigo, 28
*2p1column8

*p1column sort@y#,nome, "eader/ext#,$ome,8
*"1output/ext value#,^{cargo.nome, 28
*2p1column8

*p1column8
*&1&acet name#,"eader,8
*p1command@utton action#,2&aces2paginas2cargo.x"tml, icon#,ui9icon9
plus,8
*2p1command@utton8
*2&1&acet8

*p1command@utton
action#,^{cargo@ean.preparaElteracao, icon#,ui9icon9pencil,8
*&1set;ropertyEction6istener value#,^{cargo,
target#,^{cargo@ean.cargo,28

*2p1command@utton8
*p1command@utton
action#,^{cargo@ean.remove, icon#,ui9icon9close,8
*&1set;ropertyEction6istener value#,^{cargo,
target#,^{cargo@ean.cargo,28

*2p1command@utton8
Captulo 14 - Prie,aces Rosiclia Frasson

166

*2p1column8
*2p1data/able8


p:layout Componente utilizado para a montagem de layouts. O componente layoutUnit
permite a diviso da pgina em blocos.

*p1layout &ull;age#,true,8

*p1layout.nit position#,nort", si>e#,'--, "eader#,(estHo de Cecursos
:umanos, 8

*"1grap"icImage library#,imagens, name#,logo.png, 28

*2p1layout.nit8

*p1layout.nit position#,sout", si>e#,4I, "eader#,kcopy;0-'U /odos os
direitos reservados knbsp;kbull;knbsp; CosiclTia Frasson, style#,text9align1
center,8

*2p1layout.nit8

*p1layout.nit position#,3est, si>e#,0--, resi>able#,true, closable#,true,
collapsible#,true,8
*ui1include src#,..2menu.x"tml,28
*2p1layout.nit8

*p1layout.nit position#,center,8
*div id#,conteudo,8
*ui1insert name#,conteudo,8
*2ui1insert8
*2div8
*2p1layout.nit8

*2p1layout8
Captulo 14 - Prie,aces Rosiclia Frasson

167



Icons

O jquery possui uma srie de cones que podem ser utilizados com o primefaces. Esses
cones podem ser obtidos em: http://jqueryui.com/themeroller/.



interessante optar por estes cones j que a aparncia dos mesmos alterada conforme
o tema da pgina.







Captulo 14 - Prie,aces Rosiclia Frasson

168

Skins

O primefaces possui integrao com o framework ThemeRoller do JQuery. Atualmente
existem 24 temas disponveis para serem utilizados nas aplicaes.


Alm dos temas existentes na pgina do primefaces, possvel criar novos temas na
pgina: http://jqueryui.com/themeroller/.



PASSO-A-PASSO

Configurao

1. Para utilizar o primefaces necessrio efetuar o download da biblioteca no site do projeto:
Captulo 14 - Prie,aces Rosiclia Frasson

169

http://primefaces.org/downloads. interessante fazer o download da verso 4.0.

2. O projeto criado da mesma forma que um projeto JSF puro. No entanto, na aba frameworks
necessrio apontar como framework de componentes o primefaces. Vale lembrar que durante a
criao do primeiro projeto utilizando o primefaces necessrio acionar o boto Mais e apontar
para a biblioteca que foi efetuado o download.



3. importante perceber que o Netbeans cria automaticamente as pginas index e
welcomePrimefaces. O arquivo welcomePrimefaces possui algumas tags da biblioteca.

*R?DA/S;E :/!6 ;.@6IA ,922Q4A22?/? :/!6 U.-' /ransitional22E$,
,"ttp122333.34.org2/C2"tmlU2loose.dtd,8
*"tml xmlns#,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122java.sun.com2js&2"tml,
xmlns1&#,"ttp122java.sun.com2js&2core,
xmlns1ui#,"ttp122java.sun.com2js&2&acelets,
xmlns1p#,"ttp122prime&aces.org2ui,8

*&1vie3 content/ype#,text2"tml,8
*"1"ead8
*&1&acet name#,&irst,8
*meta content#]text2"tml; c"arset#./F9B] "ttp9e<uiv#,Aontent9/ype,28
*title8;rimeFaces*2title8
*2&1&acet8
*2"1"ead8
Captulo 14 - Prie,aces Rosiclia Frasson

170


*"1body8

*p1layout &ull;age#,true,8

*p1layout.nit position#,nort", si>e#,'--, resi>able#,true, closable#,true, collapsible#,true,8
:eader
*2p1layout.nit8

*p1layout.nit position#,sout", si>e#,'--, closable#,true, collapsible#,true,8
Footer
*2p1layout.nit8

*p1layout.nit position#,3est, si>e#,'_I, "eader#,6e&t, collapsible#,true,8
*p1menu8
*p1submenu label#,Cesources,8
*p1menuitem value#,?emo, url#,"ttp122333.prime&aces.org2s"o3case9
labs2ui2"ome.js&, 28
*p1menuitem value#,?ocumentation,
url#,"ttp122333.prime&aces.org2documentation."tml, 28
*p1menuitem value#,Forum, url#,"ttp122&orum.prime&aces.org2, 28
*p1menuitem value#,/"emes, url#,"ttp122333.prime&aces.org2t"emes."tml, 28

*2p1submenu8

*2p1menu8
*2p1layout.nit8

*p1layout.nit position#,center,8
Qelcome to ;rimeFaces
*2p1layout.nit8

*2p1layout8

*2"1body8

*2&1vie38
*2"tml8

4. Ao executar o projeto a pgina renderizada deve ser similar a imagem seguinte.
Captulo 14 - Prie,aces Rosiclia Frasson

171



5. A pgina apresentada possui o tema padro do primefaces. Para alterar o mesmo necessrio
efetuar o download do jar na pgina do primefaces:
http://repository.primefaces.org/org/primefaces/themes/. Neste exemplo, ser utilizada a biblioteca
dot-luv.

6. O prximo passo adicionar a biblioteca ao projeto. No menu propriedade, biblioteca, adicionar
jar/pasta, selecione o jar correspondente a biblioteca.
Captulo 14 - Prie,aces Rosiclia Frasson

172



7. O web.xml tambm deve ser alterado para indicar que o tema deve ser alterado.

*context9param8
*param9name8prime&aces./:E!E*2param9name8
*param9value8dot9luv*2param9value8
*2context9param8

8. Ao executar o projeto possvel perceber a alterao feita na pgina.
Captulo 14 - Prie,aces Rosiclia Frasson

173




PASSO-A-PASSO

Aplicativo RH

Como o intuito apenas demonstrar os componentes da biblioteca, este projeto ter as
mesmas funcionalidades do projeto apresentado no captulo anterior. Dessa forma, apenas a
codificao referente a visualizao deve ser alterada. As demais camadas do projeto continuam
as mesmas.

1. Como j mencionado, as alteraes sero efetuadas apenas na camada de visualizao. O
primeiro arquivo a ser modificado o template, que a base para outras pginas. importante
perceber que as divs foram substitudas pelo componente layoutUnit.

*+xml version#]'.-] encoding#]./F9B] +8
*R?DA/S;E "tml ;.@6IA ,922Q4A22?/? 5:/!6 '.- /ransitional22E$,
,"ttp122333.34.org2/C2x"tml'2?/?2x"tml'9transitional.dtd,8
*"tml xmlns#,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122xmlns.jcp.org2js&2"tml,
xmlns1ui#,"ttp122xmlns.jcp.org2js&2&acelets,
xmlns1p#,"ttp122prime&aces.org2ui,8
Captulo 14 - Prie,aces Rosiclia Frasson

174


*"1"ead8
*title8(estHo de Cecursos :umanos*2title8
*"1outputStyles"eet library#,css, name#,style.css,28
*2"1"ead8

*"1body8

*p1layout &ull;age#,true,8

*p1layout.nit position#,nort", si>e#,'--, "eader#,(estHo de Cecursos :umanos, 8

*"1grap"icImage library#,imagens, name#,logo.png, 28

*2p1layout.nit8

*p1layout.nit position#,sout", si>e#,4I, "eader#,kcopy;0-'U /odos os direitos reservados
knbsp;kbull;knbsp; CosiclTia Frasson, style#,text9align1 center,8

*2p1layout.nit8

*p1layout.nit position#,3est, si>e#,0--, resi>able#,true, closable#,true, collapsible#,true,8
*ui1include src#,..2menu.x"tml,28
*2p1layout.nit8

*p1layout.nit position#,center,8
*div id#,conteudo,8
*ui1insert name#,conteudo,8
*2ui1insert8
*2div8
*2p1layout.nit8

*2p1layout8
*2"1body8
*2"tml8

2. O arquivo menu.xhtml deve ser alterado para a utilizao de um menu do primefaces.

*ui1composition xmlns1ui#,"ttp122java.sun.com2js&2&acelets,
xmlns #,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122xmlns.jcp.org2js&2"tml,
xmlns1p#,"ttp122prime&aces.org2ui,8

*"1&orm8

*p1panel!enu style#,3idt"1 'Z4px;,8
*p1submenu label#,Edministra`Ho,8
*p1menuitem value#,Aargos, url#,2&aces2paginas2lista9cargos.x"tml,28
*p1menuitem value#,FuncionNrios, url#,2&aces2paginas2lista9&uncionarios.x"tml,28
*2p1submenu8

Captulo 14 - Prie,aces Rosiclia Frasson

175

*p1submenu label#,Cecrutamento e Sele`Ho,8
*p1menuitem value#,@anco de AurrLculos, url#,^, 28
*p1menuitem value#,Evalia`Hoes, url#,^, 28
*p1menuitem value#,;rocessos Seletivos, url#,^, 28
*2p1submenu8

*p1submenu label#,Servi`os,8
*p1menuitem value#,/reinamento e ?esenvolvimento, url#,^, 28
*p1menuitem value#,Fol"a de ;agamento, url#,^, 28
*p1menuitem value#,;onto Eletrnnico, url#,^, 28
*p1menuitem value#,(estHo de @ene&Lcios, url#,^, 28
*2p1submenu8

*p1submenu label#,Celatarios (erenciais,8
*p1menuitem value#,Cotatividade, url#,^, 28
*p1menuitem value#,;rodutividade, url#,^, 28
*p1menuitem value#,Austo, url#,^, 28
*2p1submenu8

*2p1panel!enu8

*2"1&orm8

*2ui1composition8

3. Para melhorar a aparncia das pginas, deve ser alterado o tema das pginas. Vale lembrar
que a biblioteca correspondente ao tema escolhido deve estar adicionada ao projeto. Neste
exemplo, est sendo utilizado o skin rocket.

*context9param8
*param9name8prime&aces./:E!E*2param9name8
*param9value8roc%et*2param9value8
*2context9param8

4. Executando o projeto a pgina apresentada deve ser similar a imagem a seguir.
Captulo 14 - Prie,aces Rosiclia Frasson

176



5. As pginas de cadastro e listagem de cargos e funcionrios tambm devem ser alteradas.
Seguem a codificao e a aparncia das pginas.

*ui1composition xmlns1ui#,"ttp122xmlns.jcp.org2js&2&acelets,
template#,..2QE@9I$F2templates2template.x"tml,
xmlns #,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122xmlns.jcp.org2js&2"tml,
xmlns1p#,"ttp122prime&aces.org2ui,8

*ui1de&ine name#,conteudo,8

*"1&orm acceptc"arset#,ISD9BBIZ9',8
*p1messages id#,messages, closable#,true,28
*"1input:idden value#,^{cargo@ean.cargo.codigo,28
*p1panel "eader#,Aadastro de Aargo,8
*"1panel(rid columns#,0,8

*"1output6abel value#,$ome1 , &or#,nome,28
*p1input/ext id#,nome, si>e#,I-,
value#,^{cargo@ean.cargo.nome,
re<uired#,true,
re<uired!essage#,l necessNrio in&ormar o nome do cargo.,28


*"1output6abel value#,?escri`Ho1 , &or#,descricao,28
*p1input/extarea id#,descricao,
value#,^{cargo@ean.cargo.descricao,
cols#,I-, ro3s#,'-,28
Captulo 14 - Prie,aces Rosiclia Frasson

177

*"1output6abel28


*p1panel8
*p1command@utton ajax#,&alse,
value#,Salvar,
action#,^{cargo@ean.insere,28
*p1command@utton value#,Aancelar,
type#,reset,28
*2p1panel8
*2"1panel(rid8
*2p1panel8
*2"1&orm8
*2ui1de&ine8

*2ui1composition8



*ui1composition xmlns1ui#,"ttp122xmlns.jcp.org2js&2&acelets,
template#,..2QE@9I$F2templates2template.x"tml,
xmlns #,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122xmlns.jcp.org2js&2"tml,
xmlns1&#,"ttp122xmlns.jcp.org2js&2core,
xmlns1p#,"ttp122prime&aces.org2ui,8

*ui1de&ine name#,conteudo,8
*"1&orm acceptc"arset#,ISD9BBIZ9', id#,&orm,8

*p1data/able id#,tabela, var#,cargo, value#,^{cargo@ean.listaAargos, sort!ode#,multiple,
ro3s#,B, paginator#,true,8
*&1&acet name#,"eader,8
Aargos
*2&1&acet8

*p1column sort@y#,codigo, "eader/ext#,Aadigo,8
Captulo 14 - Prie,aces Rosiclia Frasson

178

*"1output/ext value#,^{cargo.codigo, 28
*2p1column8

*p1column sort@y#,nome, "eader/ext#,$ome,8
*"1output/ext value#,^{cargo.nome, 28
*2p1column8

*p1column8
*&1&acet name#,"eader,8
*p1command@utton action#,2&aces2paginas2cargo.x"tml, icon#,ui9icon9plus,8
*2p1command@utton8
*2&1&acet8


*p1command@utton
action#,^{cargo@ean.preparaElteracao, icon#,ui9icon9pencil,8
*&1set;ropertyEction6istener value#,^{cargo,
target#,^{cargo@ean.cargo,28

*2p1command@utton8
*p1command@utton
action#,^{cargo@ean.remove, icon#,ui9icon9close,8
*&1set;ropertyEction6istener value#,^{cargo,
target#,^{cargo@ean.cargo,28

*2p1command@utton8
*2p1column8
*2p1data/able8

*2"1&orm8
*2ui1de&ine8

*2ui1composition8


*ui1composition xmlns1ui#,"ttp122xmlns.jcp.org2js&2&acelets,
template#,..2QE@9I$F2templates2template.x"tml,
xmlns #,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122xmlns.jcp.org2js&2"tml,
xmlns1&#,"ttp122xmlns.jcp.org2js&2core,
xmlns1p#,"ttp122prime&aces.org2ui,8
Captulo 14 - Prie,aces Rosiclia Frasson

179


*ui1de&ine name#,conteudo,8

*"1&orm acceptc"arset#,ISD9BBIZ9',8
*p1panel "eader#,Aadastro de FuncionNrio,8
*p1messages id#,messages, closable#,true,28
*"1input:idden value#,^{&uncionario@ean.&uncionario.codigo,28

*p1&ieldset legend#,?ados ;essoais, toggleable#,true,8
*"1panel(rid columns#,U, 3idt"#,'--V,8

*"1output6abel value#,$ome1 , &or#,nome,28
*p1input/ext id#,nome, si>e#,I-,
value#,^{&uncionario@ean.&uncionario.nome,
re<uired#,true,
re<uired!essage#,l necessNrio in&ormar o nome do &uncionNrio.,28

*"1output6abel value#,A;F1 , &or#,cp&,28
*p1input!as% id#,cp&,
value#,^{&uncionario@ean.&uncionario.cp&,
re<uired#,true,
re<uired!essage#,l necessNrio in&ormar o A;F.,
mas%#,ZZZ.ZZZ.ZZZ9ZZ,28

*"1output6abel value#,?ata de $ascimento1 , &or#,dt$ascimento,28

*p1calendar id#,dt$ascimento,
value#,^{&uncionario@ean.&uncionario.data$ascimento,
re<uired#,true,
re<uired!essage#,l necessNrio in&ormar a data de nascimento.,
converter!essage#,?ata no &ormato invNlido. .tili>e dd2mm2aaaa,
pattern#,dd2!!2yyyy,8
*&1convert?ate/ime pattern#,dd2!!2yyyy, type#,date,28
*2p1calendar8

*"1output6abel value#,Aargo1 , &or#,cargo,28
*p1selectDne!enu id#,cargo, value#,^{&uncionario@ean.cargoId, style#,3idt"1'I-px;,8
*&1selectItem item6abel#,Selecione, item)alue#,, 28
*&1selectItems value#,^{cargo@ean.listaAargos, var#,cargo, item6abel#,^{cargo.nome,
item)alue#,^{cargo.codigo,28
*2p1selectDne!enu8

*"1output6abel value#,/ele&one1 , &or#,tele&one,28
*p1input!as% id#,tele&one,
value#,^{&uncionario@ean.&uncionario.tele&one,
mas%#,(ZZ) ZZZZ9ZZZZ,28

*"1output6abel value#,Email1 , &or#,email,28
*p1input/ext id#,email, si>e#,I-,
value#,^{&uncionario@ean.&uncionario.email,28
*2"1panel(rid8

Captulo 14 - Prie,aces Rosiclia Frasson

180

*2p1&ieldset8

*p1&ieldset legend#,Endere`o, toggleable#,true, 8
*"1panel(rid columns#,U, 3idt"#,'--V,8

*"1output6abel value#,Endere`o1 , &or#,endereco,28
*p1input/ext id#,endereco, value#,^{&uncionario@ean.&uncionario.endereco.endereco,
si>e#,II,28

*"1output6abel value#,$cmero1 , &or#,numero,28

*p1input!as% id#,numero,
value#,^{&uncionario@ean.&uncionario.endereco.numero,
validator!essage#,D ncmero nHo pode ser negativo.,
mas%#,Z+ZZZZZZZ,8
*&1validate6ongCange minimum#,-,28
*2p1input!as%8

*"1output6abel value#,Aomplemento1 , &or#,complemento,28
*p1input/ext id#,complemento,
value#,^{&uncionario@ean.&uncionario.endereco.complemento, si>e#,II,28

*"1output6abel value#,@airro1 , &or#,bairro,28
*p1input/ext id#,bairro, value#,^{&uncionario@ean.&uncionario.endereco.bairro,
si>e#,II,28

*"1output6abel value#,Estado1 , &or#,estado,28
*p1input/ext id#,estado, value#,^{&uncionario@ean.&uncionario.endereco.estado,
si>e#,II,28

*"1output6abel value#,Aidade1 , &or#,cidade,28
*p1input/ext id#,cidade, value#,^{&uncionario@ean.&uncionario.endereco.cidade,
si>e#,II,28
*2"1panel(rid8
*2p1&ieldset8

*p1&ieldset legend#,?ados de Ecesso, toggleable#,true,8

*"1panel(rid columns#,U,8
*"1output6abel &or#,login, value#,6ogin1 ,28
*p1input/ext id#,login, value#,^{&uncionario@ean.&uncionario.login, 28

*"1output6abel &or#,sen"a, value#,Sen"a1 ,28
*p1pass3ord id#,sen"a, value#,^{&uncionario@ean.&uncionario.sen"a, &eedbac%#,true,28
*2"1panel(rid8

*2p1&ieldset8

*p1panel8
*p1command@utton ajax#,&alse,
value#,Salvar,
action#,^{&uncionario@ean.insere,28
Captulo 14 - Prie,aces Rosiclia Frasson

181

*p1command@utton value#,Aancelar,
type#,reset,28
*2p1panel8
*2p1panel8

*2"1&orm8
*2ui1de&ine8
*2ui1composition8




*ui1composition xmlns1ui#,"ttp122xmlns.jcp.org2js&2&acelets,
template#,..2QE@9I$F2templates2template.x"tml,
xmlns #,"ttp122333.34.org2'ZZZ2x"tml,
xmlns1"#,"ttp122xmlns.jcp.org2js&2"tml,
xmlns1&#,"ttp122xmlns.jcp.org2js&2core,
xmlns1p#,"ttp122prime&aces.org2ui,8

*ui1de&ine name#,conteudo,8
*"1&orm acceptc"arset#,ISD9BBIZ9',8
*p1data/able value#,^{&uncionario@ean.listaFuncionarios, sort!ode#,multiple, ro3s#,0I,
paginator#,true,
var#,&uncionario,8
*&1&acet name#,"eader,8
*"1output/ext value#,FuncionNrios,28
*2&1&acet8

*p1column8
*&1&acet name#,"eader,8
*"1output/ext value#,Aadigo, 28
*2&1&acet8
*"1output/ext value#,^{&uncionario.codigo,28
Captulo 14 - Prie,aces Rosiclia Frasson

182

*2p1column8

*p1column8
*&1&acet name#,"eader,8
*"1output/ext value#,$ome, 28
*2&1&acet8
*"1output/ext value#,^{&uncionario.nome,28
*2p1column8

*p1column8
*&1&acet name#,"eader,8
*"1output/ext value#,?ata de nascimento, 28
*2&1&acet8
*"1output/ext value#,^{&uncionario.data$ascimento,8
*&1convert?ate/ime pattern#,dd2!!2yyyy, type#,date,28
*2"1output/ext8
*2p1column8

*p1column8
*&1&acet name#,"eader,8
*"1output/ext value#,Aargo, 28
*2&1&acet8
*"1output/ext value#,^{&uncionario.cargo.nome,28
*2p1column8

*p1column8
*&1&acet name#,"eader,8
*p1command@utton action#,2&aces2paginas2&uncionario.x"tml, icon#,ui9icon9plus,8
*2p1command@utton8
*2&1&acet8
*p1command@utton
action#,^{&uncionario@ean.preparaElteracao, icon#,ui9icon9pencil,8
*&1set;ropertyEction6istener value#,^{&uncionario,
target#,^{&uncionario@ean.&uncionario,28

*2p1command@utton8
*p1command@utton
action#,^{&uncionario@ean.remove, icon#,ui9icon9close,8
*&1set;ropertyEction6istener value#,^{&uncionario,
target#,^{&uncionario@ean.&uncionario,28

*2p1command@utton8
*2p1column8
*2p1data/able8
*2"1&orm8
*2ui1de&ine8
*2ui1composition8


Captulo 14 - Prie,aces Rosiclia Frasson

183







184

Bibliografia



Core Java Server Faces
Autor: Geary, David / Horstmann, Cay
Editora:Prentice Hall
Publicao:2010
Edio: 3

Beginning JSF 2 APIs and JBoss Seam
Autor: TONG, Kent Ka Iok
Editora: Apress
Publicao: 2009



Pro JSF e Ajax
Autor: JACOBI, Jonas/ FALLOWS, John R.
Editora: Cincia Moderna
Publicao: 2006



185


JSF 2.0 Cookbook
Autor: LEONARD, Anghel
Editora: Packt
Publicao: 2010

W3 Schools
http://www.w3schools.com/