Você está na página 1de 27

INTRODUO AO DESENVOLVIMENTO WEB

1.1. O QUE JAVA EE?


A Java EE (Java Platform, Enterprise Edition) uma plataforma padro para desenvolver aplicaes
Java de grande porte e/ou para a internet, que inclui bibliotecas e funcionalidades para implementar
software Java distribudo, baseado em componentes modulares que executam em servidores de aplicaes
e que suportam escalabilidade, segurana, integridade e outros requisitos de aplicaes corporativas ou de
grande porte.
A plataforma Java EE possui uma srie de especificaes (tecnologias) com objetivos distintos, por
isso considerada uma plataforma guarda-chuva. Entre as especificaes da Java EE, as mais conhecidas
so:
Servlets: so componentes Java executados no servidor para gerar contedo dinmico para a web,
como HTML e XML.
JSP (JavaServer Pages): uma especializao de Servlets que permite que aplicaes web
desenvolvidas em Java sejam mais fceis de manter. similar s tecnologias como ASP e PHP, porm mais
robusta por ter todas as facilidades da plataforma Java.
JSF (JavaServer Faces): um framework web baseado em Java que tem como objetivo simplificar o
desenvolvimento de interfaces (telas) de sistemas para a web, atravs de um modelo de componentes
reutilizveis. A proposta que os sistemas sejam desenvolvidos com a mesma facilidade e produtividade
que se desenvolve sistemas desktop (at mesmo com ferramentas que suportam clicar-e-arrastar
componentes).
JPA (Java Persistence API): uma API padro do Java para persistncia de dados, que usa um
conceito de mapeamento objeto-relacional. Essa tecnologia traz alta produtividade para o
desenvolvimento de sistemas que necessitam de integrao com banco de dados. S para citar, essa API
possibilita que voc desenvolva aplicaes usando banco de dados sem precisar escrever uma linha sequer
de SQL.
EJB (Enterprise Java Beans): so componentes que executam em servidores de aplicao e possuem
como principais objetivos, fornecer facilidade e produtividade no desenvolvimento de componentes
distribudos, transacionados, seguros e portveis.

1.2. O protocolo HTTP


O protocolo HTTP utilizado na navegao de pginas da Internet. Quando voc abre uma janela de
um browser, acessa uma pgina Web e navega em seus links, voc est, na verdade, utilizando esse
protocolo para visualizar, em sua mquina, o contedo que est armazenado e/ou processado em
servidores remotos.
O HTTP um protocolo stateless de comunicao cliente-servidor: o cliente envia uma requisio
para o servidor, que processa a requisio e devolve uma resposta para o cliente, sendo que, a princpio,
nenhuma informao mantida no servidor em relao s requisies previamente recebidas.
Assim, quando digitamos o endereo de uma pgina em um browser, estamos gerando uma
requisio a um servidor, que ir, por sua vez, devolver para o browser o contedo da pgina HTML
requisitada.

A requisio enviada por um cliente deve conter, basicamente, um comando (tambm chamado de
mtodo), o endereo de um recurso no servidor (tambm chamado de path) e uma informao sobre a
verso do protocolo HTTP sendo utilizado. Supondo, por exemplo, que queremos buscar o contedo do
endereo http://www.uol.com.br/index.html. Utilizemos o mtodo GET, o path /index.html e a verso 1.1
do protocolo HTTP. Temos a seguinte requisio enviada:

GET /index.html HTTP/1.1


Host: www.uol.com.br
Existem diversos mtodos HTTP que podem ser especificados em requisies, sendo os mais comuns
o mtodo GET, normalmente utilizado para obter o contedo de um arquivo no servidor, e o mtodo
POST, utilizado para enviar dados de formulrios HTML ao servidor.
Uma requisio pode conter parmetros adicionais, chamados headers. Alguns headers comuns so,
por exemplo, Host, User-Agent e Accept. Uma vez processada a requisio, o servidor, por sua vez, manda
uma resposta para o cliente, sendo que essa resposta tambm tem um formato pr-determinado: a
primeira linha contm informaes sobre a verso do protocolo, um cdigo de status da resposta e uma
mensagem associada a esse status. Em seguida, so enviados os headers da resposta, e finalmente,
enviado o contedo da resposta. Veja um exemplo simples de resposta HTTP:
HTTP/1.1 200 OK
Date: Thu, 26 Sep 2013 15:17:12 GMT
Server: Apache/2.2.15 (CentOS)
Content-Type: text/html; charset=utf-8
<html>
<body>
</body>
</html>
No exemplo anterior, o cdigo de status 200 indica que houve sucesso no atendimento da requisio
enviada pelo cliente, e os headers indicam a data e hora do servidor, o servidor usado, tipo do contedo e,
por fim, temos o cdigo-fonte da pgina HTML. Outros cdigos de status bastante comuns so o 404, que
indica que o recurso no foi localizado no servidor e o cdigo 500, que indica que houve erro no
processamento da requisio enviada.
1.3. Desenvolvimento web com Java
Com o avano da tecnologia sobre redes de computadores e com o crescimento da internet, as
pginas web esto se tornando cada vez mais atraentes e cheias de recursos que aumentam a
interatividade com o usurio. Quando falamos em aplicaes web, estamos nos referindo a sistemas ou
sites onde grande parte da programao fica hospedada em servidores na internet, e o usurio (cliente)
normalmente no precisa ter nada instalado em sua mquina para utiliz-las, alm de um navegador
(browser). O acesso s pginas desses sistemas feita utilizando o modelo chamado de requestresponse,
ou seja, o cliente solicita que alguma ao seja realizada (request) e o servidor a realiza e responde para o
cliente (response).
Na plataforma Java, esse modelo foi implementado atravs da API de Servlets. Um Servlet estende a
funcionalidade de um servidor web para servir pginas dinmicas aos navegadores, utilizando o protocolo
HTTP.
No mundo Java, os servidores web so chamados de Servlet Container, pois implementam a
especificao de Servlet. O servidor converte a requisio em um objeto do tipo HttpServletRequest. Este
objeto ento passado aos componentes web, que podem executar qualquer cdigo Java para que possa
ser gerado um contedo dinmico. Em seguida, o componente web devolve um objeto
HttpServletResponse, que representa a resposta ao cliente. Este objeto utilizado para que o contedo
gerado seja enviado ao navegador do usurio.
Desde o lanamento de Servlets, outras tecnologias Java e frameworks foram surgindo com o
objetivo de melhorar a produtividade e recursos no desenvolvimento de aplicaes web. Atualmente

JavaServer Faces a tecnologia do momento, requisitada na maioria das oportunidades de emprego para
desenvolvedores Java. JSF, assim como os outros frameworks web, foram baseados em Servlets.
1.4. Containers
Containers so interfaces entre componentes e funcionalidades de baixo nvel especficas de uma
plataforma. Para uma aplicao web desenvolvida em Java ou um componente corporativo ser executado,
eles precisam ser implantados em um container.
Os containers tambm so chamados de servidores de objetos, ou servidores de aplicao, pois
oferecem servios de infra-estrutura para execuo de componentes. O EJB Container suporta Enterprise
JavaBeans (EJB), que so componentes corporativos distribudos. Os Servlets, JSP, pginas JSF e arquivos
estticos (HTML, CSS, imagens e etc) necessitam de um Web Container para ser executado.
Existem diversas organizaes que desenvolvem containers Java EE, por exemplo: Oracle, IBM, Red
Hat, Apache, etc. Apesar de tantas ofertas gratuitas, algumas empresas ainda vendem licenas de seus
prprios servidores, pois oferecem suporte diferenciado ao cliente e normalmente implementam
funcionalidades que os servidores gratuitos talvez no possuam.
Para testar nossos exemplos, usaremos o Wildfly 10.0, pois leve, gratuito e muito popular.
Como estes servidores so baseados nas especificaes da tecnologia Java EE, teoricamente, voc
pode implantar os exemplos que desenvolveremos neste livro em qualquer container compatvel com a
Java EE.
EXERCCIO 01
1)
2)
3)

Instalando e configurando o servidor Wildfly 10.0.


Integrando o Wildfly ao IDE Netbeans ou Eclipse.
Ano: 2015 Banca: FCC rgo: TCM-GO Prova: Auditor de Controle Externo - Informtica

Um Analista de Controle Externo da rea de TI do TCM/GO est trabalhando em uma aplicao web
utilizando a plataforma Java EE. Ciente que os componentes desta aplicao, para serem processados no
servidor de aplicaes, tero que ser implantados (deployed) em contineres apropriados, ele esclareceu
equipe de desenvolvimento que servlets, JavaServer Pages, pginas HTML e Java Beans sero implantados
e processados no continer A. Alm disso, alguns componentes sero implantados e processados no
continer B, destinado a prover a infraestrutura necessria para a execuo de componentes de negcio
distribudos que estendem as funcionalidades de um servidor, permitindo encapsular lgica de negcio e
dados especficos de uma aplicao.
Os contineres A e B so conhecidos, respectivamente, como
a) local container e remote container.
b) web container e EJB container.
c) glassfish container e tomcat container.
d) EJB container e web container.
e) server container e client container.
4)

Ano: 2014 Banca: Quadrix rgo: DATAPREV Prova: Analista Tecnologia da Informao

Para o caso de um desenvolvedor precisar implementar seu prprio controlador de base de dados,
usando a JPA, qual seria a tecnologia de Java EE mais interessante para se implementar esse servio?
a) Implementar a JPA dentro de um Web Service.
b) Implementar a JPA dentro de um JAX-RPC.
c) Implementar a JPA dentro de um Servlet.

d) Implementar a JPA dentro de um EJB.


e) Implementar a JPA dentro de um JavaBean.
5)
Ano: 2014 Banca: CESPE rgo: ANATEL Prova: Analista Administrativo - Tecnologia da
Informao e Comunicao
No que se refere arquitetura e programao Java, julgue o item que se segue.
Na plataforma JEE (Java Enterprise Edition) verso 6, no possvel encontrar bibliotecas da prpria
plataforma para o consumo dos servios REST no formato JSON.
( ) Certo ( ) Errado
6)

Ano: 2014 Banca: CESPE rgo: TJ-SE Prova: Analista Judicirio - Anlise de Sistemas

Acerca de sistemas transacionais e de arquitetura Java EE 7, julgue os itens subsequentes.


Na arquitetura Java EE 7, JAXB (Java Architecture for XML Binding) prov uma forma de interagir um
schema XML e um programa desenvolvido em Java. Assim, possvel combinar JAXB com JAX-WS (Java API
for XML Web Services) na troca de mensagens advindas de Web Services, desde que nessa arquitetura se
utilize a verso JAXB 2.2 ou superior.
( ) Certo ( ) Errado
1.7. Apache Maven
Maven uma ferramenta da Apache Software Foundation para gerenciamento de dependncias e
automao de build, principalmente em projetos Java. Um projeto que usa Maven possui um arquivo XML
(pom.xml) que descreve o projeto, suas dependncias, detalhes do build, diretrios, plugins requeridos,
etc. Este arquivo conhecido como POM (Project Object Model).
Usaremos Maven para criar os exemplos. As verses mais recentes dos IDEs j possuem plugins para
criar projetos com Maven.
EXERCCIO 02
1)

Criando a Servlet Ol Mundo com um Projeto Maven.

PERSISTNCIA DE DADOS COM JPA


2.1. O que persistncia?
A maioria dos sistemas desenvolvidos em uma empresa precisa de dados persistentes, portanto
persistncia um conceito fundamental no desenvolvimento de aplicaes. Se um sistema de informao
no preservasse os dados quando ele fosse encerrado, o sistema no seria prtico e usual.
Quando falamos de persistncia de dados com Java, normalmente falamos do uso de sistemas
gerenciadores de banco de dados relacionais e SQL, porm existem diversas outras alternativas para
persistir dados, como em arquivos XML, arquivos texto e etc.
2.2. Mapeamento Objeto Relacional (ORM)
Mapeamento objeto relacional (object-relational mapping, ORM, O/RM ou O/R mapping) uma
tcnica de programao para converso de dados entre banco de dados relacionais e linguagens de
programao orientada a objetos.
Em banco de dados, entidades so representadas por tabelas, que possuem colunas que armazenam
propriedades de diversos tipos. Uma tabela pode se associar com outras e criar relacionamentos diversos.
Em uma linguagem orientada a objetos, como Java, entidades so classes, e objetos dessas classes
representam elementos que existem no mundo real. Por exemplo, um sistema de faturamento possui a
classe NotaFiscal, que no mundo real existe e todo mundo j viu alguma pelo menos uma vez, alm de
possuir uma classe que pode se chamar Imposto, que infelizmente todo mundo sente no bolso. Essas
classes so chamadas de classes de domnio do sistema, pois fazem parte do negcio que est sendo
desenvolvido.
Em banco de dados, podemos ter as tabelas nota_fiscal e tambm imposto, mas a estrutura de
banco de dados relacional est longe de ser orientado a objetos, e por isso a ORM foi inventada para suprir
a necessidade que os desenvolvedores tm de visualizar tudo como objetos para programarem com mais
facilidade. Podemos comparar o modelo relacional com o modelo orientado a objetos conforme a tabela
abaixo:

Essa comparao feita em todo o tempo que se est desenvolvendo usando algum mecanismo de
ORM. O mapeamento feito usando metadados que descrevem a relao entre objetos e banco de dados.
Uma soluo ORM consiste de uma API para executar operaes CRUD simples em objetos de classes
persistentes, uma linguagem ou API para especificar queries que se referem a classes e propriedades de
classes, facilidades para especificar metadados de mapeamento e tcnicas para interagir com objetos
transacionais para identificarem automaticamente alteraes realizadas, carregamento de associaes por
demanda e outras funes de otimizao.

Em um ambiente ORM, as aplicaes interagem com APIs e o modelo de classes de domnio e os


cdigos SQL/JDBC so abstrados. Os comandos SQL so automaticamente gerados a partir dos metadados
que relacionam objetos a banco de dados.
2.3. Porque usar ORM?
Uma implementao ORM mais complexa que outro framework qualquer para desenvolvimento
web, porm os benefcios de desenvolver utilizando esta tecnologia so grandes.
Cdigos de acesso a banco de dados com queries SQL so chatos de se desenvolver. JPA elimina
muito do trabalho e deixa voc se concentrar na lgica de negcio. JPA trar uma produtividade imensa
para voc.
A manutenabilidade de sistemas desenvolvidos com ORM excelente, pois o mecanismo faz com
que menos linhas de cdigo sejam necessrias. Alm de facilitar o entendimento, menos linhas de cdigo
deixam o sistema mais fcil de ser alterado. Existem outras razes que fazem com que um sistema
desenvolvido utilizando JPA seja melhor de ser mantido. Em sistemas com a camada de persistncia
desenvolvida usando JDBC e SQL, existe um trabalho na implementao para representar tabelas como
objetos de domnio, e alteraes no banco de dados ou no modelo de domnio geram um esforo de
readequao que pode custar caro.
ORM abstrai sua aplicao do banco de dados e do dialeto SQL. Com JPA, voc pode desenvolver um
sistema usando um banco de dados e coloc-lo em produo usando diversos outros banco de dados, sem
precisar alterar cdigos-fontes para adequar sintaxe de queries que s funcionam em SGBDs de
determinados fornecedores.
2.4. Java Persistence API e Hibernate
A Java Persistence API (JPA) um framework para persistncia em Java, que oferece uma API de
mapeamento objeto-relacional e solues para integrar persistncia com sistemas corporativos escalveis.
Com JPA, os objetos so POJO (Plain Old Java Objects), ou seja, no necessrio nada de especial
para tornar os objetos persistentes. Basta adicionar algumas anotaes nas classes que representam as
entidades do sistema e comear a persistir ou consultar objetos.
JPA uma especificao, e no um produto. Para trabalhar com JPA, precisamos de uma
implementao.
O projeto do Hibernate ORM possui alguns mdulos, sendo que o Hibernate EntityManager a
implementao da JPA que encapsula o Hibernate Core.
O Hibernate Core a base para o funcionamento da persistncia, com APIs nativas e metadados de
mapeamentos em arquivos XML. Possui uma linguagem de consultas chamada HQL (parecido com SQL),
um conjunto de interfaces para consultas usando critrios (Criteria API), etc.
Neste livro, estudaremos apenas o bsico de JPA e Hibernate, para implementarmos exemplos mais
interessantes com JSF, com acesso ao banco de dados.
2.5. Configurao de JPA e Hibernate com Maven
Como estamos usando Maven, no precisamos acessar o site do Hibernate para baixar os arquivos
necessrios e incluir manualmente no projeto. Podemos incluir todas as dependncias no arquivo
pom.xml, que o Maven baixar os arquivos necessrios automaticamente.
<dependencies>

<!-- Ncleo do Hibernate -->


<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.2.Final</version>
<scope>compile</scope>
</dependency>
<!-- Implementao de EntityManager da JPA -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.2.2.Final</version>
<scope>compile</scope>
</dependency>
<!-- Driver JDBC do PostgreSQL -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4.1209.jre7</version>
<scope>compile</scope>
</dependency>
...
</dependencies>

Adicionamos o ncleo do Hibernate, a implementao de JPA e o driver JDBC do PostgreSQL em


nosso projeto.
2.9. O arquivo persistence.xml
O persistence.xml um arquivo de configurao padro da JPA. Ele deve ser criado no diretrio
META-INF da aplicao ou do mdulo que contm os beans de entidade. No Eclipse, opcionalmente, voc
pode adicionar o Project Facet JPA no seu projeto, que a estrutura bsica desse arquivo criada
automaticamente, alm de ter outras facilidades.
O arquivo persistence.xml define unidades de persistncia, conhecidas como persistence units.
Esse arquivo deve ficar em src/main/resources/META-INF.
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="FinanceiroPU">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="javax.persistence.jdbc.url"
value="jdbc:mysql://localhost/financeiro" />
<property name="javax.persistence.jdbc.user"
value="usuario" />
<property name="javax.persistence.jdbc.password"
value="senha" />
<property name="javax.persistence.jdbc.driver"
value="com.mysql.jdbc.Driver" />
<property name="hibernate.dialect"

value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>

O nome da unidade de persistncia foi definido como FinanceiroPU. Precisaremos desse nome daqui
a pouco, quando formos colocar tudo para funcionar. O provider diz qual a implementao que ser
usada como provedor de persistncia.
Existem vrias opes de configurao que podem ser informadas neste arquivo XML. Vejamos as
principais propriedades que usamos em nosso arquivo de configurao:
javax.persistence.jdbc.url: descrio da URL de conexo com o banco de dados.
javax.persistence.jdbc.driver: nome completo da classe do driver JDBC.
javax.persistence.jdbc.user: nome do usurio do banco de dados.
javax.persistence.jdbc.password: senha do usurio do banco de dados.
hibernate.dialect: dialeto a ser usado na construo de comandos SQL.
hibernate.show_sql: informa se os comandos SQL devem ser exibidos na console (importante para
debug, mas deve ser desabilitado em ambiente de produo).
hibernate.format_sql: indica se os comandos SQL exibidos na console devem ser formatados
(facilita a compreenso, mas pode gerar textos longos na sada).
hibernate.hbm2ddl.auto: cria ou atualiza automaticamente a estrutura das tabelas no banco de
dados.
EXERCCIO 03
1)
Criando um Domain Model com o uso de ORM a partir do DER abaixo implementado no
Postgresql que representa um simples Sistema de Processamento de Vendas, faa as modificaes
necessrias.

2)
Ano: 2014 Banca: FCC rgo: TRT - 16 REGIO (MA) Prova: Tcnico Judicirio - Tecnologia
da Informao
Na arquitetura Java EE, muito trabalho que poderia ser feito pelo programador feito por um
middleware denominado container. Os tipos principais de container que existem e executam em um
servidor de aplicaes Java EE completo so:
a) Web container e EJB container.
b) Cloud container e Web container.
c) EJB container e JPA container.
d) JUnit container e HTTP container.
e) IIS container
e JSP container.

INTRODUO AO JSF
3.1. O que JavaServer Faces?
JavaServer Faces, tambm conhecido como JSF, uma tecnologia para desenvolvimento web que
utiliza um modelo de interfaces grficas baseado em eventos. Esta tecnologia foi definida pelo JCP (Java
Community Process), o que a torna um padro de desenvolvimento e facilita o trabalho dos fornecedores
de ferramentas, ao criarem produtos que valorizem a produtividade no desenvolvimento de interfaces
visuais.
JSF baseado no padro de projeto MVC (Model View Controller), o que torna o desenvolvimento de
sistemas menos complicado. O padro MVC separa o sistema em trs responsabilidades (modelo,
visualizao e controle), onde o modelo responsvel por representar os objetos de negcio, manter o
estado da aplicao e fornecer ao controlador o acesso aos dados. A visualizao responsvel pela
interface do usurio.
Ela que define a forma como os dados so apresentados e encaminha as aes do usurio para o
controlador. O controlador responsvel por ligar o modelo e a visualizao, interpretando as solicitaes
do usurio, traduzindo para uma operao no modelo (onde so realizadas efetivamente as mudanas no
sistema) e retornando a visualizao adequada solicitao.
Em JSF, o controle feito atravs de uma servlet chamada Faces Servlet, opcionalmente, por
arquivos XML de configurao e por vrios manipuladores de aes e observadores de eventos. A Faces
Servlet recebe as requisies dos usurios na web, redireciona para o modelo e envia uma resposta.
O modelo representado por objetos de negcio, que executa uma lgica de negcio ao receber
dados oriundos da camada de visualizao. A visualizao composta por uma hierarquia de componentes
(component tree), o que torna possvel unir componentes para construir interfaces mais ricas e complexas.

3.2. Principais componentes


O verdadeiro poder de JavaServer Faces est em seu modelo de componentes de interface do
usurio, que gera alta produtividade aos desenvolvedores, permitindo a construo de interfaces para web
usando um conjunto de componentes prconstrudos, ao invs de criar interfaces inteiramente do zero.

Existem vrios componentes JSF, desde os mais simples, como um Output Label, que apresenta
simplesmente um texto, ou um Data Table, que representa dados tabulares de uma coleo que pode vir
do banco de dados.
A API de JSF suporta a extenso e criao de novos componentes, que podem fornecer
funcionalidades adicionais. Os principais componentes que a implementao de referncia do JSF fornece
so: formulrio, campos de entrada de texto e senhas, rtulos, links, botes, mensagens, painis, tabela de
dados, etc.
3.3. Bibliotecas de componentes de terceiros
Atualmente, existem diversas organizaes que trabalham na criao de componentes
personalizados, como exemplo, podemos citar a Oracle (ADF Faces Rich Client), IceSoft (IceFaces), Red Hat
(RichFaces), Prime Technology (PrimeFaces) e etc.
As bibliotecas de componentes terceiras incluem muitos componentes interessantes, como tabelas
de dados avanadas, menus suspensos, botes, barras de progresso, dilogos, componentes para captura
de datas e cores, etc.

Usaremos PrimeFaces no projeto deste livro, mas antes, usaremos apenas os componentes bsicos
do JSF.
3.4. Escolhendo uma implementao de JSF
A JSF foi criada atravs do Java Community Process (JCP), que uma entidade formada pelas mais
importantes empresas de tecnologia do mundo e especialistas em diversos assuntos.
O JCP composto por vrios grupos de trabalho, que so chamados de JSR (Java Specification
Request). Uma JSR um projeto de uma nova tecnologia. O artefato produzido atravs das JSRs so
documentaes, interfaces e algumas classes que especificam como deve funcionar um novo produto.

A JSF foi criada e controlada pelo JCP atravs de JSRs. Quando uma JSR finalizada, empresas
fornecedoras de tecnologia tm a chance de entender a especificao e implementar um produto final
compatvel com o proposto pela especificao.
No caso da JSF, a implementao mais conhecida atualmente a Mojarra, que pode ser obtida em
https://javaserverfaces.java.net/.
3.5. Adicionando JSF ao projeto Maven
Como estamos usando o Maven, no precisaremos baixar a implememtao de JSF manualmente.
Podemos apenas adicionar a dependncia no POM do projeto.
<!-- Mojarra (implementacao do JSF) -->
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.2.13</version>
<scope>compile</scope>
</dependency>
Usaremos o JSF 2.2, lanado dentro da Java EE 7.
Adicionaremos o Project Facet JavaServer Faces com a verso 2.2 para o Eclipse nos auxiliar melhor
durante o desenvolvimento.
3.6. Managed bean
Antigamente, alguns programadores desenvolviam todo o comportamento de uma pgina no prprio
arquivo de layout, na verdade, infelizmente, ainda existem programadores que fazem isso.
Em JSF, no conseguimos fazer isso. O arquivo que inclui os componentes da pgina deve ficar
separado da classe que gerencia o comportamento dela, chamada de managed bean.
Os managed beans nada mais so que Java Beans, que servem como canais entre a interface grfica
(a pgina) e o back-end da aplicao (regras de negcio, acesso ao banco de dados, etc).
Os beans gerenciados do JSF podem receber dados digitados pelos usurios atravs de alguma
pgina, processar mtodos atravs de aes dos usurios e fornecer dados para apresentao na pgina.
Para um bean ser reconhecido como um managed bean JSF, precisamos registr-lo. A maneira mais
fcil de fazer isso atravs da anotao @ManagedBean, do pacote javax.faces.bean. Por padro, todas as
classes do projeto sero escaneadas para encontrar beans anotados.
Nosso primeiro exemplo ser o managed bean OlaBean. Os atributos nome e sobrenome sero
informados pelo usurios, por isso, possuem os getters e setters correspondentes. O atributo
nomeCompleto ser montado pelo mtodo dizerOla e apresentado na pgina, portanto, no precisamos
do setter para esse atributo. O mtodo dizerOla ser chamado a partir de um boto da pgina.

@javax.faces.bean.ManagedBean
public class OlaBean {
private String nome;
private String sobrenome;
private String nomeCompleto;
public void dizerOla() {
this.nomeCompleto = this.nome.toUpperCase()
+ " " + this.sobrenome;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getSobrenome() {
return sobrenome;
}
public void setSobrenome(String sobrenome) {
this.sobrenome = sobrenome;
}
public String getNomeCompleto() {
return nomeCompleto;
}
}
3.7. Criando uma pgina XHTML
Vamos criar uma pgina simples em JSF, que por enquanto, no far ligao com o managed bean
que programamos.
Criaremos um arquivo chamado Ola.xhtml, clicando com o boto direito no projeto e acessando
New, HTML File. Na tela New HTML File, digite o nome do arquivo e clique em Finish. O arquivo ser
criado no diretrio src/main/webapp do projeto.
Deixaremos o cdigo-fonte do arquivo Ola.xhtml como a seguir:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>Ol JSF</title>
</h:head>
<h:body>
<h:form>
<h1>Ol</h1>
Nome: <h:inputText />
<br/>
Sobrenome: <h:inputText />
<br/>
<h:commandButton value="Dizer ol" />
</h:form>
</h:body>
</html>
A declarao DOCTYPE foi usada para dizer aos browsers dos usurios a verso do HTML que estamos
usando, para que eles possam exibir os elementos de forma adequada. Em nosso exemplo, declaramos
que o HTML 5.
<!DOCTYPE html>
Importamos a biblioteca de componentes HTML atravs do namespace http://xmlns.jcp.org/jsf/html.
A letra h o prefixo usado para acessar os componentes dessa biblioteca.
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
As tags <h:head> e <h:body> so importantes para o funcionamento da pgina JSF, para definir o
cabealho e corpo da pgina.
<h:head>
<title>Ol JSF</title>
</h:head>
<h:body>
...
</h:body>
No corpo da pgina, usamos um componente de formulrio, representado pela tag <h:form>, dois
componentes de entrada de texto, representados pela tag <h:inputText> e um boto, com
<h:commandButton>.
<h:form>
<h1>Ol</h1>
Nome: <h:inputText />
<br/>
Sobrenome: <h:inputText />
<br/>
<h:commandButton value="Dizer ol" />
</h:form>

Considerando que esse exemplo esteja no projeto "Financeiro", podemos acessar a pgina que
criamos pela URL http://localhost:8080/Ola.xhtml.

A implementao do JSF gerou o cdigo-fonte HTML a partir dos componentes que adicionados
pgina XHTML.
3.8. Ligando valores e aes com EL
Depois que o managed bean registrado, ele pode ser acessado pelos componentes das pginas do
projeto. A maioria dos componentes JSF possui propriedades que nos permitem especificar um valor ou
uma ligao de valor que est associado a um bean. Por exemplo, podemos especificar um valor esttico
no componente InputText:
<h:inputText value="Ol mundo!" />
Expression Language (EL) torna possvel o acesso rpido a managed beans. O avaliador de expresses
responsvel por tratar expresses EL que esto entre os caracteres #{}. No exemplo abaixo, ligamos o
valor do componente InputText propriedade nome do managed bean OlaBean, atravs do getter e setter.
<h:inputText value="#{olaBean.nome}" />
Quando o componente for renderizado, o mtodo getNome ser invocado. J o mtodo setNome
ser chamado quando o usurio digitar algo no componente de entrada de texto e submeter o formulrio.
O nome olaBean (com inicial em minsculo) definido por padro, de acordo com o nome da classe
do managed bean, quando no especificamos um outro nome.
@ManagedBean
public class OlaBean {
}
Poderamos definir um nome diferente atribuindo name da anotao @ManagedBean.

@ManagedBean(name = "ola")
public class OlaBean {
}
Agora, associaremos os valores e/ou aes dos componentes s propriedades e mtodos de
OlaBean.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>Ol JSF</title>
</h:head>
<h:body>
<h:form>
<h1>Ol #{ola.nomeCompleto}</h1>
Nome: <h:inputText value="#{ola.nome}" />
<br/>
Sobrenome: <h:inputText value="#{ola.sobrenome}" />
<br/>
<h:commandButton value="Dizer ol"
action="#{ola.dizerOla}" />
</h:form>
</h:body>
</html>
Quando o boto "Dizer ol" for acionado, o framework chamar o mtodo dizerOla do managed
bean, que passar o nome para maisculo, concatenar com o sobrenome e atribuir varivel
nomeCompleto, que acessada pela pgina atravs do getter, para dizer "Ol NOME sobrenome".

3.9. Escopos de managed beans


Quando referenciamos um managed bean via EL, o framework do JSF instanciar um objeto da classe
do managed bean, ou recuperar uma instncia existente. Todas as instncias possuem um tempo de vida,
que definido dependendo do escopo usado no managed bean.

Os escopos de managed beans JSF podem ser definidos atravs de anotaes do pacote
javax.faces.bean. Os principais so:
@NoneScoped: o bean ser instanciado a cada vez que for referenciado.
@RequestScoped (padro): tem vida curta, comeando quando referenciado em uma nica
requisio HTTP e terminando quando a resposta enviada de volta ao cliente.
@ViewScoped: a instncia permanece ativa at que o usurio navegue para uma prxima pgina.
@SessionScoped: mantm a instncia durante diversas requisies e at mesmo navegaes entre
pginas, at que a sesso do usurio seja invalidada ou o tempo limite atingido. Cada usurio possui sua
sesso de navegao, portanto, os objetos no so compartilhados entre os usurios.
@ApplicationScoped: mantm a instncia durante todo o tempo de execuo da aplicao. um
escopo que compartilha os objetos para todos os usurios do sistema.
Para exemplificar o funcionamento de alguns escopos, criaremos uma pgina com uma lista de
nomes, com um campo e um boto para adicionar novos nomes.

O managed bean abaixo registrado no escopo de requisio, pois anotamos com


@RequestScoped.
@ManagedBean
@RequestScoped
public class NomesBean {
private String nome;
private List<String> nomes = new ArrayList<>();
public void adicionar() {
this.nomes.add(nome);
}
public String getNome() {
return nome;
}

public void setNome(String nome) {


this.nome = nome;
}
public List<String> getNomes() {
return nomes;
}
}
Criamos uma pgina chamada Nomes.xhtml. A nica novidade neste arquivo a importao do
namespace http://xmlns.jcp.org/jsf/facelets e o uso da tag <ui:repeat>. O componente Repeat funciona
como um repetidor, onde cada elemento da lista passada para a propriedade values atribudo a uma
varivel com o nome definido em var, renderizando o contedo da tag a cada iterao.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<h:head>
<title>Lista de nomes</title>
</h:head>
<h:body>
<h:form>
Nome: <h:inputText value="#{nomesBean.nome}" />
<br/>
<h:commandButton value="Adicionar"
action="#{nomesBean.adicionar}" />
<br/>
<ol>
<ui:repeat var="nome" value="#{nomesBean.nomes}">
<li>#{nome}</li>
</ui:repeat>
</ol>
</h:form>
</h:body>
</html>
Quando executamos esse exemplo, conseguimos inserir o primeiro nome normalmente, mas ao
tentar inserir o segundo nome, o nome anterior que estava na lista desaparece. Isso ocorre porque o
escopo que usamos foi de requisio, ou seja, quando inserimos o segundo nome, a primeira requisio j
no existe mais, e o managed bean instanciado novamente pelo framework.
Para mudar o escopo de NomesBean para view, basta anotarmos a classe com
@ViewScoped.
@ManagedBean
@ViewScoped
public class NomesBean {
...
}
Agora conseguimos inserir diversos nomes na lista em sequncia, mas se recarregarmos a pgina ou
navegarmos para uma outra pgina e voltar, a lista estar vazia, pois os dados permanecem enquanto o
usurio estiver na mesma pgina.
A anotao @SessionScoped define o escopo de sesso.

@ManagedBean
@SessionScoped
public class NomesBean {
...
}
Se usarmos este escopo, podemos adicionar diversos nomes, navegar em outras pginas e voltar
para a listagem de nomes, que eles ainda estaro l. O managed bean ser perdido apenas quando o
tempo limite da sesso for alcanado ou se o usurio solicitar a invalidao da sesso (geralmente, atravs
de logout do sistema).
O escopo de aplicao compartilha a instncia do managed bean com todos os usurios.
@ManagedBean
@ApplicationScoped
public class NomesBean {
...
}
Se adicionarmos alguns nomes e acessarmos a pgina de outro navegador ou at mesmo de outro
computador, os mesmos nomes aparecero, mostrando que realmente este escopo compartilha os dados.
3.10. Backing bean
Quando voc digita o endereo da aplicao no browser e acessa uma pgina do sistema, o
framework JSF l e processa o arquivo XHTML. Esse arquivo contm tags de componentes, como
formulrios, campos de entrada de textos, botes e etc.
JSF fornece um conjunto de classes que representam os componentes. Essas classes so instanciadas
de acordo com as tags adicionadas na pgina XHTML e constroem uma hierarquia de componentes, que
representam os elementos da pgina e seus relacionamentos.
Por exemplo, a classe HtmlForm representa o componente de formulrio, HtmlInputText representa
o componente de entrada de texto e HtmlCommandButton o boto.
Durante o processamento da pgina, um cdigo HTML gerado (renderizado) e enviado para o
navegador do usurio. Cada componente JSF possui um renderizador que responsvel por gerar cdigo
HTML, refletindo o estado de seu componente.
Em algumas ocasies, seu bean pode precisar ter acesso s instncias dos componentes da pgina.
Este acesso d possibilidade de inspecionar e at modificar propriedades do componente que est sendo
renderizado para o usurio. Por exemplo, um componente de entrada de texto <h:inputText/>,
representado como objeto Java do tipo HtmlInputText, pode ter a propriedade disabled modificada em
tempo de execuo pelo cdigo Java, atravs do acesso direto a este objeto.
Para fazer esta ligao entre os componentes da pgina e propriedades de beans, precisamos criar
um backing bean. Um bean deste tipo igual ao managed bean, a nica diferena que ele, alm de fazer
ligaes de valores, pode fazer tambm ligaes de componentes.
Para um bean ser caracterizado como um backing bean, no cdigo-fonte da pgina feita uma
amarrao (binding) em uma tag de um componente JSF para uma propriedade de um managed bean.
No backing bean NomesBean, criamos os atributos que recebero instncias dos componentes:

@ManagedBean
@ViewScoped
public class NomesBean { private String nome;
private List<String> nomes = new ArrayList<>();
private HtmlInputText inputNome;
private HtmlCommandButton botaoAdicionar;
public void adicionar() {
this.nomes.add(nome);
// desativa campo e boto quando mais que 3 nomes
// forem adicionados
if (this.nomes.size() > 3) {
this.inputNome.setDisabled(true);
this.botaoAdicionar.setDisabled(true);
this.botaoAdicionar.setValue("Muitos nomes adicionados...");
}
}
// getters e setters
}
Para conectar os componentes do formulrio com as propriedades criadas, usamos o o atributo
binding das tags dos componentes.
Nome: <h:inputText value="#{nomesBean.nome}"
binding="#{nomesBean.inputNome}" />
<br/>
<h:commandButton value="Adicionar" action="#{nomesBean.adicionar}"
binding="#{nomesBean.botaoAdicionar}" />
Podemos acessar a pgina normalmente e adicionar at 4 nomes. A partir da, o campo e boto so
desabilitados e o texto do boto tambm modificado.

Apesar de poderoso, este recurso deve ser usado com bastante cuidado. O uso excessivo pode deixar
o cdigo-fonte grande e difcil de entender. Na maioria das vezes, conseguimos fazer o que precisamos
usando apenas expresses de ligao de valor.

3.11. Ciclo de vida


Voc pode desenvolver uma aplicao completa em JSF sem conhecer todos os detalhes deste
framework, porm quanto mais voc souber sobre ele, melhor e mais produtivo voc se tornar. Por isso,
estudaremos agora um assunto que nem todos os desenvolvedores JSF conhecem: o ciclo de vida.
Ao executar uma pgina construda usando componentes JSF, ela passar por um ciclo de vida de
processamento bem definido, constitudo por 6 fases:
1. Restaurar viso
2. Aplicar valores de requisio
3. Processar validaes
4. Atualizar os valores do modelo
5. Invocar a aplicao
6. Renderizar a resposta

Restaurar viso
A fase de restaurao da viso recupera a hierarquia de componentes para a pgina solicitada, se ela
foi exibida anteriormente, ou constri uma nova hierarquia de componentes, se for a primeira exibio.
Se a pgina j tiver sido exibida, todos os componentes so recuperados em seu estado anterior. Isso
d condies dos dados de um formulrio submetido ao servidor serem recuperados, caso ocorra algum
problema de validao ou restrio de regra de negcio. Por exemplo, se um formulrio solicita campos
obrigatrios que no so totalmente preenchidos, porm enviados pelo usurio, o mesmo formulrio deve
aparecer novamente com os campos que no estavam vazios j preenchidos, porm com mensagens de
erro indicando os campos requeridos.
Aplicar valores de requisio
Nesta fase, cada componente da hierarquia de componentes criada na fase anterior tem a chance de
atualizar seu prprio estado com informaes que vieram da requisio.

Processar validaes
Os valores submetidos so convertidos em tipos especficos e anexados aos componentes. Quando
voc programa uma pgina em JSF, voc pode incluir validadores que atuam nos valores recebidos pelos
usurios. Neste momento, os validadores entram em ao e, se surgirem erros de converso ou de
validao, a fase de renderizao de resposta invocada imediatamente, pulando todas as outras fases e
exibindo a pgina atual novamente, para que o usurio possa corrigir os erros e submeter os dados mais
uma vez.
Atualizar os valores do modelo
Durante esta fase, os valores anexados (conhecidos como valores locais) aos componentes so
atualizados nos objetos do modelo de dados e os valores locais so limpos.
Invocar a aplicao
Na quinta fase, os eventos que originaram o envio do formulrio ao servidor so executados. Por
exemplo, ao clicar em um boto para submeter um cadastro, a programao da ao deste boto deve ser
executada. Em alguns casos, o mtodo executado pode retornar um identificador dizendo qual a prxima
pgina a ser exibida, ou simplesmente no retornar nada para exibir a mesma pgina.
Renderizar a resposta
Por ltimo, a fase de renderizao da resposta gera a sada com todos os componentes nos seus
estados atuais e envia para o cliente. O ciclo recomea sempre que o usurio interage com a aplicao e
uma requisio enviada ao servidor.
3.13. O arquivo web.xml
As aplicaes web em Java podem ter um arquivo especial, chamado web.xml, que deve ficar na
pasta src/main/webapp/WEB-INF do projeto. Este arquivo tambm chamado de Deployment Descriptor,
pois ele descreve algumas configuraes e detalhes de implantao dos recursos da aplicao.
O arquivo web.xml no obrigatrio, mas podemos cri-lo clicando com o boto direito em
Deployment Descriptor (dentro do projeto) e depois em Generate Deployment Descriptor Stub.
O arquivo ser criado com um contedo semelhante ao cdigo abaixo:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Financeiro</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>

O arquivo gerado descreve o nome da aplicao, atravs de display-name, e alguns arquivos de boas
vindas, atravs de welcome-file-list, que so usados caso o usurio acesse o sistema apenas pelo context
path, sem informar o nome de um recurso.
O deployment descriptor de uma aplicao pode descrever tambm servlets, filtros, mapeamentos e
outras configuraes.
Para o framework do JavaServer Faces funcionar, ele registra automaticamente uma servlet chamada
Faces Servlet. Esta servlet mapeada para o padro de URL /faces/*, por isso, quando acessamos uma
pgina, escrevemos /faces/NomeDaPagina.xhtml.
Podemos sobrescrever o registro da Faces Servlet e seu mapeamento.
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
Com este novo mapeamento da Faces Servlet, podemos acessar a pgina de listagem de nomes
atravs da URL http://localhost:8080/Financeiro/Nomes.xhtml.
Vamos aproveitar que estamos editando o arquivo web.xml para incluir a configurao abaixo:
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
O parmetro de contexto adicionado acima diz que estamos em ambiente de desenvolvimento.
Quando cometermos algum erro, a pgina pode exibir informaes tcnicas adicionais, para nos ajudar a
resolver o problema.

NAVEGAO
4.1. Introduo navegao
Em JSF, navegao um conjunto de regras que define a prxima pgina a ser exibida quando uma
ao executada pelo usurio. Por exemplo, quando um usurio clica em um boto para se inscrever em
um site, qual a prxima pgina ele dever visualizar?
Se os dados estiverem incompletos, provavelmente dever visualizar a mesma pgina, com as
mensagens de erro apropriadas, porm se tudo estiver correto e a inscrio for efetuada com sucesso, ele
poder ver uma pgina de boas vindas ao servio.
A navegao pode ser implcita ou explcita. Estudaremos como configurar os dois tipos.
4.2. Navegao implcita
Quando inclumos um <h:commandButton> com um valor na propriedade action, o mecanismo de
tratamento de navegao tentar encontrar uma pgina adequada automaticamente. No exemplo abaixo,
o mecanismo de navegao encontrar e encaminhar a requisio para a pgina Ola.xhtml.
<h:commandButton value="Prxima pgina" action="Ola" />
O valor passado para a propriedade action chamado de outcome, ou resultado da ao.
Navegao dinmica
Quando um action tem uma expresso de ligao de mtodo, o retorno do mtodo deve ser o
outcome da navegao.
<h:commandButton value="Adicionar" action="#{nomesBean.adicionar}" />
Quando o mtodo adicionar retornar null, o usurio permanecer na mesma pgina. Quando o
retorno for "Ola", a requisio ser encaminhada para a pgina Ola.xhtml.
public String adicionar() {
this.nomes.add(nome);
if (this.nomes.size() > 3) {
return "Ola";
}
return null;
}
Redirecionamento
Por padro, uma requisio encaminhada para a pgina do outcome, ou seja, a requisio nica e
o framework apenas despacha a requisio para uma nova pgina.
Se for necessrio que seja feito o redirecionamento, podemos passar o parmetro facesredirect=true para o outcome.
public String adicionar() {
this.nomes.add(nome);
if (this.nomes.size() > 3) {

return "Ola?faces-redirect=true";
}
return null;
}
4.3. Navegao explcita
As regras de navegao explcitas so declaradas no arquivo faces-config.xml. Para declarar uma
regra explcita, precisamos informar o caminho da pgina de origem, um outcome com um nome qualquer
e o caminho da pgina de destino.
<navigation-rule>
<from-view-id>/Nomes.xhtml</from-view-id>
<navigation-case>
<from-outcome>oi</from-outcome>
<to-view-id>/Ola.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
A regra que acabamos de declarar define que a ao de nome "oi" a partir da origem /Nomes.xhtml
deve encaminhar para a pgina /Ola.xhtml. Para usar esta regra, podemos simplesmente adicionar um
boto na pgina Nomes.xhtml com a propriedade action referenciando o outcome.
<h:commandButton value="Prxima pgina" action="oi" />
Wildcard
Podemos usar wildcard no elemento from-view-id para selecionar diversos arquivos de origem, como
por exemplo * ou /admin/*.
<navigation-rule>
<from-view-id>*</from-view-id>
<navigation-case>
<from-outcome>oi</from-outcome>
<to-view-id>/Ola.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
Redirecionamento
Por padro, a requisio ser encaminhada para a pgina de destino. Se precisarmos fazer o
redirecionamento, basta incluir o elemento <redirect/>.
<navigation-rule>
<from-view-id>*</from-view-id>
<navigation-case>
<from-outcome>oi</from-outcome>
<to-view-id>/Ola.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>

COMPONENTES DE INTERFACE
5.1. Bibliotecas
Para desenvolver um sistema completo em JavaServer Faces, voc deve conhecer pelo menos os
principais componentes bsicos. Quando falamos em componentes bsicos, queremos dizer os
componentes padres da especificao da tecnologia.
As bibliotecas de tags so:
Core: existe para dar suporte s outras bibliotecas, e no possui componentes visuais.
Aprenderemos esta biblioteca no decorrer do livro, sempre que for necessrio
HTML: possui componentes que geram contedo visual, como formulrios, campos de entrada,
rtulos de sada de textos, botes, links, selees, painis, tabela de dados, mensagens e etc.
Facelets: a biblioteca para criao de templates de pginas.
Composite: usada para criar componentes customizados.
Neste captulo, focaremos nos componentes visuais, da biblioteca HTML.
Para usar as bibliotecas, temos que import-las atravs dos namespaces correspondentes.
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:composite="http://xmlns.jcp.org/jsf/composite">
Importamos as bibliotecas de tags e nomeamos com os prefixos f, h, ui e composite. Os prefixos
podem ser modificados, mas os que usamos so os convencionais.
Para este curso utilizaremos o Primefaces para demonstrar a utilizao dos Componentes de
Interface.

Você também pode gostar