Beruflich Dokumente
Kultur Dokumente
na prtica
Construindo aplicaes utilizando JSF, JPA e
Primefaces
ROSICLIA FRASSON
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. Nesta segunda edio, foram includos os princpios da
programao web com captulos exclusivos sobre HTML5 e CSS3, alm de conceitos bsicos da
programao Java EE, como Servlets e pginas JSP.
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.
Todos
os
cdigos
presentes
neste
material
podem
ser
consultados
https://drive.google.com/?tab=mo&authuser=0#folders/0B8cQpHd6a5gENnJYd0ZFTkdKVGM.
em:
Caso possua correes, sugestes ou mesmo esclarecer alguma dvida sinta-se livre para
entrar em contato: rosicleiafrasson@gmail.com.
Um bom estudo!
SUMRIO
JPA ................................................................................................................................................................................3
Generics ......................................................................................................................................................................27
HTML...........................................................................................................................................................................35
CSS ..............................................................................................................................................................................47
JAVA EE .......................................................................................................................................................................71
Servlets .......................................................................................................................................................................78
JSP ...............................................................................................................................................................................88
Frameworks MVC .......................................................................................................................................................99
JSF .............................................................................................................................................................................102
Componentes JSF......................................................................................................................................................113
Escopos JSF ...............................................................................................................................................................150
Facelets .....................................................................................................................................................................158
Filtros ........................................................................................................................................................................163
Bibliotecas de componentes ....................................................................................................................................205
Primefaces ................................................................................................................................................................208
Captulo 1 - JPA
Rosiclia Frasson
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
normal
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 de paradigmas diferentes, necessrio, que os dados sejam ajustados
ajustado 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
izao do Java notou-se
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
possue 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
parente 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.
Captulo 1 - JPA
Rosiclia Frasson
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
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() {
}
Captulo 1 - JPA
Rosiclia Frasson
this.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 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.
Captulo 1 - JPA
Rosiclia Frasson
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.
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 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 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 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 mesmo devem ser acessadas e no menu
Bibliotecas, necessrio acionar a opo Adicionar Biblioteca.
Captulo 1 - JPA
Rosiclia Frasson
Captulo 1 - JPA
Rosiclia Frasson
Entidades
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
ste 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.
package br.com
com.rosicleiafrasson.exemplohibernate1.modelo;
;
import javax.persistence.Entity;
javax.persist
import javax.persistence.GeneratedValue;
javax.persistence.GeneratedValue
import javax.persistence.Id;
javax.persistence.Id
@Entity
public class Funcionario {
Captulo 1 - JPA
Rosiclia Frasson
@Id
@GeneratedValue
private int matricula;
private String nome;
private double 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.
Persistence.xml
Para que a JPA consiga mapear e executar transaes em um banco necessrio definir
10
Captulo 1 - JPA
Rosiclia Frasson
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
as 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 Unidade de
Persistncia.
11
Captulo 1 - JPA
Rosiclia Frasson
12
Captulo 1 - JPA
Rosiclia Frasson
</persistence-unit>
</persistence>
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 de persistenceunit, que deve possuir um nome, neste caso, foi definido como ExemploHibernate1PU, mas poderia ser
dado qualquer outro nome.
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 propriedades
especficas 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="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
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
13
Captulo 1 - JPA
Rosiclia Frasson
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 f = new Funcionario();
f.setNome("Joo da Silva Junior Aguinaldo");
f.setSalario(611500.678);
em.getTransaction().begin();
em.persist(f);
em.getTransaction().commit();
14
Captulo 1 - JPA
Rosiclia Frasson
package br.com.rosicleiafrasson.exemplohibernate1.util;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
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.
EntityManager em = JPAUtil.getEntityManager();
15
Captulo 1 - JPA
Rosiclia Frasson
em.close();
Remoo
Para efetuar uma remoo, basta chamar o mtodo remove, passando um objeto Funcionario
com o id populado.
EntityManager em = JPAUtil.getEntityManager();
em.getTransaction().begin();
em.persist(f);
em.getTransaction().commit();
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
@Table (name = "tb_funcionario")
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.
@Column(name = "nome_fun", length = 100, unique = true, nullable = false)
private String nome;
16
Captulo 1 - JPA
Rosiclia Frasson
Para armazenar dados grandes, como imagens e sons, o atributo deve ser anotado com @Lob.
O cdigo a seguir demonstra o uso da anotao.
@Lob
private byte[] foto;
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.
@Transient
private String confirmaSenha;
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.
17
Captulo 1 - JPA
Rosiclia Frasson
O mapeamento das classes ilustradas, deve ser feito conforme os trechos de cdigo abaixo.
package br.com.rosicleiafrasson.exemplohibernate1.modelo;
import java.util.Date;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@MappedSuperclass
public class Pessoa {
@Id
@GeneratedValue
private int id;
private String nome;
@Temporal(TemporalType.DATE)
private Date dataNascimento;
18
Captulo 1 - JPA
Rosiclia Frasson
package br.com.rosicleiafrasson.exemplohibernate1.modelo;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
public class Funcionario extends Pessoa{
@Temporal(TemporalType.DATE)
private Date dataAdmissao;
19
Captulo 1 - JPA
Rosiclia Frasson
package br.com.rosicleiafrasson.exemplohibernate1.modelo;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
public class Cliente extends Pessoa{
@Temporal(TemporalType.DATE)
private Date dataCadastro;
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
20
Captulo 1 - JPA
Rosiclia Frasson
a um funcionrio.
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Conjuge {
@Id @GeneratedValue
private int codigo;
private String nome;
private String cpf;
//Gets e sets
}
package br.com.rosicleiafrasson.cap1mapeamentoonetoone.model;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
public class Funcionario {
21
Captulo 1 - JPA
Rosiclia Frasson
@Id
@GeneratedValue
private int matricula;
private String nome;
private String cpf;
@Temporal(TemporalType.DATE)
private Date dataAdmissao;
@OneToOne
@JoinColumn(name = "conjuge_codigo")
private Conjuge conjuge;
//Gets e sets
}
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.
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
22
Captulo 1 - JPA
Rosiclia Frasson
@Entity
public class Dependente {
@Id @GeneratedValue
private int codigo;
private String nome;
@Temporal(TemporalType.DATE)
private Date dataNascimento;
private String parentesco;
//Gets e sets
}
package br.com.rosicleiafrasson.cap1mapeamentoonetomany.model;
import java.util.Collection;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
public class Funcionario {
@Id @GeneratedValue
private int matricula;
private String nome;
private String cpf;
@Temporal(TemporalType.DATE)
private Date dataNascimento;
@Temporal(TemporalType.DATE)
private Date dataCadastro;
private double salario;
@OneToMany
private Collection<Dependente> dependentes;
//Gets e sets
}
23
Captulo 1 - JPA
Rosiclia Frasson
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.
@OneToMany
@JoinTable(name = "func_depen")
private Collection<Dependente> 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.
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Categoria {
@Id
@GeneratedValue
private int codigo;
private String nome;
private String descricao;
//Gets e sets
}
package br.com.rosicleiafrasson.cap1mapeamentomanytoone.model;
import javax.persistence.Entity;
24
Captulo 1 - JPA
Rosiclia Frasson
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
public class Produto {
@Id
@GeneratedValue
private int codigo;
private String nome;
private double valorUnitario;
@ManyToOne
private Categoria categoria;
//Gets 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.
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Curso {
25
Captulo 1 - JPA
Rosiclia Frasson
@Id
@GeneratedValue
private int codigo;
private String nome;
private String descricao;
//Gets e sets
package br.com.rosicleiafrasson.cap1mapeamentomanytomany.model;
import java.util.Collection;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
public class Aluno {
@Id
@GeneratedValue
private int matricula;
private String nome;
private String cpf;
@Temporal(TemporalType.DATE)
private Date dataNascimento;
@Temporal(TemporalType.DATE)
@ManyToMany
private Collection<Curso> cursos;
//Gets e sets
26
Captulo 2 - Generics
Rosiclia Frasson
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 generics permite 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 ExemploGenerico<T> {
}
27
Captulo 2 - Generics
Rosiclia Frasson
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 T pesquisar (I pk) {
T 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.
package br.com.rosicleiafrasson.cap2jpagenerico.model.persistencia.dao;
import java.util.List;
import javax.persistence.EntityManager;
28
Captulo 2 - Generics
Rosiclia Frasson
T save(T entity);
EntityManager getEntityManager();
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.
package br.com.rosicleiafrasson.cap2jpagenerico.model.persistencia;
import br.com.rosicleiafrasson.cap2jpagenerico.model.persistencia.dao.DAO;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.swing.JOptionPane;
@Override
public T save(T entity) {
T saved = null;
try {
getEntityManager().getTransaction().begin();
saved = getEntityManager().merge(entity);
getEntityManager().getTransaction().commit();
} catch (Exception e) {
if (getEntityManager().getTransaction().isActive() == false) {
getEntityManager().getTransaction().begin();
}
29
Captulo 2 - Generics
Rosiclia Frasson
getEntityManager().getTransaction().rollback();
JOptionPane.showMessageDialog(null, "Erro ao salvar elemento na base de
dados" + e.getMessage());
}
return saved;
}
@Override
public boolean remove(Class<T> classe, I pk) {
boolean estado = false;
try {
getEntityManager().getTransaction().begin();
getEntityManager().remove(getEntityManager().getReference(classe, pk));
getEntityManager().getTransaction().commit();
} catch (Exception e) {
if (getEntityManager().getTransaction().isActive() == false) {
getEntityManager().getTransaction().begin();
}
getEntityManager().getTransaction().rollback();
JOptionPane.showMessageDialog(null, "Erro ao remover elemento na base de
dados" + e.getMessage());
}
return estado;
}
@Override
public T getById(Class<T> classe, I pk) {
try {
return getEntityManager().find(classe, pk);
} catch (NoResultException e) {
return null;
}
}
@Override
public List<T> getAll(Class<T> classe) {
return getEntityManager().createQuery("select x from " + classe.getSimpleName()
+ " x").getResultList();
}
@Override
30
Captulo 2 - Generics
Rosiclia Frasson
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Pessoa {
@Id @GeneratedValue
private int id;
private String nome;
//Gets 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.
package br.com.rosicleiafrasson.cap2jpagenerico.model.persistencia.dao;
import br.com.rosicleiafrasson.cap2jpagenerico.model.Pessoa;
31
Captulo 2 - Generics
Rosiclia Frasson
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.
package br.com.rosicleiafrasson.cap2jpagenerico.model.persistencia;
import br.com.rosicleiafrasson.cap2jpagenerico.model.Pessoa;
import br.com.rosicleiafrasson.cap2jpagenerico.model.persistencia.dao.PessoaDAO;
if (emf == null) {
emf = Persistence.createEntityManagerFactory(UNIT_NAME);
}
if (em == null) {
em = emf.createEntityManager();
}
return em;
}
}
32
Captulo 2 - Generics
Rosiclia Frasson
import br.com.rosicleiafrasson.cap2jpagenerico.model.Pessoa;
import br.com.rosicleiafrasson.cap2jpagenerico.model.persistencia.PessoaDAOJPA;
import java.util.List;
dao.save(p);
}
}
}
33
Captulo 2 - Generics
Rosiclia Frasson
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
utilizados por todas as entidades, o ideal que os mesmos sejam
implementados em seus DAOs especficos.
34
Captulo 3 - HTML
Rosiclia Frasson
HTML
O W3C, rgo responsvel pela padronizao da internet, define HTML (Hyper Text Markup
Language) como uma linguagem de marcao para a construo de pginas web, ou seja, todas as
pginas web do mundo inteiro so construdas utilizando 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
u
tag
feito utilizando uma barra /.
Estrutura HTML
Todos os documentos HTML possuem obrigatoriamente uma estrutura padro composta pelas
tags html, head e body. Segue um detalhamento sobre essas tags essenciais em documentos HTML:
<html> </html>
Essa tag indica o incio e o fim do documento html. Dentro desta tag so
necessrias as tags head e body, apresentadas a seguir.
<head> </head>
<body> </body>
Dentro da tag body so definidas informaes que devem ser exibidas pelo
browser.
35
Captulo 3 - HTML
Rosiclia Frasson
</body>
</html>
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 exibidos na rea do documento no navegador.
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,
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 utilizadas:
Tag
Descrio
36
Captulo 3 - HTML
link
Rosiclia Frasson
Define um pargrafo.
<p>Lorem
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Etiam eget ligula eu lectus lobortis condimentum. Aliquam
nonummy auctor massa. Pellentesque habitant morbi tristique
senectus et netus et malesuada fames ac turpis egestas. Nulla
at
risus.
Quisque
purus
magna,
auctor
et,
sagittis
ac,
risus.
Quisque
purus
magna,
auctor
et,
sagittis
ac,
ul / li
table / tr / td
37
Captulo 3 - HTML
Rosiclia Frasson
<tr>
<td>Clula 1</td>
<td>Clula 2</td>
</tr>
<tr>
<td>Clula 3</td>
<td>Clula 4</td>
</tr>
</table>
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:
Valor atributo type
Descrio
text
password
id=
id="name"
/>
Campo de senha.
Senha:<input type="password" name="senha"
"senha">
radio
Boto de opo.
38
Captulo 3 - HTML
Rosiclia Frasson
Sexo: <br>
<input type="radio" name="sexo" value="m">Masculino
Masculino<br>
<input type="radio" name="sexo" value="f">Feminino
Feminino<br>
checkbox
Caixa de seleo.
Veculo:
Veculo:<br>
<input type="checkbox" name="veiculo"
value=
value="Bicicleta">Bicicleta<br>
<input type="checkbox" name="veiculo" value="Carro"
"Carro">Carro<br>
<input type="checkbox" name="veiculo"
value=
value="Motocicleta">Motocicleta<br>
submit
reset
39
Captulo 3 - HTML
Rosiclia Frasson
textArea: Campo de entrada de dados que pode possuir mais de uma linha.
Observaes: <br>
<textarea name="observacoes"cols="30"
name=
rows="4"></textarea>
></textarea>
PASSO-A-PASSO
Exemplo pgina html
1. No projeto criado no passo-a-passo
passo anterior, o arquivo index.html deve conter o cdigo mostrado
abaixo.
<!DOCTYPE html>
<html>
<head>
<title>
<title>Exemplo
pgina HTML</title>
<meta charset="UTF-8">
charset=
</head>
<body>
<h1>Primeira
Primeira pgina HTML</h1>
HTML
<p>Essa
Essa a primeira pgina usando HTML.</p>
HTML.
</body>
</html>
40
Captulo 3 - HTML
Rosiclia Frasson
HTML 5
Estrutura bsica do HTML 5
41
Captulo 3 - HTML
Rosiclia Frasson
informaes de contato.
<section>:: Delimita as sees de um documento.
<nav>:: Representa uma seo da pgina que contm um conjuntos de links de navegao.
Geralmente esse elemento utilizado no menu principal e nos blocos de links colocados no
rodap.
<aside>: Representa um contedo secundrio que no faz parte do contedo principal do site.
Esta marcao bastante utilizada em sidebars e publicidade.
<article>:: Delimita um contedo que se constitui em um componente autosuficiente que pode
ser distribudo ou reusado de forma independente. recomendado o uso deste elemento em
posts de frums e blogs, notcias e comentrios.
<main>:: Define o contedo principal da pgina, ou seja, representa o contedo mais importante
da pgina.
Descrio
tel
search
url
42
Captulo 3 - HTML
Rosiclia Frasson
Site:
<input type="url" name="site" >
datetime
datetime-local
date
month
week
43
Captulo 3 - HTML
time
Rosiclia Frasson
number
range
color
44
Captulo 3 - HTML
Rosiclia Frasson
Recursos de formulrios
Recurso
Descrio
autofocus
placeholder
required
maxlenght
patternn
Determina
rmina que o preenchimento do campo deve seguir um padro definido por
uma expresso regular.
Descrio
audio
video
45
Captulo 3 - HTML
Rosiclia Frasson
46
Captulo 4 - CSS
Rosiclia Frasson
CSS
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. Como visto no
captulo anterior a criao de pginas utilizando apenas componentes JSF,
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
utros 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 folhas de estilo externas, j que essa abordagem 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. Segue exemplo de
declarao de uma folha de estilo.
<head>
<link rel="stylesheet"
"stylesheet" type="text/css" href="style.css"
"style.css">
</head>
Sintaxe do CSS
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 aplicado. Cada propriedade deve
possuir um valor.
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 html. J a
classe reutilizvel, ou seja, pode ser repetida na mesma pgina.
Os seletores podem ser combinados para aplicar formataes mais especficas. Tambm
possvel aplicar um bloco de declaraes para mais de um seletor.
se
47
Captulo 4 - CSS
Rosiclia Frasson
HTML
CSS
<div id="cabecalho">
#cabecalho{
/*Declaraes*/
</div>
<div id="conteudo">
<div class="subtitulo">
#conteudo{
<p>subttulo 1 </p>
/*Declaraes*/
</div>
<div class="subtitulo">
<p>subttulo 2 </p>
#rodape{
</div>
/*Declaraes*/
</div>
<div id="rodape">
Aqui vai o rodap do site
.subtitulo{
</div>
/*Declaraes*/
}
Propriedades
background-color
background-image
background-repeat
48
Captulo 4 - CSS
Rosiclia Frasson
background-repeat: no-repeat;
}
background-attachment
color
text-align
text-decoration
text-transform
49
Captulo 4 - CSS
text-ident
Rosiclia Frasson
font-family
font-style
font-size
h1 {
font-size:40px;
}
list-style-type
50
Captulo 4 - CSS
Rosiclia Frasson
width
height
float
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:link
51
Captulo 4 - CSS
Rosiclia Frasson
color: green;
}
a:visited
a:hover
a: active
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 elemento.
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.
52
Captulo 4 - CSS
Rosiclia Frasson
border-style
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
border-color
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{
margin:25px 50px 75px 100px;
}
h1{
margin-top: 10px;
margin-bottom: 20px;
margin-left: 15px;
margin-right: 30px;
}
padding
Define uma margem interna para o elemento, ou seja, a distncia entre o limite do
53
Captulo 4 - CSS
Rosiclia Frasson
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
box-shadow
54
Captulo 4 - CSS
Rosiclia Frasson
text-shadow
linear-gradient
55
Captulo 4 - CSS
Rosiclia Frasson
@font-face {
font
font-family:
alexbrush;
src url('AlexBrush-Regular.ttf');
src:
}
p{
font
font-family:
alexbrush;
font
font-size:40px;
}
PASSO-A-PASSO
Construo de um menu horizontal
1. Inicialmente necessrio construir uma lista no ordenada. Os itens da lista devem ser links. Esta
lista deve ficar dentro do elemento NAV.
<!DOCTYPE HTML>
<html>
<head>
<title>Exemplo
Exemplo</title>
<meta charset="UTF-8">
charset=
<link rel="stylesheet"
rel=
href="css/style.css" />
</head>
<body>
<header>
<nav id="menu">
id=
<ul>
<li><a href="#lancamento">Lanamento</a></li>
</a></li>
<li><a href="#marca">Marca</a></li>
<li><a href="#campanha">Campanha</a></li>
</a></li>
<li><a href="#colecao">Coleo</a></li>
56
Captulo 4 - CSS
Rosiclia Frasson
<li><a href="#contato">Contato</a></li>
</ul>
</nav>
</header>
</body>
</html>
3. Por padro as listas HTML possuem um recuo a esquerda. Para remover o recuo necessrio
setar valor 0 para margin e para o padding.
#menu ul {
margin:0;
padding:0;
list-style-type: none;
}
57
Captulo 4 - CSS
Rosiclia Frasson
4. Para forar que os elementos fiquem em uma mesma linha necessrio aplicar a formatao a
seguir.
#menu ul li {
display: inline;
}
6. Cada item da lista deve se comportar como uma caixa, para que a formatao possa ser aplicada.
O elemento padding concede esse efeito. Para que o mesmo seja visvel foi aplicada uma cor de
fundo nos links presentes na lista. Tambm foi alterada a cor, o tamanho e o peso da fonte.
#menu ul li a {
text-decoration: none;
padding: 10px 30px;
color: #FFFFFF;
background-color: #1C1C1C;
font-size:18px;
font-weight:bold;
}
58
Captulo 4 - CSS
Rosiclia Frasson
7. Para que o menu fique atraente, interessante alterar a formatao quando o mouse for
posicionado sobre o elemento. Foi alterada a cor da fonte e a cor de fundo.
#menu ul li a:hover {
background
background-color:#999999;
color:
color:#000000;
box
box-shadow:
0 5px 10px #CCC;
text
text-shadow:
1px 1px 2px #FFFFFF;
}
8. Para que o menu fique centralizado na pgina, necessrio adicionar uma nova formatao.
#menu ul {
margin:0;
padding:0;
list-style-type: none;
text-align: center;
}
PASSO-A-PASSO
Construo formulrio de contato
1. Inicialmente necessrio construir um formulrio de contato. Aproveitando as tags da HTML5 o
formulrio foi colocado dentro de uma section. Com o intuito de deixar o formulrio mais clean, os
campos no possuem rtulo, apenas uma informao indicativa sobre o que ele representa usando o
atributo placeholder.
Para auxiliar ma formatao os botes esto dispostos dentro de uma div.
<!DOCTYPE HTML>
<html>
<head>
<title>Exemplo
Exemplo formulrio contato</title>
contato
<meta charset="UTF-8">
<link rel="stylesheet" href="css/style.css"
href=
/>
</head>
<body>
<section>
<header>
59
Captulo 4 - CSS
Rosiclia Frasson
<h2>Entre
Entre em contato!</h2>
contato!
<h6>Ornare
Ornare nulla proin odio consequat sapien vestibulum ipsum sed lorem.</h6>
lorem.
</header>
<div class="pnBotoes"
"pnBotoes">
<a href="#" class="button">Enviar Mensagem</a>
<a href="#" class="button">Limpar Formulrio</a>
</div>
</form>
</section>
</body>
</html>
2. Para melhorar a aparncia do formulrio necessrio aplicar algumas regras de CSS. Inicialmente
devem ser definidas as regras aplicadas a todo o corpo da pgina. No trecho de cdigo a seguir
podem ser identificadas regras para alterar a cor do fundo e da fonte da pgina.
body
body{
background-color: #303030;
color: #FFFFFF;
}
60
Captulo 4 - CSS
Rosiclia Frasson
2. Para formatar o ttulo foram aplicadas regras para alterar o tamanho da fonte, deixar o texto
centralizado e com uma sombra. Alm disso, foram atribudos valores para margem do elemento,
lembrando que o atributo h2 possui um tamanho de margem default que diferente em cada
navegador.
h2{
font-size: 30px;
text-align: center;
text-shadow: -1px -1px 0px #181818;
margin: 0 0 10px 0;
}
3. O subttulo do formulrio no momento apenas um Lorem ipsum. Este tipo de texto muito
utilizado na diagramao, com a finalidade de verificar o layout, a tipografia e a formatao quando
no possvel colocar o contedo real. As formataes aplicadas so similares a formatao do
ttulo, apenas um atributo referente ao peso da fonte.
h6{
font-size: 18px;
text-align: center;
font-weight: lighter;
margin: 0 0 10px 0;
}
4. Para deixar o formulrio centralizado necessrio que o mesmo tenha um tamanho definido. A
propriedade margin com os valores 0 auto centraliza qualquer elemento de bloco.
form{
width: 900px;
margin: 0 auto;
}
61
Captulo 4 - CSS
Rosiclia Frasson
5. Nas caixas de entrada de texto foi definida uma margem superior para atribuir um espaamento
entre os elementos.
entos. A propriedade padding aumenta o espao entre o texto e a borda do elemento,
neste caso foi setado o valor de 10 pixels. Tambm foi alterado o tamanho, a cor e o tipo de fonte
utilizado. Uma melhor estilizao foi possvel aumentando a largura dos elementos,
elementos, para que estes
fossem renderizados na largura total do formulrio. Outra alterao importante foi a retirada da borda
padro e a definio de uma borda arredondada e com sombreamento. A parte interna dos
componentes ganhou uma cor de fundo diferente
diferen para um melhor destaque.
input,textarea{
margin:15px 0 0 0;
;
border:0;
background: #282828;
#282828
box-shadow:
shadow: inset 0px 2px 5px 0px rgba(0,0,0,0.50), 0px 1px 0px 0px
rgba(255,255,255,0.050
050);
color: #FFFFFF;
border-radius: 8px;
8px
width: 100%;
padding: 10px;
font-size: 18px;
font-family:
family: Times New Roman, serif;
}
7. O campo mensagem deve ser um pouco maior, dessa forma deve ser aplicado uma altura para o
mesmo.
textarea{
height:150px;
}
62
Captulo 4 - CSS
Rosiclia Frasson
9. Para retirar a formatao de link e melhorar o visual do boto algumas regras foram aplicadas.
Inicialmente foi colocada uma margem no painel que abriga os botes para forar um espaamento
com os demais campos do formulrio. Alm disso foram colocadas bordas, sombreamento, cor de
fundo e espaamento. Tambm foi retirada a formatao do link.
l
As pseudo-classes
classes hover e active formatam o boto na passagem do mouse e quando o elemento
clicado.
.pnBotoes{
margin-top:
top: 50px;
}
.button {
border-top:
top: 1px solid #96d1f8;
background: #65a9d7;
background: -moz-linear-gradient(top, #3e779d, #65a9d7);
);
padding: 15px 20px;
border-radius:
radius: 9px;
box-shadow:
shadow: rgba(0,0,0,1)
rgba(
0 1px 0;
text-shadow:
shadow: rgba(0,0,0,.4)
rgba(
0 1px 0;
color: white;
white
font-family:
family: Times New Roman, serif;
text-decoration:
decoration: none;
font-size: 20px;
20px
63
Captulo 4 - CSS
Rosiclia Frasson
font-weight:
weight: bold;
margin-right:
right:10px;
}
.button:hover {
border-top-color:
color: #28597a;
background: #28597a;
color: #fffaff;
#fffaff
}
.button:active
:active {
border-top-color:
color: #1b435e;
background: #1b435e;
}
10. Para centralizar os botes no formulrio necessrio definir uma posio absoluta para o objeto e
definir uma distncia de 50% do lado esquerdo do documento (left: 50%). Para facilitar essa
manipulao a mesma ser aplicada na div que abriga os botes.
.pnBotoes{
margin-top: 50px;
position:absolute;
left: 50%;
}
64
Captulo 4 - CSS
Rosiclia Frasson
11. O CSS no usa o centro do objeto como referncia para o posicionamento, mas sim as
extremidades. Sendo assim, o que ficar no centro ser o canto esquerdo do objeto.
Para alinhar no centro necessrio identificar a largura do objeto (neste caso 400px). Identificada a
largura necessrio definir uma margem do lado esquerdo com o valor negativo da metade da
largura do objeto (200px).
.pnBotoes{
margin-top: 50px;
position:absolute;
left: 50%;
margin-left: -200px;
}
65
Captulo 4 - CSS
Rosiclia Frasson
PASSO-A-PASSO
Construo barra redes sociais com font icons
Para a construo de um barra de links para as redes sociais necessrio a utilizao de
cones. Antes do advento do CSS3 eram utilizadas imagens para este fim. No entanto, com o
aumento da variedade de dispositivos com resolues de telas diferentes e diversidade
di
de densidade
de pixels ficou invivel trabalhar desta forma.
Atualmente a melhor soluo para utilizao de cones a utilizao de uma famlia de fonte
no formato de cone. Como exemplos de fonts de cones podem ser citados o fontello e o icomoons.
icom
No exemplo a seguir ser utilizado o icomoons.
1. Inicialmente necessrio acessar o repositrio da fonte e escolher os cones que sero utilizados:
http://icomoon.io/app/#/select.
2. Clicando em Font, a pgina redirecionada para os cones escolhidos com seus respectivos
identificadores.
66
Captulo 4 - CSS
Rosiclia Frasson
3. necessrio fazer o download. Na pasta do download juntamente com os arquivos de fontes tem
um arquivo html e uma folha de estilo css com o demo dos cones baixados. Para utiliz-los,
necessrio copiar a pasta fonts para a pasta do projeto onde os cones devem ser utilizados.
4. Os botes referentes as redes sociais devem ser inseridos em uma lista de links. A seguir est
representado o cdigo HTML da pgina. Em cada elemento da lista atribuda uma classe para
posterior formatao.
<!DOCTYPE HTML>
<html>
<head>
<title>Exemplo redes sociais</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<div id="social">
<ul>
<li><a class="icon-googleplus" href="#"></a></li>
<li><a class="icon-googledrive" href="#"></a></li>
<li><a class="icon-facebook" href="#"></a></li>
<li><a class="icon-instagran" href="#"></a></li>
<li><a class="icon-twitter" href="#"></a></li>
<li><a class="icon-youtube" href="#"></a></li>
<li><a class="icon-picassa" href="#"></a></li>
<li><a class="icon-github" href="#"></a></li>
<li><a class="icon-blogger" href="#"></a></li>
<li><a class="icon-skype" href="#"></a></li>
<li><a class="icon-linkedin" href="#"></a></li>
<li><a class="icon-pinterest" href="#"></a></li>
</ul>
</div>
</body>
</html>
67
Captulo 4 - CSS
Rosiclia Frasson
url('fonts/icomoon.svg?fe14q2#icomoon') format('svg');
font-weight: normal;
font-style: normal;
}
6. Para adicionar o cone necessrio criar um pseudo-elemento antes (before) de qualquer objeto
que tenha no atributo class um valor que inicia com icon-.
[class^="icon-"]:before, [class*="icon-"]:before {
font-family: 'icomoon';
font-style: normal;
speak: none;
}
7. O pseudo-elemento before trabalha em parceria com uma propriedade chamada content. Sendo
assim em cada classe atribuda na propriedade content, o cdigo do cone correspondente.
.icon-googleplus:before {
content: '\e600';
}
.icon-googledrive:before {
content: '\e601';
}
.icon-facebook:before {
content: '\e602';
}
.icon-instagran:before {
content: '\e3';
}
.icon-twitter:before {
content: '\e603';
}
.icon-youtube:before {
content: '\e6';
}
.icon-picassa:before {
content: '\e604';
68
Captulo 4 - CSS
Rosiclia Frasson
.icon-github:before {
content: '\e605';
}
.icon-blogger:before {
content: '\e606';
}
.icon-skype:before {
content: '\ec';
}
.icon-linkedin:before {
content: '\ed';
}
.icon-pinterest:before {
content: '\e607';
}
69
Captulo 4 - CSS
Rosiclia Frasson
padding:
padding:0;
list
list-style-type:
none;
text
text-align:
center;
#social ul li {
display: inline;
}
#social ul li a {
text
text-decoration:
none;
padding: 10px;
color: #FFFFFF;
background
background-color:
#1C1C1C;
font
font-size:18px;
font
font-weight:bold;
border
border-radius:
3px;
}
#social ul li a:hover {
color:
color:#000000;
box
box-shadow:
0 5px 10px #CCC;
text
text-shadow:
1px 1px 2px #FFFFFF;
background: #999999;
}
70
Captulo 5 - Java EE
Rosiclia Frasson
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.
71
Captulo 5 - Java EE
Rosiclia Frasson
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 fornecedores de 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
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.
72
Captulo 5 - Java EE
Rosiclia Frasson
2. Na guia Nome e Localizao, necessrio dar um nome ao projeto e identificar a pasta onde o
mesmo ficar armazenado.
73
Captulo 5 - Java EE
Rosiclia Frasson
3. Na guia Servidores e Definies deve ser escolhido como Servidor o Glassfish 4.0.
74
Captulo 5 - Java EE
Rosiclia Frasson
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 aplicao. Nesta
configurao apresentada, considerando a porta default do glassfish - 8080 - para o acesso da
aplicao deve ser utilizado o seguinte endereo:
http://localhost:8080/ExemploAplicacaoWeb/
6. O projeto criado obedece o 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.
75
Captulo 5 - Java EE
Rosiclia Frasson
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.
76
Captulo 5 - Java EE
Rosiclia Frasson
modelo request-response.
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.
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.
<!DOCTYPE html>
<html>
<head>
<title>Exemplo pgina HTML</title>
<meta charset="UTF-8">
</head>
<body>
<h1>Primeira pgina HTML</h1>
<p>Essa a primeira pgina usando HTML.</p>
</body>
</html>
77
Captulo 6 - Servlets
Rosiclia Frasson
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-se
notou se que a web tinha enorme poder de
comunicao e para a interao com os usurios, seriam necessrias pginas que gerassem contedo
dinamicamente baseadas
eadas 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, 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.
@WebServlet
@WebServlet(urlPatterns
= {"/MeuServlet"})
public class MeuServlet extends HttpServlet {
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.
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.
78
Captulo 6 - Servlets
Rosiclia Frasson
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. A estrutura do projeto deve ser similar a figura a seguir:
79
Captulo 6 - Servlets
Rosiclia Frasson
2. Com o boto secundrio em cima do pacote criado, clique em Novo, opo Servlet.
@WebServlet(urlPatterns = {"/PrimeiraServlet"})
public class PrimeiraServlet extends HttpServlet {
/**
* Processes requests for both HTTP
* <code>GET</code> and
* <code>POST</code> methods.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
80
Captulo 6 - Servlets
Rosiclia Frasson
PrimeiraServlet
at
"
request.getContextPath()
"</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
/**
* Handles the HTTP
* <code>POST</code> method.
*
* @param request servlet request
81
Captulo 6 - Servlets
Rosiclia Frasson
/**
* Returns a short description of the servlet.
*
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
}
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.
82
Captulo 6 - Servlets
Rosiclia Frasson
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.
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.
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.
<!DOCTYPE html>
<html>
<head>
<title>Mtodo GET</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
</head>
<body>
<form name="teste" method="GET" action="/Cap4ServletGet/ServletController">
<table>
<tr>
<td>Nome: </td>
<td><input type="text" name="nome"></td>
83
Captulo 6 - Servlets
Rosiclia Frasson
</tr>
<tr>
<td>Idade: </td>
<td><input type="text" name="idade"></td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" value="Salvar"/>
<input type="reset" value="Limpar"/>
</td>
</tr>
</table>
</form>
</body>
</html>
protected
void
processRequest(HttpServletRequest
request,
HttpServletResponse
response)
throws ServletException, IOException {
PrintWriter pw = response.getWriter();
String nome = request.getParameter("nome");
int idade = Integer.parseInt(request.getParameter("idade"));
pw.println("<html><body>");
pw.println("<h1>Valores digitados</h1>");
pw.println("Nome: " + nome);
pw.println("</br>");
pw.println("Idade: " + idade);
84
Captulo 6 - Servlets
Rosiclia Frasson
pw.println("</body></html>");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
}
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.
<!DOCTYPE html>
<html>
<head>
<title>Mtodo POST</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
</head>
<body>
<form name="teste" method="POST"
action="/Cap4ServletPost/ServletController">
<table>
<tr>
85
Captulo 6 - Servlets
Rosiclia Frasson
<td>Nome: </td>
<td><input type="text" name="nome"></td>
</tr>
<tr>
<td>Idade: </td>
<td><input type="text" name="idade"></td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" value="Salvar"/>
<input type="reset" value="Limpar"/>
</td>
</tr>
</table>
</form>
</body>
</html>
86
Captulo 6 - Servlets
Rosiclia Frasson
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
}
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.
87
Captulo 7 - JSP
Rosiclia Frasson
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.
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.
<%@page contentType="text/html" pageEncoding="UTF-8"%>
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.
<%@include file="header.html"%>
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.
<%@taglib prefix="teste" uri="taglib.tdl"%>
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, 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 declaraes devem estar entre <%! e %>.
88
Captulo 7 - JSP
Rosiclia Frasson
<%!int i = 0;%>
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 --%>.
<%-Document
: resultado
: Rosiclia Frasson
--%>
PASSO-A-PASSO
1. No Netbeans deve ser criado um projeto Java web, o mesmo deve ficar com a estrutura mostrada a
seguir.
89
Captulo 7 - JSP
Rosiclia Frasson
: index
Created on : 20/12
12/2013, 11:10:29
Author
: Rosiclia Frasson
--%>
<%@page language="java"
"java" contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv=
equiv="Content-Type" content="text/html;
"text/html; charset=UTF-8">
charset=UTF
90
Captulo 7 - JSP
Rosiclia Frasson
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.
<%-Document
: resultado
: Rosiclia Frasson
--%>
91
Captulo 7 - JSP
Rosiclia Frasson
8">
<title>Exemplo pgina JSP</title>
</head>
<body>
<%
double base =
Double.parseDouble(request.getParameter("base"));
double altura =
Double.parseDouble(request.getParameter("altura"));
double area = base * altura;
double perimetro = (base + altura) * 2;
%>
<h1>Exemplo pgina JSP</h1>
<p>Clculo rea retngulo</p>
<table border="1">
<tr>
<td colspan="2"><b>Dados fornecidos pelo usurio</b></td>
</tr>
<tr>
<td>Base</td>
<td><%=base%></td>
</tr>
<tr>
<td>Altura</td>
<td><%=altura%></td>
</tr>
<tr>
<td colspan="2">
<b>Dados calculados pelo aplicativo</b>
</td>
</tr>
<tr>
<td>rea</td>
<td><%=area%></td>
</tr>
</table>
</html>
No scriptlet contido logo aps o incio do bloco body, primeiramente so obtidos os valores dos
parmetros - base e altura - enviados pelo usurio e convertidos para o tipo double. 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.
92
Captulo 7 - JSP
Rosiclia Frasson
93
Captulo 7 - JSP
Rosiclia Frasson
Java Beans
PASSO-A-PASSO
Para exemplificar o uso do bean, o exemplo apresentado anteriormente ser modificado.
m
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.
<%-Document
: index
Created on : 20/12
12/2013, 11:10:29
Author
: Rosiclia Frasson
--%>
94
Captulo 7 - JSP
Rosiclia Frasson
95
Captulo 7 - JSP
Rosiclia Frasson
4. Tambm necessrio a criao de uma servlet que captura os dados da pgina index e envia para
o bean.
package br.com.rosicleiafrasson.cap7exemplojavabean.controller;
import br.com.rosicleiafrasson.cap5exemplojavabean.modelo.Retangulo;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
96
Captulo 7 - JSP
Rosiclia Frasson
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
}
5. Por fim, a criaao da pgina resultado.jsp que exibe os dados calculados pelo aplicativo.
<%-Document
: index
: Rosiclia Frasson
--%>
<%@page import="br.com.rosicleiafrasson.cap7exemplojavabean.modelo.Retangulo"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Exemplo pgina JSP</title>
</head>
<body>
<%
Retangulo ret = (Retangulo) request.getAttribute("retanguloBean");
%>
<h1>Clculo rea retngulo</h1>
<table border="1">
97
Captulo 7 - JSP
Rosiclia Frasson
<tr>
<td colspan="2"><b>Dados fornecidos pelo usurio</b></td>
</tr>
<tr>
<td>Base</td>
<td><%=ret.getBase()%></td>
</tr>
<tr>
<td>Altura</td>
<td><%=ret.getAltura()%></td>
</tr>
<tr>
<td colspan="2"><b>Dados calculados pelo aplicativo</b></td>
</tr>
<tr>
<td>rea</td>
<td><%=ret.getArea()%></td>
</tr>
</table>
</body>
</html>
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.
98
Rosiclia Frasson
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
nida 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
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
proveitamento 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
torn
um processo
mais difcil. A separao das responsabilidades em camadas pr-estabelecidas
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
S
os mais conhecidos.
Struts
99
Rosiclia Frasson
VRaptor
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
documentao em portugus.
Spring
um framework open source para
para gerenciar componentes e um conjunto de servios para
interfaces de usurios, 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 aplicao.
100
Rosiclia Frasson
JSF
O Java Server Faces (JSF) foi desenvolvido pelo comit JCP - Java Community Process - e
est especificado na JSR 314 (Java Specification Request) . Por ser uma especificao, existem
diversos fornecedores que desenvolvem a implementao.
O JSF prov
rov 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
componente 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
Struts. Alm da integrao com frameworks de mapeamento objeto-relacional
objeto relacional como Hibernate,
EclipseLink.
101
Captulo 9 - JSF
Rosiclia Frasson
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.
102
Captulo 9 - JSF
Rosiclia Frasson
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
</h:head>
<h:body>
Hello JSF!
</h:body>
</html>
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.
103
Captulo 9 - JSF
Rosiclia Frasson
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.
104
Captulo 9 - JSF
Rosiclia Frasson
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.
105
Captulo 9 - JSF
Rosiclia Frasson
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="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
106
Captulo 9 - JSF
Rosiclia Frasson
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>faces/index.xhtml</welcome-file>
</welcome-file-list>
</web-app>
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: xmlns:h="http://java.sun.com/jsf/html". 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='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>Primeira pgina JSF</title>
</h:head>
<h:body>
Hello JSF!
</h:body>
</html>
107
Captulo 9 - JSF
Rosiclia Frasson
108
Captulo 9 - JSF
Rosiclia Frasson
Managed Bean
Em aplicaes
es 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
manag 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
face
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.faces.bean.ManagedBean;
@ManagedBean
public class Hello {
}
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.
@ManagedBean (name = "outroNome")
public class Hello {
}
Para que um managed bean disponibilize dados para as telas necessrio a criao dos
109
Captulo 9 - JSF
Rosiclia Frasson
mtodos gets.
private String saudacao = "Primeira pgina JSF 2.0";
Para o recebimento de dados pelos managed bean necessrio a criao dos mtodos sets.
public void setSaudacao(String saudacao) {
this.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.
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.
<h:outputText value="#{hello.saudacao}"/>
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.
package br.com.rosicleiafrasson.cap9managedbean;
import javax.faces.bean.ManagedBean;
110
Captulo 9 - JSF
Rosiclia Frasson
@ManagedBean
public class Hello {
111
Captulo 9 - JSF
Rosiclia Frasson
112
Rosiclia Frasson
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.
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
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
html
PUBLIC
"-//W3C//DTD
XHTML
1.0
Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
113
Rosiclia Frasson
<title>Exemplo formulrio</title>
</h:head>
<h:body>
<h:form>
<!--Aqui
Aqui devem ser colocados os campos do formulrio-->
formulrio
</h:form>
</h:body>
</html>
inputText
Campo de entrada de dados com apenas uma linha. Pode ser vinculado
com um atributo de um managed bean.
<h:inputText value="#{usuarioBean.usuario.nome}"
"#{usuarioBean.usuario.nome}" id="nome"/>
inputTextArea
inputSecret
value="#{usuarioBean.usuario.observacoes}"
"#{usuarioBean.usuario.observacoes}"
inputHidden
/>
Campo oculto. Este campo pode ser utilizado para inserir informaes
que devem ser enviadas automaticamente quando um formulrio
enviado ao servidor.
<h:inputHidden/>
outputLabel
outputLink
114
Rosiclia Frasson
<h:outputLink value="http://www.google.com">
<h:outputText value="Para
"Para mais informaes clique aqui"/>
</h:outputLink>
outputFormat
outputText
commandButton
commandLink
message
115
Rosiclia Frasson
</h:inputText>
<h:message for="idade"/>
</h:panelGroup>
messages
graphicImage
selectOneListBox
116
selectOneMenu
Rosiclia Frasson
selectOneRadio
selectBooleanCheckBox
117
Rosiclia Frasson
selectManyCheckBox
selectManyListBox
118
selectManyMenu
Rosiclia Frasson
panelGrid
119
Rosiclia Frasson
<f:selectItem itemLabel="Feminino"
"Feminino" itemValue="F"/>
<f:selectItem itemLabel="Masculino"
"Masculino" itemValue="M"/>
</h:selectOneRadio>
</h:panelGrid>
panelGroup
<h:panelGroup>
h:panelGroup>
<h:inputText value="#{usuarioBean.usuario.login}"
"#{usuarioBean.usuario.login}"
id=
id="login"
validatorMessage="O
"O login deve ser composto apenas por
letras e deve possuir entre 6 e 18 caracteres.">
caracteres."
<f:validateRegex pattern="[a-z]{6,18}"
z]{6,18}"/>
</h:inputText>
<h:message for="login"/>
</h:panelGroup>
120
dataTable
Rosiclia Frasson
121
Rosiclia Frasson
import br.com.rosicleiafrasson.cap10componentestabela.modelo.Contato;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
@ManagedBean
public class ContatoBean {
<h:head>
<title>Exemplo Tabela</title>
</h:head>
<h:body>
<h:form>
<h:dataTable border="1"
value="#{contatoBean.contatos}" var="contato">
<f:facet name="header">
<h:outputText value="Agenda de Contatos"/>
</f:facet>
122
Rosiclia Frasson
<h:column>
<f:facet name="header">
<h:outputText value="Nome"/>
value=
</f:facet>
<h:outputText value="#{contato.nome}"
"#{contato.nome}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Telefone"/>
value=
</f:facet>
<h:outputText
value=
value="#{contato.telefone}"/>
</h:column>
</h:dataTable>
</h:form>
</h:body>
</html>
column
123
Rosiclia Frasson
Descrio
id
binding
rendered
columns="4" rendered="#{funcionarioBean.ehUsuario}">
styleClass
Especifica uma classe CSS que contm definies de estilo. Pode ser
utilizado em todos os elementos HTML.
<h:inputText value="#{candidatoBean.candidato.nome}"
id="nome" styleClass="cxTexto" />
value
valueChangeListener
<h:selectOneMenu id="cidades">
<f:selectItems value="#{testeBean.cidades}" />
</h:selectOneMenu>
converter
124
Rosiclia Frasson
<h:selectOneMenu value="#{cadastrarMoradorBean.morador.apartamento}"
"#{cadastrarMoradorBean.morador.apartamento}"
converter=
converter="entityConverter">
<f:selectItems value="#{cadastrarMoradorBean.apartamentos}"
"#{cadastrarMoradorBean.apartamentos}"
var="apartamento"
"apartamento" itemLabel="#{apartamento.apartamento}"
"#{apartamento.apartamento}"/>
</h:selectOneMenu>
validator
required
Descrio
accesskey
acceptcharset
alt
border
dir
disable
125
Rosiclia Frasson
maxlenght
readonly
rel
rows
size
style
tabindex
Descrio
onblur
onchange
onclick
126
Rosiclia Frasson
onfocus
onkeydown
onkeypress
onkeyup
onmousedown
onmousemove
onmouseout
onmouseover
onmouseup
onreset
onselect
onsubmit
Biblioteca Core
Tag
Descrio
view
subview
facet
127
Rosiclia Frasson
<h:column>
<f:facet name="header">
<h:outputText value="Telefone"/>
value=
</f:facet>
<h:outputText value="#{contato.telefone}"
"#{contato.telefone}"/>
</h:column>
</h:dataTable>
attribute
param
action
actionListener
valueChangeListener
Conversores:
128
convertDateTime
Rosiclia Frasson
convertNumber
129
Rosiclia Frasson
<h:inputText value="#{candidatoBean.candidato.peso}"
"#{candidatoBean.candidato.peso}" id="peso">
<f:convertNumber maxIntegerDigits="3" />
</h:inputText>
130
Rosiclia Frasson
converter
Validadores
validateDoubleRange
validateLenght
validateLongRange
131
Rosiclia Frasson
validateRegex
<h:panelGroup>
<h:inputText value="#{usuarioBean.usuario.login}"
"#{usuarioBean.usuario.login}"
id=
id="login"
validatorMessage="O
"O login deve ser composto apenas por
letras e deve possuir entre 6 e 18 caracteres.">
caracteres."
<f:validateRegex pattern="[a-z]{6,18}"
z]{6,18}"/>
</h:inputText>
<h:message for="login"/>
</h:panelGroup>
validator
loadBundle
selectItems
132
Rosiclia Frasson
<f:selectItems value="#{usuarioBean.areas}"
"#{usuarioBean.areas}"/>
</h:selectOneMenu>
selectItem
133
Rosiclia Frasson
PASSO-A-PASSO
Cadastro de currculo
Para exemplificar o uso de componentes JSF, uma pgina para cadastro de currculos 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.
package br.com.rosicleiafrasson.curriculo.model;
//Gets e sets
}
2. Ainda no pacote modelo, a classe Conhecimento tem por objeto armazenar os conhecimentos
tcnicos que os candidatos possuem.
package br.com.rosicleiafrasson.curriculo.model;
//Gets e sets
}
3. Para facilitar possveis manutenes, o endereo do usurio tambm deve possuir uma classe.
package br.com.rosicleiafrasson.curriculo.model;
//Gets e sets
}
134
Rosiclia Frasson
package br.com.rosicleiafrasson.curriculo.model;
import java.util.Date;
import java.util.List;
public Candidato() {
endereco = new Endereco();
}
//Gets 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.
package br.com.rosicleiafrasson.curriculo.controller;
135
Rosiclia Frasson
import br.com.rosicleiafrasson.curriculo.model.Candidato;
import br.com.rosicleiafrasson.curriculo.model.Cargo;
import br.com.rosicleiafrasson.curriculo.model.Conhecimento;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class CandidatoBean {
public CandidatoBean() {
candidatos = new ArrayList<>();
candidato = new Candidato();
cargos = new ArrayList<>();
conhecimentos = new ArrayList<>();
136
Rosiclia Frasson
return cargos;
}
137
Rosiclia Frasson
return candidatos;
}
<h:head>
<title>Currculo</title>
</h:head>
<h:body>
<div id="cabecalho">
<h1>Revoluo People Soft</h1>
<p>Venha fazer parte da empresa que est transformando o Brasil</p>
</div>
<div id="pagina">
<div id="tituloPrincipal">
<h:panelGrid columns="2">
<h:graphicImage value="/imagens/estrela.png" alt="estrela"/>
<h3>CADASTRE SEU CURRCULO</h3>
</h:panelGrid>
</div>
<div id="formulario">
<h:form>
138
Rosiclia Frasson
<h:messages/>
<fieldset>
<legend>DADOS PESSOAIS</legend>
<h:inputHidden value="#{candidatoBean.candidato.codigo}"/>
<h:panelGrid columns="2">
139
Rosiclia Frasson
<h:selectBooleanCheckbox id="deficiente"
value="#{candidatoBean.candidato.ehDeficiente}"/>
<h:outputLabel value="Portador de necessidades especiais"
for="deficiente"/>
</h:panelGrid>
</fieldset>
<br />
<br />
<fieldset>
<legend>ENDEREO</legend>
140
Rosiclia Frasson
<h:panelGrid columns="2">
<h:outputLabel value="Endereo: " for="endereco"/>
<h:inputText value="#{candidatoBean.candidato.endereco.endereco}"
id="endereco" size="75" />
141
Rosiclia Frasson
<fieldset>
<legend>DADOS DE ACESSO</legend>
<h:panelGrid columns="2">
<h:panelGroup>
<h:outputLabel value="Login: " for="login" />
<h:graphicImage value="/imagens/ajuda.png" alt="ajuda"/>
</h:panelGroup>
<h:panelGroup>
<h:inputText value="#{candidatoBean.candidato.login}" id="login"
validatorMessage="O login deve ser composto apenas por letras e deve possuir entre 6 e 18
caracteres.">
<f:validateRegex pattern="[a-z]{6,18}"/>
</h:inputText>
<h:message for="login"/>
</h:panelGroup>
</h:panelGrid>
142
Rosiclia Frasson
</fieldset>
<br />
<br />
<fieldset>
<legend>FORMAO E EXPERINCIAS PROFISSIONAIS</legend>
<h:panelGrid columns="2">
<h:panelGrid columns="1">
<h:outputLabel value="Habilidades/Conhecimentos: "
for="conhecimento"/>
<h:selectManyCheckbox id="conhecimento"
value="#{candidatoBean.candidato.conhecimentos}" layout="pageDirection" >
143
Rosiclia Frasson
<f:selectItems value="#{candidatoBean.conhecimentos}"/>
</h:selectManyCheckbox>
</h:inputText>
</h:panelGrid>
</fieldset>
<br />
<h:commandButton value="Cadastrar"
action="#{candidatoBean.adicionarCandidato}" />
<br />
144
Rosiclia Frasson
<br />
<h:outputLink value="http://www.google.com">
<h:outputText value="Para mais informaes clique aqui"/>
</h:outputLink>
<br />
<br />
<br />
</h:form>
</div>
</div>
</h:body>
</html>
<h:head>
<title>Currculo</title>
</h:head>
<h:body>
<h:form>
<h3>Candidatos</h3>
<h:dataTable border="1" var="candidatos" value="#{candidatoBean.candidatos}">
<h:column>
<f:facet name="header">Nome</f:facet>
#{candidatos.nome}
</h:column>
<h:column>
<f:facet name="header">CPF</f:facet>
#{candidatos.cpf}
</h:column>
<h:column>
145
Rosiclia Frasson
<f:facet name="header">Data
name=
de Nascimento</f:facet>
<h:outputText value="#{candidatos.dataNascimento}">
<f:convertDateTime
f:convertDateTime pattern="dd/MM/yyyy" />
</h:outputText>
</h:column>
<h:column>
<f:facet name="header">Telefone</f:facet>
name=
#{candidatos.telefone}
</h:column>
</h:dataTable>
<br/>
<h:commandButton value="Cadastrar"
value=
action="cadastro" />
</h:form>
</h:body>
</html>
Vale lembrar que a codificao apresentada salva o candidato apenas em uma lista. Sendo
assim, os dados so temporrios, ou seja, para cada execuo criada uma lista vazia. Serve apenas
para exemplificar o uso dos componentes JSF.
Executando o projeto, a pgina exibida deve ser semelhante
semelhante a figura a seguir.
146
Rosiclia Frasson
PASSO-A-PASSO
Com o intuito de deixar o projeto apresentado - 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
pgina.
<h:head>
<title>Currculo
Currculo</title>
<h:outputStylesheet library="css" name="style.css"/>
/>
</h:head>
#cabecalho{
width: 800px;
height: 100px;
margin: 0 auto;
}
#cabecalho h1,
, #cabecalho p{
margin: 0;
padding: 0;
}
#cabecalho h1{
{
147
Rosiclia Frasson
font-size: 52px;
color: #20A001;
}
#cabecalho p{
margin-top: 0px;
margin-left: 30px;
padding: 0 0 0 4px;
font-size: 15px;
font-weight: normal;
color: #86EA66;
text-transform: uppercase;
}
#pagina{
width: 800px;
margin: 0 auto;
padding: 0px;
background: #ffffff;
box-shadow: 5px 4px 10px #333, -5px -5px 10px #ccc;
#tituloPrincipal{
text-transform: uppercase;
background-color: #20A001;
color: #FFFFFF;
font-size: 15px;
}
#formulario{
margin: 20px;
}
fieldset{
border-radius: 5px;
}
148
Rosiclia Frasson
149
Rosiclia Frasson
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.
@ManagedBean
@RequestScoped
public class ExemploEscopoRequest {
}
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.
@ManagedBean
@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 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.
150
Rosiclia Frasson
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.
@ManagedBean
@ApplicationScoped
public class ExemploEscopoAplicacao {
}
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.
@ManagedBean
@ViewScoped
public class ExemploEscopoView {
}
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.
package br.com.rosicleiafrasson.cap11escopos.modelo;
151
Rosiclia Frasson
2. Para controlar os dados recebidos e enviados pela visualizao, necessrio criar um managed
bean. Neste primeiro exemplo ser utilizado o escopo request.
package br.com.rosicleiafrasson.cap11escopos.controle;
import br.com.rosicleiafrasson.cap11escopos.modelo.Aluno;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean
@RequestScoped
public class AlunoBean {
152
Rosiclia Frasson
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='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<h:head>
<title>Primeira pgina JSF</title>
</h:head>
<h:body>
<h:form>
<h:panelGrid columns="2">
<h:outputLabel value="Nome: " for="nome"/>
<h:inputText value="#{alunoBean.aluno.nome}" id="nome"/>
<h:commandButton value="Adicionar"
action="#{alunoBean.adicionaAluno}"/>
</h:panelGrid>
</h:form>
Executando a aplicao uma pgina semelhante a pgina mostrada a seguir deve ser exibida.
153
Rosiclia Frasson
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.
package br.com.
.rosicleiafrasson.cap11escopos.controle;
import br.com.rosicleiafrasson.cap11escopos.modelo.Aluno;
br.com.rosicleiafrasson.cap11escopos.modelo.Aluno
import java.util.ArrayList;
java.util.ArrayList
import java.util.List;
java.util.List
import javax.faces.bean.ManagedBean;
javax.faces.bean.ManagedBean
import javax.faces.bean.SessionScoped;
javax.faces.bean.SessionScoped
@ManagedBean
@SessionScoped
public class AlunoBean {
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.
154
Rosiclia Frasson
Se o managed bean for alterado para escopo de aplicao, possvel perceber que mesmo em
sees distintas os valores
alores contidos na lista de alunos continuam os mesmos.
ackage br.com
com.rosicleiafrasson.cap11escopos.controle;
import br.com.rosicleiafrasson.cap11escopos.modelo.Aluno;
br.com.rosicleiafrasson.cap11escopos.modelo.Aluno;
import java.util.ArrayList;
java.util.ArrayList
import java.util.List;
java.util.List
import javax.faces.bean.ApplicationScoped;
javax.faces.bean.ApplicationScoped
import javax.faces.bean.ManagedBean;
javax.faces.bean.ManagedBean
@ManagedBean
@ApplicationScoped
public class AlunoBean {
155
Rosiclia Frasson
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,
adiciona
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.
package br.com.rosicleiafrasson
rosicleiafrasson.cap11escopos.controle;
import br.com.rosicleiafrasson.cap11escopos.modelo.Aluno;
br.com.rosicleiafra
import java.util.ArrayList;
java.util.ArrayList
import java.util.List;
java.util.List
import javax.faces.bean.ManagedBean;
javax.faces.bean.ManagedBean
import javax.faces.bean.ViewScoped;
javax.faces.bean.ViewScoped
156
Rosiclia Frasson
@ManagedBean
@ViewScoped
public class AlunoBean {
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.
157
Captulo 12 - Facelets
Rosiclia Frasson
Facelets
Facelets um framework utilizado para a construo de pginas com templates padronizados,
bem como para a criao de componentes customizveis.
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 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
faz 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 pasta WEB-INF
WEB
para
que o usurio no consiga acess-las
las diretamente.
Em pginas que utilizam facelets necessrio
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, demarca onde ser, por
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 arquivos, o que facilita a manuteno.
ui:define
ui:composition
158
Captulo 12 - Facelets
Rosiclia Frasson
PASSO-A-PASSO
Criao de um template
Como j mencionado um template nunca deve ser executado, pois trata-se
trata
de uma pgina
incompleta. Dessa forma recomendado que os templates fiquem dentra da pasta WEB-INF
WEB
para que
o 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
asta criada, necessrio um arquivo com extenso .xhtml. No caso ilustrado foi
criado o arquivo template.xhtml.
<h:head>
</h:head>
<h:body>
<div id="topo"
"topo">
Topo
</div>
<div id="conteudo"
"conteudo">
<ui:insert name="conteudo">Contedo</ui:insert>
</div>
159
Captulo 12 - Facelets
Rosiclia Frasson
<div id="menuLateral"
"menuLateral">
Menu Lateral
</div>
<div id="rodape"
"rodape">
Rodap
</div>
</h:body>
</html>
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 menu, rodap e cabealho exibidos
exibido
sero os que foram definidos no template.
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:ui=
template=
template="./WEB-INF/templates/template.xhtml"
INF/templates/template.xhtml"
xmlns ="http://www.w3.org/1999/xhtml">
=
<ui:define name="conteudo">
name=
Pgina inicial
</ui:define>
</ui:composition>
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
160
Captulo 12 - Facelets
Rosiclia Frasson
index.
5. O posicionamento de cada trecho deve ser feito utilizando CSS.
#topo {
position: relative;
background
background-color:
#036fab;
padding: 5px;
margin: 0px 0px 10px 0px;
}
#rodape {
position: relative;
background
background-color:
#c2dfef;
padding: 5px;
margin: 10px 0px 0px 0px;
}
#menuLateral {
float: left;
background
background-color:
#ece3a5;
padding: 5px;
width: 150px;
}
#conteudo {
float: right;
background
background-color:
#ccffcc;
padding: 5px;
width: 450px;
}
161
Captulo 12 - Facelets
Rosiclia Frasson
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.
<ui:composition
:composition xmlns:ui="http://java.sun.com/jsf/facelets"
"http://java.sun.com/jsf/facelets"
xmlns ="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:form>
<ul>
<li
li>Cadastro</li>
<li
li>Relatrio</li>
</ul>
</h:form>
</ui:composition
:composition>
7. Na pgina onde o menu deve ser incluso, neste caso, o template, deve ser adicionado o comando a
seguir.
<div
div id="menuLateral">
<ui:include src="menu.xhtml"/>
</
</div>
162
Captulo 13 - Filtros
Rosiclia Frasson
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 JPAFilter implements Filter{
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
}
@Override
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 colocados
antes da chamada chain.doFilter so executados na ida e os comandos colocados aps so executados
na volta.
chain.doFilter(request, response);
163
Captulo 13 - Filtros
Rosiclia Frasson
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.
request.setAttribute("EntityManager", 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.
@WebFilter(servletNames = "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="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="cap13ConexaoBancoFiltroPU" transactiontype="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.hbm2ddl.auto"
value="update"/>
<property name ="hibernate.dialect"
value ="org.hibernate.dialect.MySQLDialect"/>
<property name ="javax.persistence.jdbc.driver"
value ="com.mysql.jdbc.Driver"/>
<property name ="javax.persistence.jdbc.user"
164
Captulo 13 - Filtros
Rosiclia Frasson
value ="root"/>
<property name ="javax.persistence.jdbc.password"
value =""/>
<property name ="javax.persistence.jdbc.url"
value
="jdbc:mysql://localhost:3306/cap13ConexaoBancoFiltro"/>
</properties>
</persistence-unit>
</persistence>
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 JPAFilter implements Filter{
}
3. A interface Filter exige que sejam implementados os mtodos init, destroy e doFilter.
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public
void
doFilter(ServletRequest
request,
ServletResponse
response,
FilterChain
@Override
public void destroy() {
}
4. A classe EntityManagerFactory descobre quem cria as conexes e necessrio uma varivel para
armazenar uma instncia da mesma.
private EntityManagerFactory factory;
5.
Para
obter
uma
instncia
de
EntityManagerFactory
utilizado
o
mtodo
createEntityManagerFactory indicando qual a persistence-unit que foi definida no persistence.xml,
no nosso caso cap13ConexaoBancoFiltro. Esse procedimento feito no mtodo init.
public void init(FilterConfig filterConfig) throws ServletException {
this.factory = Persistence.createEntityManagerFactory("cap13ConexaoBancoFiltroPU");
}
165
Captulo 13 - Filtros
Rosiclia Frasson
this.factory.close();
}
try {
manager.getTransaction().commit();
} catch (Exception e) {
manager.getTransaction().rollback();
} finally {
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.
@WebFilter(servletNames = "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.
package br.com.rosicleiafrasson.cap13conexaobancofiltro.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
@Entity
public class Cargo {
@Id @GeneratedValue
private int codigo;
private String nome;
166
Captulo 13 - Filtros
Rosiclia Frasson
@Lob
private String descricao;
//Gets e sets
}
package br.com.rosicleiafrasson.cap13conexaobancofiltro.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Endereco {
@Id @GeneratedValue
private int codigo;
private String endereco;
private String bairro;
private String cidade;
private String estado;
private int numero;
private String complemento;
//Gets e sets
}
package br.com.rosicleiafrasson.cap13conexaobancofiltro.model;
import java.util.Date;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
public class Funcionario {
167
Captulo 13 - Filtros
Rosiclia Frasson
@Id
@GeneratedValue
private int codigo;
private String nome;
private String cpf;
@Temporal(TemporalType.DATE)
private Date dataNascimento;
@ManyToOne
private Cargo cargo;
private String telefone;
private String email;
@OneToOne(cascade = CascadeType.ALL)
private Endereco endereco;
public Funcionario() {
endereco = new Endereco();
}
//Gets 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.
package br.com.rosicleiafrasson.cap13conexaobancofiltro.model.persistencia.dao;
import java.io.Serializable;
import java.util.List;
168
Captulo 13 - Filtros
Rosiclia Frasson
package br.com.rosicleiafrasson.cap13conexaobancofiltro.model.persistencia;
import br.com.rosicleiafrasson.cap13conexaobancofiltro.model.persistencia.dao.DAO;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;
@Override
public void save(T entity) {
this.manager.merge(entity);
}
@Override
public void remove(Class<T> classe, I pk) {
T entity = this.getById(classe, pk);
this.manager.remove(entity);
}
@Override
public T getById(Class<T> classe, I pk) {
try {
return this.manager.find(classe, pk);
} catch (NoResultException e) {
return null;
}
}
@Override
public List<T> getAll(Class<T> classe) {
Query q = this.manager.createQuery("select x from "
+ classe.getSimpleName() + " x");
169
Captulo 13 - Filtros
Rosiclia Frasson
return q.getResultList();
}
}
11. Para que as entidades possam utilizar o DAO genrico, necessrio criar a interface e sua
implementao para cada uma delas.
package br.com.rosicleiafrasson.cap13conexaobancofiltro.model.persistencia.dao;
import br.com.rosicleiafrasson.cap13conexaobancofiltro.model.Cargo;
package br.com.rosicleiafrasson.cap13conexaobancofiltro.model.persistencia;
import br.com.rosicleiafrasson.cap13conexaobancofiltro.model.Cargo;
import br.com.rosicleiafrasson.cap13conexaobancofiltro.model.persistencia.dao.CargoDAO;
import javax.persistence.EntityManager;
package br.com.rosicleiafrasson.cap13conexaobancofiltro.model.persistencia.dao;
import br.com.rosicleiafrasson.cap13conexaobancofiltro.model.Endereco;
package br.com.rosicleiafrasson.cap13conexaobancofiltro.model.persistencia;
import br.com.rosicleiafrasson.cap13conexaobancofiltro.model.Endereco;
import br.com.rosicleiafrasson.cap13conexaobancofiltro.model.persistencia.dao.EnderecoDAO;
import javax.persistence.EntityManager;
170
Captulo 13 - Filtros
Rosiclia Frasson
package br.com.rosicleiafrasson.cap13conexaobancofiltro.model.persistencia.dao;
import br.com.rosicleiafrasson.cap13conexaobancofiltro.model.Funcionario;
package br.com.rosicleiafrasson.cap13conexaobancofiltro.model.persistencia;
import br.com.rosicleiafrasson.cap13conexaobancofiltro.model.Funcionario;
import
br.com.rosicleiafrasson.cap13conexaobancofiltro.model.persistencia.dao.FuncionarioDAO;
import javax.persistence.EntityManager;
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.
package br.com.rosicleiafrasson.cap13conexaobancofiltro.controller;
import br.com.rosicleiafrasson.cap13conexaobancofiltro.model.Cargo;
import br.com.rosicleiafrasson.cap13conexaobancofiltro.model.persistencia.CargoDAOJPA;
import br.com.rosicleiafrasson.cap13conexaobancofiltro.model.persistencia.dao.CargoDAO;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletRequest;
171
Captulo 13 - Filtros
Rosiclia Frasson
@ManagedBean
public class CargoBean {
public CargoBean() {
cargo = new Cargo();
}
172
Captulo 13 - Filtros
Rosiclia Frasson
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.
package br.com.rosicleiafrasson.cap13conexaobancofiltro.controller;
import br.com.rosicleiafrasson.cap13conexaobancofiltro.model.Cargo;
import br.com.rosicleiafrasson.cap13conexaobancofiltro.model.Funcionario;
import br.com.rosicleiafrasson.cap13conexaobancofiltro.model.persistencia.CargoDAOJPA;
import br.com.rosicleiafrasson.cap13conexaobancofiltro.model.persistencia.FuncionarioDAOJPA;
import br.com.rosicleiafrasson.cap13conexaobancmodel.persistencia.dao.CargoDAO;
import br.com.rosicleiafrasson.cap13conexaobancofiltro.model.persistencia.dao.FuncionarioDAO;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletRequest;
@ManagedBean
public class FuncionarioBean {
public FuncionarioBean() {
173
Captulo 13 - Filtros
Rosiclia Frasson
if (this.cargoId != 0) {
Cargo cargo = cargoDao.getById(Cargo.class, cargoId);
this.funcionario.setCargo(cargo);
}
dao.save(funcionario);
funcionario = new Funcionario();
this.listaFuncionarios = null;
return "/paginas/lista-funcionarios.xhtml?faces-redirect=true";
}
174
Captulo 13 - Filtros
Rosiclia Frasson
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.
175
Captulo 13 - Filtros
Rosiclia Frasson
Sendo assim, o template deve possuir os blocos estticos cabealho, menu lateral e rodap e o 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='1.0' encoding='UTF-8'
encoding='UTF
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD
//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
"http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
"http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
"http://xmlns.jcp.org/jsf/facelets">
<h:head>
<title>Gesto
Gesto de Recursos Humanos</title>
Humanos
<h:outputStylesheet library="css"
library=
name="style.css"/>
</h:head>
<h:body>
<div id="cabecalho">
<h1>Gesto
Gesto de Recursos Humanos</h1>
Humanos
<p>Verso 1.0</p>
</div>
<div id="pagina">
<div id="conteudo">
<ui:insert name="conteudo"
"conteudo">
</ui:insert>
</div>
<div id="menuLateral"
"menuLateral">
<ui:include src="../menu.xhtml"
"../menu.xhtml">
176
Captulo 13 - Filtros
Rosiclia Frasson
</ui:include>
</div>
</div>
<div style="clear:both"> </div>
<div id="rodape">
<p>©2014 All Rights Reserved • Rosiclia Frasson</p>
</div>
</h:body>
</html>
<ui:composition xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns ="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
Menu
</ui:composition>
<ui:composition xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
template="./WEB-INF/templates/template.xhtml"
xmlns ="http://www.w3.org/1999/xhtml">
<ui:define name="conteudo">
Pgina inicial
</ui:define>
</ui:composition>
16. Executando o projeto deve ser exibida uma pgina similar a imagem a seguir.
177
Captulo 13 - Filtros
Rosiclia Frasson
17. Para melhorar o aspecto da pgina sero inclusas algumas regras no arquivo style.css.
body{
margin: 0;
padding: 0;
background: #F6F6F6;
font-size: 14px;
text-align: justify;
}
body input{
width: 200px;
}
178
Captulo 13 - Filtros
Rosiclia Frasson
h1 {
letter-spacing: -2px;
font-size: 3em;
}
p,ul{
line-height: 200%;
}
a{
color: #34BA01;
}
a:hover{
color: #34BA01;
}
#cabecalho{
width: 920px;
height: 100px;
margin: 0 auto;
}
#cabecalho h1, p{
margin: 0;
padding: 0;
}
#cabecalho h1{
font-size: 52px;
color: #20A001;
}
#cabecalho p{
margin-top: -15px;
padding: 0px 0px 0px 4px;
font-size: 20px;
font-weight: normal;
color: #86EA66;
text-transform: lowercase;
}
179
Captulo 13 - Filtros
Rosiclia Frasson
#pagina{
width: 920px;
margin: 0 auto;
background: #ffffff;
border-radius: 10px;
box-shadow: 0px 0px 10px #cccccc;
position: relative;
}
#conteudo{
width: 660px;
margin: 0;
color: #666666;
float: right;
}
#menuLateral{
background: #86EA66;
width: 200px;
color: #FFFFFF;
border-radius: 10px 0 0 10px;
border: 10px solid #ffffff;
}
#rodape{
width: 800px;
margin: 0 auto;
height: 50px;
text-align: center;
font-size: 11px;
font-family: Arial, Helvetica, sans-serif;
color: #86EA66;
margin-bottom: 27px;
}
180
Captulo 13 - Filtros
Rosiclia Frasson
<h:form>
<ul>
<li>
<h2>Cadastros</h2>
<ul>
<li><h:commandLink value="Cargo"
action="/faces/paginas/cargo.xhtml"/></li>
<li><h:commandLink value="Funcionrio"
action="/faces/paginas/funcionario.xhtml"/></li>
</ul>
</li>
<li>
<h2>Listagens</h2>
<ul>
<li><h:commandLink value="Cargo"
action="/faces/paginas/lista-cargos.xhtml"/></li>
<li><h:commandLink value="Funcionrio"
action="/faces/paginas/lista-funcionarios.xhtml"/></li>
</ul>
</li>
<li>
181
Captulo 13 - Filtros
Rosiclia Frasson
<h2>Relatrios</h2>
<ul>
<li><h:commandLink value="Cargo" /></li>
<li><h:commandLink value="Funcionrio" /></li>
</ul>
</li>
</ul>
</h:form>
</ui:composition>
#menuLateral ul{
margin: 10px;
padding: 0;
list-style: none;
}
#menuLateral li{
margin: 0;
padding: 0;
}
#menuLateral li ul{
margin-bottom: 40px;
padding: 0 15px;
}
#menuLateral li ul li{
margin: 0;
padding: 0;
line-height: 35px;
border-bottom: 1px #A3F389 dashed;
}
#menuLateral h2{
width: 180px;
height: 32px;
padding-left: 10px;
background-image: -webkit-gradient(linear,left top,left bottom, color-stop(0,
182
Captulo 13 - Filtros
Rosiclia Frasson
#1D9B01),color-stop(1, #35BA01));
background-image: -o-linear-gradient(bottom, #1D9B01 0%, #35BA01 100%);
background-image: -moz-linear-gradient(bottom, #1D9B01 0%, #35BA01 100%);
background-image: -webkit-linear-gradient(bottom, #1D9B01 0%, #35BA01 100%);
background-image: -ms-linear-gradient(bottom, #1D9B01 0%, #35BA01 100%);
background-image: linear-gradient(to bottom, #1D9B01 0%, #35BA01 100%);
font-size: 18px;
color: #FFFFFF;
}
#menuLateral a{
text-decoration: none;
color: #FFFFFF;
font-weight: bold;
}
#menuLateral a:hover{
text-decoration: none;
}
21. Criado o menu, necessrio construir as pginas correspondentes a manuteno dos cargos e
183
Captulo 13 - Filtros
Rosiclia Frasson
<ui:define name="conteudo">
<h:form acceptcharset="ISO-8859-1">
<h:inputHidden value="#{cargoBean.cargo.codigo}"/>
<fieldset>
<legend>Cadastro de Cargo</legend>
<h:panelGrid columns="3">
</h:panelGrid>
</fieldset>
<br />
<h:panelGroup>
<h:commandButton value="Salvar"
action="#{cargoBean.insere}" accesskey="S"
styleClass="botao"/>
184
Captulo 13 - Filtros
Rosiclia Frasson
</h:form>
</ui:define>
</ui:composition>
.
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{
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #108c00),
color-stop(1, #37bf01) );
background:-moz-linear-gradient( center top, #108c00 5%, #37bf01 100% );
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#108c00',
endColorstr='#37bf01');
background-color:#108c00;
-webkit-border-top-left-radius:6px;
-moz-border-radius-topleft:6px;
border-top-left-radius:6px;
-webkit-border-top-right-radius:6px;
-moz-border-radius-topright:6px;
border-top-right-radius:6px;
-webkit-border-bottom-right-radius:6px;
-moz-border-radius-bottomright:6px;
border-bottom-right-radius:6px;
185
Captulo 13 - Filtros
Rosiclia Frasson
-webkit-border-bottom-left-radius:6px;
-moz-border-radius-bottomleft:6px;
border-bottom-left-radius:6px;
text-indent:0;
border:1px solid #dcdcdc;
display:inline-block;
color:#ffffff;
font-family:arial;
font-size:13px;
font-weight:normal;
font-style:normal;
height:30px;
line-height:50px;
width:80px;
text-decoration:none;
text-align:center;
}
.botao:hover {
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #37bf01),
color-stop(1, #108c00) );
background:-moz-linear-gradient( center top, #37bf01 5%, #108c00 100% );
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#37bf01',
endColorstr='#108c00');
background-color:#37bf01;
}.botao:active {
position:relative;
top:1px;
}
#conteudo{
padding: 20px;
}
fieldset{
border-radius: 5px;
}
24. Ao executar a aplicao possvel perceber que o formulrio ficou com aspecto melhor.
186
Captulo 13 - Filtros
Rosiclia Frasson
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.
187
Captulo 13 - Filtros
Rosiclia Frasson
<ui:composition xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
template="../WEB-INF/templates/template.xhtml"
xmlns ="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<ui:define name="conteudo">
<h:form acceptcharset="ISO-8859-1">
<h:dataTable value="#{cargoBean.listaCargos}"
var="cargo"
styleClass="tabela"
headerClass="cabecalho"
cellpadding ="10">
<f:facet name="header">
<h:outputText value="Cargos" />
</f:facet>
<h:column>
<f:facet name="header">
<h:outputText value="Cdigo" />
</f:facet>
<h:outputText value="#{cargo.codigo}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Cargo" />
</f:facet>
<h:outputText value="#{cargo.nome}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:commandLink action="/faces/paginas/cargo.xhtml">
<h:graphicImage library="imagens" name="add.png" />
</h:commandLink>
</f:facet>
<h:commandLink
action="#{cargoBean.preparaAlteracao}">
<f:setPropertyActionListener value="#{cargo}"
target="#{cargoBean.cargo}"/>
188
Captulo 13 - Filtros
Rosiclia Frasson
</h:form>
</ui:define>
</ui:composition>
27. Para melhorar o aspecto da tabela devem ser inclusas algumas imagens - add, delete e edit - e
regras CSS para formatao da tabela.
.tabela{
margin:0px;padding:0px;
width:100%;
box-shadow: 5px 5px 2px #888888;
border:1px solid #3f7f00;
}
.tabela table{
border-collapse: collapse;
border-spacing: 0;
width:100%;
height:100%;
margin:0px;
padding:0px;
{ background-color:#ffffff; }
.tabela td{
vertical-align:middle;
189
Captulo 13 - Filtros
Rosiclia Frasson
background:-webkit-
gradient( linear, left top, left bottom, color-stop(0.05, #5fbf00), color-stop(1, #3f7f00) );
background:-moz-linear-gradient( center top, #5fbf00 5%, #3f7f00 100% );
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#5fbf00",
endColorstr="#3f7f00");
background: -o-linear-gradient(top,#5fbf00,3f7f00);
background-color:#5fbf00;
border:0px solid #3f7f00;
text-align:center;
border-width:0px 0px 1px 1px;
font-size:14px;
font-family:Arial;
font-weight:bold;
color:#ffffff;
}
28. Ao executar a aplicao possvel verificar os cargos cadastrados e testar a edio e remoo
dos dados.
190
Captulo 13 - Filtros
Rosiclia Frasson
29. As telas de cadastro e listagem tambm devem ser codificadas para o funcionrio.
<ui:composition xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
template="../WEB-INF/templates/template.xhtml"
xmlns ="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<ui:define name="conteudo">
<h:form acceptcharset="ISO-8859-1">
<h:inputHidden value="#{funcionarioBean.funcionario.codigo}"/>
<fieldset>
<legend>Cadastro de Funcionrio</legend>
<h:panelGrid columns="2">
191
Captulo 13 - Filtros
Rosiclia Frasson
<h:panelGroup>
<h:inputText id="cpf"
value="#{funcionarioBean.funcionario.cpf}"
required="true"
requiredMessage=" necessrio informar o CPF."/>
<h:message for="cpf" errorStyle="color:red"/>
</h:panelGroup>
<hr />
<h:outputText value="Endereo"/>
192
Captulo 13 - Filtros
Rosiclia Frasson
<h:panelGrid columns="4">
</fieldset>
<br />
<h:panelGroup>
<h:commandButton value="Salvar"
action="#{funcionarioBean.insere}"
styleClass="botao"/>
<h:commandButton value="Cancelar" type="reset" styleClass="botao"/>
193
Captulo 13 - Filtros
Rosiclia Frasson
</h:panelGroup>
</h:form>
</ui:define>
</ui:composition>
<ui:composition xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
template="../WEB-INF/templates/template.xhtml"
xmlns ="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<ui:define name="conteudo">
<h:form acceptcharset="ISO-8859-1">
<h:dataTable value="#{funcionarioBean.listaFuncionarios}"
var="funcionario"
styleClass="tabela"
headerClass="cabecalho">
<f:facet name="header">
<h:outputText value="Funcionrios"/>
</f:facet>
<h:column>
<f:facet name="header">
<h:outputText value="Cdigo" />
</f:facet>
<h:outputText value="#{funcionario.codigo}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Nome" />
</f:facet>
<h:outputText value="#{funcionario.nome}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Data de nascimento" />
</f:facet>
194
Captulo 13 - Filtros
Rosiclia Frasson
<h:outputText value="#{funcionario.dataNascimento}">
<f:convertDateTime pattern="dd/MM/yyyy" type="date"/>
</h:outputText>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Cargo" />
</f:facet>
<h:outputText value="#{funcionario.cargo.nome}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:commandLink action="/faces/paginas/funcionario.xhtml">
<h:graphicImage library="imagens" name="add.png" />
</h:commandLink>
</f:facet>
<h:commandLink
action="#{funcionarioBean.preparaAlteracao}">
<f:setPropertyActionListener value="#{funcionario}"
target="#{funcionarioBean.funcionario}"/>
30. A aparncia das telas responsveis pela manuteno dos funcionrios devem ser similares as
imagens a seguir.
195
Captulo 13 - Filtros
Rosiclia Frasson
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.
package br.com.rosicleiafrasson.cap13autenticacaofiltro.model;
import java.util.Date;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
196
Captulo 13 - Filtros
Rosiclia Frasson
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
public class Funcionario {
@Id
@GeneratedValue
private int codigo;
private String nome;
private String cpf;
@Temporal(TemporalType.DATE)
private Date dataNascimento;
@ManyToOne
private Cargo cargo;
private String telefone;
private String email;
@OneToOne(cascade = CascadeType.ALL)
private Endereco endereco;
@Column(unique = true)
private String login;
private String senha;
public Funcionario() {
endereco = new Endereco();
}
//Gets e sets
}
columns="4">
197
Captulo 13 - Filtros
Rosiclia Frasson
</h:panelGroup>
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
try {
HttpServletRequest httpReq = (HttpServletRequest) request;
HttpServletResponse httpRes = (HttpServletResponse) response;
HttpSession session = httpReq.getSession(true);
String url = httpReq.getRequestURL().toString();
if (session.getAttribute("usuarioLogado") == null && precisaAutenticar(url)) {
httpRes.sendRedirect(httpReq.getContextPath() + "/faces/login.xhtml");
} else {
chain.doFilter(request, response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void destroy() {
198
Captulo 13 - Filtros
Rosiclia Frasson
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.
<filter>
<filter-name>ControleAcesso</filter-name>
<filter-class>br.com.rosicleiafrasson.rh.filter.ControleAcesso</filter-class>
</filter>
<filter-mapping>
<filter-name>ControleAcesso</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<filter>
<filter-name>JPAFilter</filter-name>
<filter-class>br.com.rosicleiafrasson.rh.filter.JPAFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>JPAFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
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.
package br.com.rosicleiafrasson.cap13autenticacaofiltro.model.persistencia.dao;
import br.com.rosicleiafrasson.cap13autenticacaofiltro.model.Funcionario;
package br.com.rosicleiafrasson.cap13autenticacaofiltro.model.persistencia;
import br.com.rosicleiafrasson.cap13autenticacaofiltro.model.Funcionario;
import br.com.rosicleiafrasson.cap13autenticacaofiltro.model.persistencia.dao.FuncionarioDAO;
199
Captulo 13 - Filtros
Rosiclia Frasson
import javax.persistence.EntityManager;
import javax.persistence.Query;
@Override
public boolean login(String login, String senha) {
Query q = this.manager.createQuery("select f from Funcionario f where f.login = :login and
f.senha = :senha", Funcionario.class);
q.setParameter("senha", senha);
q.setParameter("login", login);
if (q.getResultList().size() > 0) {
return true;
}
return false;
}
}
import br.com.rosicleiafrasson.cap13autenticacaofiltro.model.persistencia.FuncionarioDAOJPA;
import
br.com.rosicleiafrasson.cap13autenticacaofiltro.model.persistencia.dao.FuncionarioDAO;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
@ManagedBean
@SessionScoped
200
Captulo 13 - Filtros
Rosiclia Frasson
201
Captulo 13 - Filtros
Rosiclia Frasson
this.usuario = usuario;
}
7. Para que o usurio possa efetuar a autenticao necessria a pgina de login, exibida a seguir.
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:pt="http://xmlns.jcp.org/jsf/passthrough">
<h:head>
<title>Gesto de Recursos Humanos</title>
<h:outputStylesheet library="css" name="style.css"/>
</h:head>
<h:body>
<div id="paginaLogin">
<h2>LOGIN </h2>
<h:form>
<h:panelGrid columns="1">
<br />
202
Captulo 13 - Filtros
Rosiclia Frasson
</h:form>
<h:messages />
</div>
</h:body>
</html>
8. Com o intuito de melhorar a aparncia da pgina de login, devem ser aplicadas algumas regras
CSS.
#paginaLogin{
position:absolute;
left:50%;
top:50%;
margin-left:-105px;
margin-top:-100px;
width: 210px;
background: #ffffff;
border-radius: 10px;
box-shadow: 0px 0px 10px #cccccc;
padding: 20px;
}
#paginaLogin .botaoLogin{
font:bold 18px Arial, Helvetica, sans-serif;
font-style:normal;
color:#ffffff;
background:#5e5e54;
border:0px solid #ffffff;
text-shadow:-1px -1px 1px #222222;
box-shadow:2px 2px 5px #000000;
-moz-box-shadow:2px 2px 5px #000000;
-webkit-box-shadow:2px 2px 5px #000000;
border-radius:0px 10px 10px 10px;
-moz-border-radius:0px 10px 10px 10px;
-webkit-border-radius:0px 10px 10px 10px;
width:77px;
height: 40px;
203
Captulo 13 - Filtros
Rosiclia Frasson
padding:10px 20px;
cursor:pointer;
margin:0 auto;
}
#paginaLogin input{
height: 20px;
}
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">
<h:form>
<h:outputFormat value="Ol {0}">
<f:param value="#{loginBean.usuario}" />
</h:outputFormat>
<br />
<h:commandLink value="Logout" action="#{loginBean.registraSaida}" />
</h:form>
</div>
#cabecalho #secao a{
text-decoration: none;
}
underline;
204
Rosiclia Frasson
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.
205
Rosiclia Frasson
Icefaces
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.
206
Rosiclia Frasson
207
Captulo 15 - Primefaces
Rosiclia Frasson
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:
xmlns:p="http://primefaces.org/ui">
Descrio
p:panel
208
Captulo 15 - Primefaces
p:inputText
Rosiclia Frasson
p:selectOneMenu
p:calendar
209
Captulo 15 - Primefaces
p:inputMask
Rosiclia Frasson
p:inputTextarea
p:password
Campo de senha.
<p:password id="senha"
value="#{funcionarioBean.funcionario.senh
a}" feedback="true"/>
p:commandButton
210
Captulo 15 - Primefaces
Rosiclia Frasson
</p:commandButton>
p:dataTable
<p:column>
<f:facet name="header">
<p:commandButton action="/faces/paginas/cargo.xhtml"
icon="ui-icon-plus">
</p:commandButton>
</f:facet>
<p:commandButton
action="#{cargoBean.preparaAlteracao}" icon="ui-iconpencil">
<f:setPropertyActionListener value="#{cargo}"
target="#{cargoBean.cargo}"/>
</p:commandButton>
<p:commandButton
action="#{cargoBean.remove}" icon="ui-icon-close">
<f:setPropertyActionListener value="#{cargo}"
target="#{cargoBean.cargo}"/>
211
Captulo 15 - Primefaces
Rosiclia Frasson
</p:commandButton>
</p:column>
</p:dataTable>
p:layout
</p:layoutUnit>
<p:layoutUnit
Todos
os
position="south"
direitos
reservados
size="35"
header="©2014
•
Rosiclia
</p:layoutUnit>
<p:layoutUnit
position="west"
size="200"
resizable="true"
closable="true" collapsible="true">
<ui:include src="../menu.xhtml"/>
</p:layoutUnit>
<p:layoutUnit position="center">
<div id="conteudo">
<ui:insert name="conteudo">
</ui:insert>
</div>
</p:layoutUnit>
212
Captulo 15 - Primefaces
Rosiclia Frasson
</p:layout>
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.
Skins
O primefaces possui integrao com o framework ThemeRoller do JQuery. Atualmente existem
24 temas disponveis para serem utilizados nas aplicaes.
213
Captulo 15 - Primefaces
Rosiclia Frasson
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:
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.
214
Captulo 15 - Primefaces
Rosiclia Frasson
index
<f:view contentType="text/html">
<h:head>
<f:facet name="first">
<meta content='text/html; charset=UTF-8' http-equiv="Content-Type"/>
<title>PrimeFaces</title>
</f:facet>
</h:head>
<h:body>
215
Captulo 15 - Primefaces
Rosiclia Frasson
<p:layout fullPage="true">
</p:submenu>
</p:menu>
</p:layoutUnit>
<p:layoutUnit position="center">
Welcome to PrimeFaces
</p:layoutUnit>
</p:layout>
</h:body>
</f:view>
</html>
216
Captulo 15 - Primefaces
Rosiclia Frasson
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 dotluv.
6. O prximo passo adicionar a biblioteca ao projeto. No menu propriedade, biblioteca, adicionar
jar/pasta, selecione o jar correspondente a biblioteca.
217
Captulo 15 - Primefaces
Rosiclia Frasson
7. O web.xml tambm deve ser alterado para indicar que o tema deve ser alterado.
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>dot-luv</param-value>
</context-param>
218
Captulo 15 - Primefaces
Rosiclia Frasson
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='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Gesto de Recursos Humanos</title>
<h:outputStylesheet library="css" name="style.css"/>
219
Captulo 15 - Primefaces
Rosiclia Frasson
</h:head>
<h:body>
<p:layout fullPage="true">
</p:layoutUnit>
</p:layoutUnit>
<p:layoutUnit position="center">
<div id="conteudo">
<ui:insert name="conteudo">
</ui:insert>
</div>
</p:layoutUnit>
</p:layout>
</h:body>
</html>
<h:form>
220
Captulo 15 - Primefaces
Rosiclia Frasson
<p:submenu label="Servios">
<p:menuitem value="Treinamento e Desenvolvimento" url="#" />
<p:menuitem value="Folha de Pagamento" url="#" />
<p:menuitem value="Ponto Eletrnico" url="#" />
<p:menuitem value="Gesto de Benefcios" url="#" />
</p:submenu>
</p:panelMenu>
</h:form>
</ui:composition>
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.
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>rocket</param-value>
</context-param>
221
Captulo 15 - Primefaces
Rosiclia Frasson
5. As pginas de cadastro e listagem de cargos e funcionrios tambm devem ser alteradas. Seguem
a codificao e a aparncia das pginas.
<ui:composition xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
template="../WEB-INF/templates/template.xhtml"
xmlns ="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui">
<ui:define name="conteudo">
<h:form acceptcharset="ISO-8859-1">
<p:messages id="messages" closable="true"/>
<h:inputHidden value="#{cargoBean.cargo.codigo}"/>
<p:panel header="Cadastro de Cargo">
<h:panelGrid columns="2">
necessrio
informar
222
Captulo 15 - Primefaces
Rosiclia Frasson
nome do cargo."/>
<p:panel>
<p:commandButton ajax="false"
value="Salvar"
action="#{cargoBean.insere}"/>
<p:commandButton value="Cancelar"
type="reset"/>
</p:panel>
</h:panelGrid>
</p:panel>
</h:form>
</ui:define>
</ui:composition>
<ui:composition xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
template="../WEB-INF/templates/template.xhtml"
xmlns ="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
223
Captulo 15 - Primefaces
Rosiclia Frasson
xmlns:p="http://primefaces.org/ui">
<ui:define name="conteudo">
<h:form acceptcharset="ISO-8859-1" id="form">
<p:column>
<f:facet name="header">
<p:commandButton action="/faces/paginas/cargo.xhtml" icon="ui-icon-plus">
</p:commandButton>
</f:facet>
<p:commandButton
action="#{cargoBean.preparaAlteracao}" icon="ui-icon-pencil">
<f:setPropertyActionListener value="#{cargo}"
target="#{cargoBean.cargo}"/>
</p:commandButton>
<p:commandButton
action="#{cargoBean.remove}" icon="ui-icon-close">
<f:setPropertyActionListener value="#{cargo}"
target="#{cargoBean.cargo}"/>
</p:commandButton>
</p:column>
</p:dataTable>
</h:form>
224
Captulo 15 - Primefaces
Rosiclia Frasson
</ui:define>
</ui:composition>
<ui:composition xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
template="../WEB-INF/templates/template.xhtml"
xmlns ="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:p="http://primefaces.org/ui">
<ui:define name="conteudo">
<h:form acceptcharset="ISO-8859-1">
<p:panel header="Cadastro de Funcionrio">
<p:messages id="messages" closable="true"/>
<h:inputHidden value="#{funcionarioBean.funcionario.codigo}"/>
225
Captulo 15 - Primefaces
Rosiclia Frasson
required="true"
requiredMessage=" necessrio informar o CPF."
mask="999.999.999-99"/>
<p:calendar id="dtNascimento"
value="#{funcionarioBean.funcionario.dataNascimento}"
required="true"
requiredMessage=" necessrio informar a data de
nascimento."
converterMessage="Data no formato invlido. Utilize
dd/mm/aaaa"
pattern="dd/MM/yyyy">
<f:convertDateTime pattern="dd/MM/yyyy" type="date"/>
</p:calendar>
</p:fieldset>
226
Captulo 15 - Primefaces
Rosiclia Frasson
<p:inputMask id="numero"
value="#{funcionarioBean.funcionario.endereco.numero}"
validatorMessage="O nmero no pode ser negativo."
mask="9?9999999">
<f:validateLongRange minimum="0"/>
</p:inputMask>
<h:panelGrid
columns="4">
227
Captulo 15 - Primefaces
Rosiclia Frasson
</p:fieldset>
<p:panel>
<p:commandButton ajax="false"
value="Salvar"
action="#{funcionarioBean.insere}"/>
<p:commandButton value="Cancelar"
type="reset"/>
</p:panel>
</p:panel>
</h:form>
</ui:define>
</ui:composition>
<ui:composition xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
template="../WEB-INF/templates/template.xhtml"
xmlns ="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
228
Captulo 15 - Primefaces
Rosiclia Frasson
xmlns:p="http://primefaces.org/ui">
<ui:define name="conteudo">
<h:form acceptcharset="ISO-8859-1">
<p:dataTable value="#{funcionarioBean.listaFuncionarios}"
sortMode="multiple" rows="25" paginator="true"
var="funcionario">
<f:facet name="header">
<h:outputText value="Funcionrios"/>
</f:facet>
<p:column>
<f:facet name="header">
<h:outputText value="Cdigo" />
</f:facet>
<h:outputText value="#{funcionario.codigo}"/>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Nome" />
</f:facet>
<h:outputText value="#{funcionario.nome}"/>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Data de nascimento" />
</f:facet>
<h:outputText value="#{funcionario.dataNascimento}">
<f:convertDateTime pattern="dd/MM/yyyy" type="date"/>
</h:outputText>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Cargo" />
</f:facet>
<h:outputText value="#{funcionario.cargo.nome}"/>
</p:column>
<p:column>
229
Captulo 15 - Primefaces
Rosiclia Frasson
<f:facet name="header">
<p:commandButton action="/faces/paginas/funcionario.xhtml"
icon="ui-icon-plus">
</p:commandButton>
</f:facet>
<p:commandButton
action="#{funcionarioBean.preparaAlteracao}" icon="ui-iconpencil">
<f:setPropertyActionListener value="#{funcionario}"
target="#{funcionarioBean.funcionario}"/>
</p:commandButton>
<p:commandButton
action="#{funcionarioBean.remove}" icon="ui-icon-close">
<f:setPropertyActionListener value="#{funcionario}"
target="#{funcionarioBean.funcionario}"/>
</p:commandButton>
</p:column>
</p:dataTable>
</h:form>
</ui:define>
</ui:composition>
230
Bibliografia
Core Java Server Faces
Autor: Geary, David / Horstmann, Cay
Editora:Prentice Hall
Publicao:2010
Edio: 3
231
W3 Schools
http://www.w3schools.com/
232