Livro 7 Labprog II
Livro 7 Labprog II
IESDE BRASIL
2021
© 2021 – IESDE BRASIL S/A.
É proibida a reprodução, mesmo parcial, por qualquer processo, sem autorização por escrito do autor e do
detentor dos direitos autorais.
Projeto de capa: IESDE BRASIL S/A. Imagem da capa: Shemul/envato elements
Gabarito 103
Referências 106
Vídeo
APRESENTAÇÃO
Prezado aluno,
Este livro foi elaborado visando gerar uma experiência
prática por meio da construção de um software na linguagem de
programação Java que possa ser acessível de qualquer navegador
web e dispositivo móvel.
Para que essa jornada seja a mais completa possível,
apresentaremos os conceitos de Java Enterprise Edition (Java EE ou
JEE) e usaremos as principais bibliotecas para termos um software
Java Web. Todas as conceituações terão um bloco de código-fonte,
o qual será nosso aliado durante toda a leitura da obra. Para facilitar
o entendimento do código-fonte, ele estará à disposição no livro,
podendo ser validado na plataforma GitHub.
No primeiro capítulo, aprenderemos os conceitos das
aplicações Java Web e como elas são diferentes das aplicações
Java Desktop. Além disso, conheceremos mais a respeito do
gerenciador de dependências Maven e do contêiner Apache
Tomcat. Ambas as ferramentas são essenciais para termos um
sistema web utilizando Java.
Na sequência, no segundo capítulo, mergulharemos na criação
de sistemas web e de páginas web que funcionarão em qualquer
navegador, independentemente de o usuário estar usando um
tablet, um celular ou um notebook. Para isso, usaremos o JSF e
o Bootstrap. Esses conceitos ficarão mais avançados no terceiro
capítulo, quando criaremos telas que realizarão a inclusão,
remoção, listagem e edição de dados cadastrados pelo usuário.
No quarto e quinto capítulos, vincularemos o software web
a um banco de dados, permitindo que o usuário não perca
os dados cadastrados durante o uso. Para isso, usaremos a
biblioteca JPA e o Hibernate.
Durante toda a leitura, você encontrará diversos códigos-fonte
e suas respectivas explicações. Não tenha receio de copiá-los,
mas tente entender o que cada bloco ou palavra reservada
faz. Se você somente reproduzir o código sem entendê-lo, prejudicará a sua
capacidade de interpretá-lo com qualidade.
Após a leitura, esperamos que você consiga criar programas Java que
serão acessados na web e que usarão banco de dados. E aí, animado para
essa aventura?
Bons estudos!
8 Laboratório de Programação II
1
Introdução a Java Web
No mundo globalizado em que vivemos, interligado por redes
de dados, em especial pela internet, é até difícil imaginar algum
software que não as utilize. Diariamente, fazemos o uso de diver-
sos sites para realizar as atividades rotineiras, em vez de instalar-
mos um programa específico em nossos computadores. O maior
uso de softwares na internet é o foco do nosso estudo.
Neste capítulo, conheceremos as diferenças entre a criação de
softwares utilizando Java e a criação de software utilizando Java
Web. Além disso, criaremos nosso primeiro software, que será
acessado via navegador web. Prepare-se para desenvolver solu-
ções ricas e interativas na internet com Java Web.
10 Laboratório de Programação II
• Apache TomEE
• Oracle WebLogic
• IBM WebSphere
• WildFly (antigo RedHat JBoss)
• Apache Geronimo
• Oracle GlassFish
Servidor de aplicação
JEE
Banco de
dados
Bean Bean
corporativo corporativo
12 Laboratório de Programação II
Essa organização é chamada de camada. O padrão JEE propõe quatro
camadas. São elas:
• Client Tier.
• Web Tier.
• Business Tier.
• Enterprise Information System Tier (EIS Tier).
Servidor de aplicação
JEE
Vídeo
Navegador Contêiner web – web tier
web Para conhecer melhor
o projeto JakartaEE,
Página JSF Página JSP mantido pela fundação
EIS tier
Eclipse, assista ao vídeo
25 anos de Java: Jakarta
Client tier
Banco de EE: O que todo dev precisar
dados saber para utilizá-lo com
Rhuan Rocha, publicado
Contêiner EJB – pelo canal SouJava. O
App Java business tier conteúdo dará sequência
Bean Bean na evolução do JavaEE.
1.2 Maven
Vídeo Para criarmos programas utilizando JEE, precisamos ter os softwa-
res Java Developer Kit (JDK), na versão 8 ou superior, e interface de
desenvolvimento (IDE), com suporte a JEE, configurados em nossos
computadores.
14 Laboratório de Programação II
Vídeo
o endereço no qual estão hospedadas ou, então, têm suas versões Para configurar o Maven no
Linux, utilize o tutorial do link
alteradas.
a seguir.
Para utilizar o Maven, precisamos executar os seguintes passos: Disponível em: https://medium.
com/@andgomes/instalando-
• Fazer o download no site https://maven.apache.org/ -o-apache-maven-no-ubuntu-
-de4a95a5975a. Acesso em: 5
• Clicar na opção download (ou acessar o link direto https://ma- maio 2021.
ven.apache.org/download.cgi) e
• Selecionar, em Files, a opção Binary zip archive.
Figura 4
Download do Maven para Linux
2. Para validar se a instalação foi bem-sucedida, abra uma tela de Disponível em: https://www.
youtube.com/watch?v=-
comando (prompt de comando ou terminal) e digite mvn-version. ucX5w8Zm8s. Acesso em: 8 fev.
2021.
A figura a seguir mostra como configurar o Apache Maven no Linux.
Agora que o Maven está configurado, vamos criar o nosso primeiro pro-
jeto usando Java EE. Como estamos usando o Maven, criaremos o projeto
por ele, não pelo Eclipse IDE. Para criar o projeto web, siga os passos a seguir:
1. Abra uma tela de comando (terminal ou prompt de comando)
e escolha a pasta na qual você armazenará o código-fonte do
projeto. No exemplo aqui, usaremos a pasta c:\java\.
2. Digite o comando a seguir para criar o projeto Java Web:
mvn archetype:generate -DgroupId=br.com.aula
-DartifactId=primeiroprojeto -DarchetypeArtifactId=maven-
archetype-webapp -DinteractiveMode=false
3. Ao pressionar a tecla Enter, alguns downloads serão realizados,
já que o Maven buscará na web tudo o que for necessário para
você seguir com a programação de um projeto Java Web básico.
Em alguns computadores, o download não será realizado, pois o
Maven já foi utilizado em algum outro momento, e os arquivos já
se encontram em seu computador.
4. Caso tenha dado certo, a mensagem BUILD SUCCESS será
apresentada (Figura 6).
Figura 6
Resultado de sucesso na criação do projeto
18 Laboratório de Programação II
Figura 9
Arquivo pom.xml
<dependency> Leitura
<groupId>org.junit.jupiter</groupId> No blog Caelum, leia
o texto Processo de
<artifactId>junit-jupiter-api</artifactId> build com o Maven, de
Lucas Cavalcanti. O autor
<version>5.7.0</version> apresenta os detalhes
da ferramenta Maven,
<scope>test</scope> que ajudará você no
desenvolvimento de
</dependency> software JEE.
Ao salvar o arquivo pom.xml, o Maven automaticamente fará o do- Disponível em: https://blog.caelum.
wnload na internet da versão 5.7.0 do JUnit. Perceba que você não pre- com.br/processo-de-build-com-o-
maven/. Acesso em: 8 fev. 2021.
cisa informar em qual site está essa biblioteca, pois o programa faz
pesquisas em repositórios de arquivos pré-definidos, sendo o MVN
Reposiory (https://mvnrepository.com/) um dos mais utilizados. Na prática
Com esses aprendizados do Maven, o projeto criado poderá ser im- Para saber mais sobre a criação
de projetos web com Maven,
portado em qualquer outra IDE. Essa ferramenta traz muitos benefícios acesse o link a seguir.
e facilidades para o desenvolvimento de software e, por isso, tornou-se Disponível em: https://mkyong.
um padrão de mercado. Aprofundar-se no tema ajudará na maximiza- com/maven/how-to-create-a-we-
b-application-project-with-maven/.
ção do uso dessa ferramenta. Acesso em: 3 maio 2021.
Para gerar uma versão, você pode escolher duas opções: ou por
linha de comando ou dentro da própria IDE. Vamos começar com a
opção de linha de comando. Para isso:
1. abra uma janela de comando (prompt de comando ou terminal);
2. acesse a pasta do projeto (C:\java\primeiroprojeto, caso seja Windows);
3. digite o comando mvn clean install.
22 Laboratório de Programação II
No caso de nosso exemplo, utilizamos a versão 9.0.41.
24 Laboratório de Programação II
Figura 17
Execução do projeto primeiroprojeto.war
Figura 19
Aba Servers
26 Laboratório de Programação II
Figura 21
Adicionando o Tomcat versão 9.0
Vídeo
O vídeo Como Configu-
rar o SERVIDOR APACHE
TOMCAT em sua máquina
para PROJETOS JAVAWEB,
do canal Tecnologia
Radioativa, ensina como
Fonte: Eclipse IDE.
instalar e configurar Para executar o Tomcat e acessar o projeto primeiroprojeto, retorne à
o Apache Tomcat não
embarcado. aba Servers e clique com o botão direito no servidor Tomcat v9.0 Server
Disponível em: https://www. at localhost. Selecione a opção Start. Aguarde a inicialização do contêiner
youtube.com/watch?v=9Z4OKoh- web e abra um navegador. Digite http://localhost:8080/primeiroprojeto
Omw. Acesso em: 8 fev. 2021.
e verifique se será apresentada a mensagem Hello World.
28 Laboratório de Programação II
Figura 25
Iniciar um servidor Tomcat no Eclipse
CONSIDERAÇÕES FINAIS
Neste capítulo, estudamos as diferenças do JSE e JEE, além de termos
aprendido a criar um projeto Java Web. Esses primeiros passos são im-
portantes para a sequência dos estudos, pois são os pilares do desen-
volvimento Java Web. Continue a estudar as ferramentas de mercado
apresentadas (Apache Maven e Apache Tomcat) e pratique diversas vezes
a construção de projetos.
ATIVIDADES
1. Diferencie as especificações JMS e JPA que estão presentes no JEE.
Vídeo
2. É correto afirmar que o Apache Maven é uma funcionalidade de uma
IDE? Justifique a sua resposta.
3. Quais são os softwares necessários para desenvolver um projeto Java
Web e conseguir executá-lo, tornando-o disponível para ser acessado
em qualquer navegador?
Introdução a Java Web 29
2
Criando páginas web com Java
Desde a sua criação, o Java foi projetado para diversos apa-
relhos, independentemente do sistema operacional utilizado. Foi
desenvolvido também para uso na web; inicialmente com a tecno-
logia applets, na sequência com JSP (Java Server Pages) e, finalmen-
te, com JSF (Java Server Faces).
Neste capítulo, iremos aprender como fazer uma página web
básica, utilizando JSF e os diversos componentes desse padrão.
Nesse momento, não focaremos na parte de design e beleza do
site. Para tornar suas páginas mais atraentes, aconselhamos es-
tudar CSS e Bootstrap (https://getbootstrap.com/), ou, então, pes-
quisar componentes previamente configurados e padronizados,
como o Primefaces (https://www.primefaces.org/).
E aí, preparado para fazer um projeto Java acessível por uma
página web? Bons estudos!
30 Laboratório de Programação II
O JSF não substitui outras tecnologias utilizadas nas páginas da web,
como o Javascript ou folhas de estilo (CSS), que podem ser utilizadas
com o JSF sem nenhum problema.
Figura 2
Importação do projeto para o Eclipse
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.2.20</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.2.20</version>
</dependency>
<project xmlns=”http://maven.apache.org/POM/4.0.0”
xmlns:xsi=”http://www.w3.org/2001/
XMLSchema-instance”
xsi:schemaLocation=”http://maven.apache.org/
POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd”>
<modelVersion>4.0.0</modelVersion>
<groupId>br.com.aula</groupId>
<artifactId>projetoWeb</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<url>http://maven.apache.org</url>
(Continua)
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.2.20</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.2.20</version>
</dependency>
</dependencies>
<build>
<finalName>projetoWeb</finalName>
</build>
</project>
34 Laboratório de Programação II
Figura 3
Localização do arquivo web.xml
src/main/resources 4
5 <web-app>
JRE System Library [J2SE-1.5] 6 <display-name>Archetype Created Web Application</display-name>
Maven Dependencies 7 </web-app>
src 8
main
webapp
WEB-INF
web.xml
index.jsp
target
pom.xml
Fonte: Elaborada pelo autor.
Abra esse arquivo e você perceberá que ele está com o código da
Figura 3. Você precisará substituir todo o código atual pelo código a
seguir.
<web-app xmlns:xsi=”http://www.w3.org/2001/
XMLSchema-instance”
xmlns=”http://java.sun.com/xml/ns/javaee”
xmlns:web=”http://java.sun.com/xml/ns/javaee/web-
-app_2_5.xsd”
xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd”
id=”WebApp_ID” version=”2.5”>
<welcome-file-list>
<welcome-file>index.xhtml</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.
FacesServlet</servlet-class>
(Continua)
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
</web-app>
36 Laboratório de Programação II
Clique no botão add web module, localizado à direita da tela. Ao
clicar nessa opção, será aberta uma janela para você selecionar um
projeto Java Web. Selecione a opção projetoWeb e salve as alterações.
Figura 4
Execução com sucesso do projeto
Vídeo
No vídeo Java Server
Faces - O que é JSF e
Configurações com TomCat
e Maven, do canal Digital
Innovation One, encon-
traremos um resumo do
que aprendemos nesta
Fonte: Elaborada pelo autor. seção.
Com o sucesso das configurações citadas, você está pronto para Disponível em: https://youtu.be/
ZPAHvSRqqNY. Acesso em: 12
aprender os comandos e os conceitos do JSF, integrando a programa-
fev. 2021.
ção Java com os conceitos de programação para web.
Application server
Banco de
J2EE EAR
Computador
dados
pessoal
View Model
Dispositivo
móvel
JSP/JSF
Beans
38 Laboratório de Programação II
Figura 6
Primeiro controller criado
projetoWeb
src/main/resources
src/main/java
(default package)
PrimeiroManagedBean.java
Maven Dependencies
src
main
target
pom.xml
Fonte: Elaborada pelo autor.
b) Digite src/main/java1.
Figura 7
Criação do Source Folder Java
Cancel Finish
import javax.faces.bean.ManagedBean;
@ManagedBean(name = “primeiro”)
<html>
<body>
<h2>Hello World!</h2>
#{primeiro.message}
</body>
</html>
40 Laboratório de Programação II
Figura 8
Página trazendo dados do ManagedBean
localhost:8080/projetoWeb/
localhost:8080/projetoWeb/
Hello World!
Esta é uma mensagem que surgiu no controller
#{primeiro.message}
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”
xmlns:f=”http://java.sun.com/jsf/core”
xmlns:h=”http://java.sun.com/jsf/html”>
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”
xmlns:f=”http://java.sun.com/jsf/core”
xmlns:h=”http://java.sun.com/jsf/html”>
<h:head>
<title>Titulo da página</title>
</h:head>
<h:body>
<h2>#{primeiro.message}</h2>
(Continua)
42 Laboratório de Programação II
<h:form>
<br />
</h:form>
</h:body>
</html>
return nome;
this.nome = nome;
return nomeMaiusculo;
(Continua)
this.nomeMaiusculo = nomeMaiusculo;
nomeMaiusculo = nome.toUpperCase();
}
}
Figura 9
Tela JSF funcionando
Título da página
localhost:8080/projetoWeb/index.xhtml
44 Laboratório de Programação II
Quadro 1
Lista de componentes JSF
CONSIDERAÇÕES FINAIS
Neste capítulo, conhecemos o JSF e os componentes que ele traz
configurados, devido ao padrão facelets, o qual permite que a criação de
páginas html fique muito mais dinâmica e personalizada. Graças a essa
personalização, conseguimos fazer a interação da nossa página web com
os arquivos do tipo controller por meio da anotação @ManagedBean, as-
sim temos o uso avançado das páginas na internet com uso da tecnologia
Java.
ATIVIDADES
Vídeo 1. O que é facelets e qual é a sua função?
46 Laboratório de Programação II
3
Criando páginas
avançadas com Java
Quando é necessário criar um software para resolver um pro-
blema, algumas funcionalidades costumam ser mapeadas com
maior frequência e costumam envolver listagem, inserção, edição e
remoção de dados em cadastros. Ao ser identificado esse conjunto
de necessidades, usamos o termo CRUD, que é um acrônimo para
quatro palavras em inglês (C - create, R - read, U - update e D - delete).
Na sequência do livro vamos aprender como fazer um CRUD
básico utilizando JSF visando ao desenvolvimento prático dos con-
ceitos já vistos em Java e JSF. Lembrando que ainda não utiliza-
remos banco de dados nem outras bibliotecas de apoio. Ao final
deste capítulo, você estará habilitado a criar páginas totalmente
funcionais em JSF utilizando design de padrão de mercado.
Figura 1
Pacotes que precisam ser criados no source folder src/main/java
(Continua)
48 Laboratório de Programação II
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getSigla() {
return sigla;
}
public void setSigla(String sigla) {
this.sigla = sigla;
}
}
Agora vamos criar a nossa nova tela em JSF, que será de listagem
de dados e ainda não terá um design agradável. Focaremos no código
para entender como funciona a listagem de dados com JSF. Para criar
uma nova tela, realize os passos a seguir:
1. Clique com o botão direito na pasta src/main/webapp e selecione
a opção NEW → FILE.
2. Digite no campo File Name o nome do arquivo a ser gerado.
Usaremos o nome uf.xhtml. Na Figura 2 visualizamos onde ficou o
arquivo:
Figura 2
Novo arquivo uf.xhtml
<h:head>
<title>Cadastro UF</title>
</h:head>
<h:body>
<h2>Cadastro de Unidades Federativas (UF)</h2>
<h:form id=”form”>
50 Laboratório de Programação II
• Na tag <h:form> teremos os campos com que o usuário irá inte-
ragir. É o mesmo que a tag <form> do html.
• A tag <h:dataTable> será usada para exibir uma lista de dados; é o
mesmo que a tag <table> do html. Como utilizaremos dados que
vêm de um controlador Java, precisamos usar o h:dataTable ao in-
vés do <table>. Nessa tag a lista de valores da lista estará na proprie-
dade value, e cada um dos itens da lista terá um nome definido a
partir da propriedade var. No nosso caso a lista vem do controlador
ufBean.list, e os valores individuais se chamarão item. Exemplo:
Uf sp = new Uf();
sp.setId(2);
sp.setNome(“São Paulo”);
52 Laboratório de Programação II
sp.setSigla(“SP”);
list.add(sp);
O código da sua classe UfBean.java deve ficar semelhante ao código
a seguir:
package br.com.aula.controller;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import br.com.aula.model.Uf;
@ManagedBean
@ApplicationScoped
public class UfBean {
private List<Uf> list;
public List<Uf> getList() {
return list;
}
@PostConstruct
public void init() {
if (list == null) {
list = new ArrayList<Uf>();
Uf pr = new Uf();
pr.setId(1);
pr.setNome(“Paraná”);
pr.setSigla(“PR”);
list.add(pr);
Uf sp = new Uf();
sp.setId(2);
sp.setNome(“São Paulo”);
sp.setSigla(“SP”);
list.add(sp);
}
}
}
E o arquivo pom.xml deve ficar semelhante ao seguinte código:
<project xmlns=”http://maven.apache.org/POM/4.0.0”
<modelVersion>4.0.0</modelVersion>
<groupId>br.com.aula</groupId>
<artifactId>projetoWeb</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>projetoWeb Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.2.20</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.2.20</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>8.0.1</version>
54 Laboratório de Programação II
<scope>provided</scope>
</dependency> (Continua)
</dependencies>
<build>
<finalName>projetoWeb</finalName>
</build>
</project>
Agora é o momento de visualizar as alterações. Por isso, salve-as em
todos os arquivos e faça a build do projeto no Maven.
1. Clique com o botão direito no nome do projeto (projetoWeb).
2. Selecione a opção Run As → Maven Install.
3. Espere a construção do projeto e acompanhe pela aba Console
se esse processo de construção deu certo, ou seja, se apareceu a
mensagem de BUILD SUCCESS.
Figura 3
Listagem de cidades usando JSF
localhost:8080/projetoWeb/uf.xhtml
Sigla Nome
PR Paraná
SP São Paulo
Message / uf.xhtml @20,40 <h:outputTe> Tag Library supports namespace: http://java.sun.com/jsf/html, but no tag was
defined for name: outputTe
Description The server encountered an unexpected condition that prevented it from fulfilling the request.
Exception
(Continua)
56 Laboratório de Programação II
min.js” integrity=”sha384-b5kHyXgcpbZJO/
tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0”
crossorigin=”anonymous”></script>
Feito isso, já temos o Bootstrap configurado no nosso projeto. Como
não alteramos nada de classe Java (nem modelos nem controladores),
não precisamos parar o servidor Tomcat nem fazer a build no Maven.
Basta retornar ao navegador e atualizar a página. Você vai perceber
que as letras da listagem da Figura 5 estão diferentes da Figura 3. Ou
seja, o Bootstrap entrou em ação, mas ainda pode ser melhor.
Figura 5
Tela de listagem de UF utilizando Bootstrap
localhost:8080/projetoWeb/uf.xhtml
Sigla Nome
PR Paraná
SP São Paulo
Figura 6
Vídeo
Listagem de UF utilizando Bootstrap
No vídeo Bootstrap //
Dicionário do Progra-
localhost:8080/projetoWeb/uf.xhtml mador, do canal Código
Fonte TV, você entenderá
o Bootstrap, o que é,
Cadastro de Unidades Federativas (UF) histórico e como usá-lo.
58 Laboratório de Programação II
return uf;
}
public void setUf(Uf uf) {
this.uf = uf;
}
4. Dentro do arquivo UfBean.java, insira o código a seguir, referente
ao método novo().
public String novo() {
this.uf = new Uf();
return “cadastrarUf”;
}
O método novo() precisa retornar um texto, pois ele foi invocado
pela tela uf.xhtml a partir de um action. O texto a ser retornado
deve ser o nome da tela que se deseja abrir, sem o .xhtml.
<h:head>
<link href=”https://cdn.jsdelivr.net/npm/
[email protected]/dist/css/bootstrap.min.css”
rel=”stylesheet” integrity=”sha384-BmbxuPwQa2lc/
FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl”
crossorigin=”anonymous”/>
<title>Cadastro UF</title>
</h:head>
<h:body>
<h2>Cadastro de Unidades Federativas (UF)</h2>
<h:form id=”form”>
(Continua)
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import br.com.aula.model.Uf;
@ManagedBean
@ApplicationScoped
public class UfBean {
private List<Uf> list;
public List<Uf> getList() {
return list;
}
@PostConstruct
public void init() {
if (list == null) {
list = new ArrayList<Uf>();
Uf pr = new Uf();
pr.setId(1);
pr.setNome(“Paraná”);
pr.setSigla(“PR”);
list.add(pr);
Uf sp = new Uf();
sp.setId(2);
sp.setNome(“São Paulo”);
sp.setSigla(“SP”);
list.add(sp);
}
(Continua)
60 Laboratório de Programação II
}
private Uf uf;
public Uf getUf() {
return uf;
}
Figura 7
Tela de listagem com novo botão de adicionar
localhost:8080/projetoWeb/uf.xhtml
Sigla Nome
PR Paraná
SP São Paulo
Adicionar
Clique nele e uma nova tela será apresentada com uma mensagem
de “Cadastro de Unidades Federativas (UF)”. Você perceberá que a URL
no navegador não mudou para /projectoWeb/cadastrarUf.xhtml. Não
fique preocupado com isso, pois essa é a forma que o JSF trabalha.
Agora vamos personalizar o botão da tela uf.xhtml, por isso retorne a
esse arquivo e adicione a propriedade class=”btn btn-primary” dentro
da tag h:commandButton. O código ficará assim:
<h:commandButton value=”Adicionar” action=”#{ufBean.
novo}” class=”btn btn-primary”/>
Figura 8
Botão com a propriedade de cor alterada
Sigla Nome
PR Paraná
SP São Paulo
Adicionar
62 Laboratório de Programação II
Adicione o código-fonte a seguir dentro da tag <h:form> do arquivo
cadastrarUf.xhtml
<h:panelGrid columns=”3” cellpadding=”5”>
<h:outputLabel value=”Sigla UF:” for=”sigla-uf”
class=”form-label”/>
<h:inputText id=”sigla-uf” required=”true”
value=”#{ufBean.uf.sigla}” label=”Sigla UF”
validatorMessage=”Digite somente letras”
maxlength=”2” class=”form-control”>
<f:validateRegex pattern=”^[a-zA-Z]+$” />
</h:inputText>
<h:message for=”sigla-uf” display=”text” />
<h:outputLabel value=”Nome UF:” for=”nome-uf”
class=”form-label”/>
<h:inputText id=”nome-uf” required=”true”
value=”#{ufBean.uf.nome}” label=”Nome UF”
class=”form-control”>
</h:inputText>
<h:message for=”nome-uf” display=”text” />
</h:panelGrid>
<h:commandButton value=”Salvar” action=”#{ufBean.
salvar}” class=”btn btn-success”/>
O resultado dessas alterações deverá ser algo semelhante à Figura 9:
Figura 9
Tela de cadastro de uma nova UF após as alterações
Sigla UF:
Nome UF:
Salvar
Outra funcionalidade que você pode testar é tentar inserir algo com
os campos vazios, como mostrados na figura a seguir. Ao clicar no bo-
tão Salvar com os campos vazios, será apresentada uma mensagem
(Figura 10).
Salvar
Figura 11
Validação do tipo do valor digitado pelo usuário no campo Sigla UF
Salvar
64 Laboratório de Programação II
A última alteração necessária é alterar o método init(), retirando as
unidades federativas criadas à mão. O método init() deverá ficar assim:
@PostConstruct
public void init() {
if (list == null) {
list = new ArrayList<Uf>();
}
}
Após essas alterações, não se esqueça de parar o Tomcat e reali-
zar um novo processo de build pelo Maven. Na Figura 12 temos um
exemplo de cadastros realizados a partir das alterações que fizemos
até aqui.
Figura 12
Cadastro de novas unidades federativas a partir do próprio sistema
Sigla Nome
PR PARANA
SC SANTA
RN Rio Grande do Norte
TO Tocantins
Adicionar
Figura 13
Tela de listagem com opção de remoção
Sigla Nome
TO TOCANTINS Remover
PA Pará Remover
Adicionar
66 Laboratório de Programação II
Perceba na figura a seguir que esse novo botão está chaman-
do o método editar e passando via parâmetro a unidade federativa
selecionada.
Figura 14
Tela de listagem com os botões de edição e remoção
localhost:8080/projetoWeb/uf.xhtml
Sigla Nome
Adicionar
Figura 15
Anotação ApplicationScoped usada na classe UfBean
68 Laboratório de Programação II
o Managed Bean só é enviado para a memória ao ser requisitado e,
logo depois, saindo da memória e perdendo todos os dados. Em outros
escopos os dados ficam armazenados para serem consultados poste-
riormente. Quanto mais tempo ou mais dados forem guardados, mais
pesada vai ficar a sua aplicação, por isso não é aconselhável guardar
tudo no escopo. Cada situação deve ser analisada com calma.
Quadro 1
Escopos do JSF
ATIVIDADES
1. Ao tentar abrir a tela uf.xhtml, é apresentada uma mensagem de erro:
Vídeo “Message /uf.xhtml @15,20 <h:inpText> TagLibrary not
supporter”
Em qual linha está acontecendo o problema?
2. Bill deseja adicionar um botão em uma página JSF. Para isso, ele
adiciona o seguinte código:
<h:commandButton value=”Listar” action=”#{novoBean.
listar()}”/>
Testando a alteração, Bill percebe que o botão não está com a cor
verde. Como ele pode resolver esse problema por meio do Bootstrap?
3. Qual dos escopos do JSF deve ser utilizado quando o site tem uma
única página e não precisa armazenar dados durante muito tempo?
Justifique sua resposta.
70 Laboratório de Programação II
4
Arquitetura e persistência
de dados com Java
Quando um software está sendo projetado, é necessário veri-
ficar se ele precisa ou não de armazenamento de dados de modo
temporário. Caso seja identificada a necessidade de armazena-
mento permanente, devemos definir qual solução tecnológica será
usada. A mais utilizada são os sistemas gerenciadores de banco de
dados (SGBD), softwares específicos que gerenciam o armazena-
mento, o acesso e a organização dos dados.
Um SGBD é um programa de computador instalado em uma
máquina específica, também chamada de servidor de banco de
dados. Esse servidor será acessado pelo software que está sendo
desenvolvido. Neste capítulo iremos estudar os conceitos referen-
tes à forma de acesso e como um programa Java Web armazena
dados em um SGBD.
Navegador web
VIEW
CONTROLLER
MODEL
Banco de
dados
72 Laboratório de Programação II
endereço na internet, como http://localhost:8080/seuProjeto, ou um
clique em algum componente apresentado na tela, como um botão.
início do arquivo. Tanto o DAO quanto o arquivo contendo o @Entity Disponível em: https://youtu.
be/2jYssOFIPxY?t=67. Acesso
são considerados parte do módulo model do MVC. Observemos na
em: 8 abr. 2021.
Figura 2 a aplicação do MVC no Java Web.
Figura 2
Aplicação do MVC no projeto Java Web
Navegador web
@ManagedBean
DAO @Entity
Banco
de
Fonte: Elaborada pelo autor. dados
Navegador web
CONTROLLER
@ManagedBean
DAO @Entity
MODEL
Banco
de
dados
74 Laboratório de Programação II
grama Java e um SGBD consigam se comunicar, é necessária uma ca-
mada intermediária de tradução dos formatos de dados. Essa camada
é denominada ORM (Object-relational Mapping), ou mapeamento objeto
relacional, e implementada por diversos frameworks, em especial o
Hibernate. Na Figura 4 visualizamos a camada ORM entre o SGBD e as
classes do projeto Java Web.
Figura 4
ORM como um interpretador dos objetos e do SGBD
Objeto
A
O
Objeto Objeto
R SGBD
B C
M
Objeto
D
76 Laboratório de Programação II
• Hibernate Envers: usado para auditoria e versionamento dos mo-
delos de classes.
• Hibernate OGM: usado para armazenamento em bases de dados
não relacionais (NoSQL).
• Hibernate Search: usado para integrar pesquisas em bibliotecas
de grandes textos.
• Hibernate Tools: suite de ferramentas acessórias para o Hibernate.
• Hibernate Validator: usado para criar validações nos campos de
um modelo.
import javax.persistence.*;
@Entity
@Table(name = “Uf”)
public class Uf {
@Column(name = “nome_uf”)
private String nomeUf;
@Column(name = “sigla_uf”)
private String siglaUf;
}
<dependencies></dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.30.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.30.Final</version>
</dependency>
c. Salve as alterações para que o Maven realize o download dessas
novas dependências em sua máquina.
78 Laboratório de Programação II
xsi:schemaLocation=”http://maven.apache.org/
POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd”>
<properties>
<maven.compiler.source>1.6</maven.compiler.
source>
<maven.compiler.target>1.6</maven.compiler.target>
</properties>
<modelVersion>4.0.0</modelVersion>
<groupId>br.com.aula</groupId>
<artifactId>ExemploCrudJSF</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>ExemploCrudJSF Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.30.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</
artifactId>
<version>5.4.30.Final</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.2.20</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
(Continua)
<build>
<finalName>ExemploCrudJSF</finalName>
</build>
</project>
Para a segunda alteração, serão necessários os seguintes passos:
a. Clique com o botão direito do mouse no nome do projeto, selecione
a opção NEW e crie um source folder.
b. Dê o nome src/main/resources para o novo source folder. Seu
projeto deverá ficar conforme a Figura 5.
Figura 5
Criação do source folder src/main/resources
Hibernate Tools
80 Laboratório de Programação II
O resultado você pode conferir na figura a seguir.
Figura 6
Criação do arquivo persistence.xml
Hibernate Tools
e. Abra o arquivo persistence.xml e insira o código a seguir:
<?xml version=”1.0” encoding=”UTF-8”?>
<persistence-unit name=”id_persistencia”>
<provider>org.hibernate.ejb.
HibernatePersistence</provider>
<properties>
<property name=”javax.persistence.jdbc.driver”
value=”org.postgresql.Driver” />
<property name=”javax.persistence.jdbc.user”
value=”postgres” />
<property name=”javax.persistence.jdbc.
password” value=”123” />
<property name=”javax.persistence.jdbc.url”
value=”jdbc:postgresql://localhost:5432/postgres” />
<property name=”hibernate.hbm2ddl.auto”
value=”update” />
<property name=”hibernate.show_sql”
value=”true” />
<property name=”hibernate.format_sql”
value=”true” />
<property name=”hibernate.dialect” value=”org.
hibernate.dialect.PostgreSQLDialect” />
(Continua)
CONSIDERAÇÕES FINAIS
Neste capítulo aprendemos os conceitos que envolvem o acesso aos
dados e a sua manipulação em um SGBD por meio de um software de-
senvolvido em Java Web. Além disso, configuramos o sistema para que
prossigamos o uso de JPA e Hibernate. Cada vez mais estamos tornando
o sistema completo e pronto para atender às necessidades dos usuários
que usam soluções na internet.
ATIVIDADES
1. Para qual finalidade utilizamos o padrão de projeto DAO em um
Vídeo
projeto web?
82 Laboratório de Programação II
5
Anotações do JPA e
injeção de dependência
Estamos nos aproximando da finalização de um sistema com-
pleto utilizando JSF e banco de dados, o qual poderá ser acessado
por qualquer pessoa na internet.
Neste capítulo entenderemos como são realizadas as principais
operações por meio de comandos que o usuário realiza com um
código-fonte em Java. Para isso, usaremos a base de dados gratuita
H2. Caso você tenha familiaridade com outra, não há problemas
em utilizá-la, mas não se esqueça de colocar a configuração correta
no arquivo persistence.xml.
Além dos conceitos de base de dados, abordaremos o framework
Spring, que nos ajuda em diversos pontos da programação, em es-
pecial na injeção de dependência. Trata-se de um padrão de merca-
do, pois ele facilita o dia a dia de desenvolvimento, evitando que as
classes tenham muito acoplamento, ou seja, estejam vinculadas em
memória pela cláusula new NomeDaClasse().
Ao final deste capítulo, teremos os conhecimentos necessários
para criarmos softwares em Java Web que poderão ser utilizados
de qualquer dispositivo conectado à internet.
84 Laboratório de Programação II
Quadro 1
Principais anotações e respectivas funções do JPA
Anotação Função
Identifica que uma classe Java representará uma tabela no banco de dados, mas desde que o
@Entity
nome da classe seja o mesmo da tabela na base de dados.
Utilizada com a anotação @Entity, por meio dela é possível vincular uma classe Java com
@Table uma tabela do banco de dados mesmo que tenham nomes diferentes. Para isso, usamos:
@Table(name = ”nome_da_tabela”).
Sinaliza que um atributo da classe será utilizado como chave primária da base de dados, sendo
@Id
ele único e não nulo.
Usada com a anotação @Id, define a estratégia de numeração da chave primária, podendo ser:
• GenerationType.AUTO;
• GenerationType.IDENTITY;
@GeneratedValue
• GenerationType.SEQUENCE;
• GenerationType.TABLE.
Exemplo: @GeneratedValue(strategy = GenerationType.TABLE).
Sinaliza que um atributo da classe será referenciado como uma coluna na base de dados. Po-
demos personalizar essa anotação utilizando as propriedades que ficam dentro dos parênteses,
sendo todas de uso opcional.
@Column(name = “nome_coluna”, nullable = false, length = 10, precision = 10, scale = 2 )
• Name: usada quando o nome do atributo é diferente do nome da coluna na base de dados.
@Column
• Nullable: usada quando o campo na base de dados é de preenchimento obrigatório.
• Length: determina a quantidade de caracteres que será salva na base de dados.
• Precision: estabelece a quantidade de dígitos que um campo numérico tem (considerando
dígitos após a vírgula).
• Scale: determina a quantidade de dígitos após a vírgula. Exemplo: 123,45 (precision = 5; scale = 2).
Vincula campos que estão em tabelas distintas na base de dados e que têm a relação de cardi-
@OneToOne
nalidade UM PARA UM (1 – 1).
Vincula campos que estão em tabelas distintas na base de dados e que têm a relação de cardi-
@OneToMany
nalidade UM PARA MUITOS (1 – N).
Vincula campos que estão em tabelas distintas na base de dados e que têm a relação de cardi-
@ManyToOne
nalidade MUITOS PARA UM (N – 1).
Vincula campos que estão em tabelas distintas na base de dados e que têm a relação de cardi-
@ManyToMany
nalidade MUITOS PARA MUITOS (N – N).
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Uf {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
86 Laboratório de Programação II
@Column(nullable = false, length = 20)
private String nome;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
(Continua)
@Entity
public class Cidade {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@ManyToOne
private Uf uf;
public Uf getUf() {
return uf;
}
88 Laboratório de Programação II
5. Não se esqueça de criar os métodos acessores desse novo
atributo na classe Uf.java:
Saiba mais Caso você tenha preferência por outro SGBD, será preciso realizar al-
Acesse o link a seguir terações no arquivo persistence.xml e no applicationContext.xml, os quais
para saber quais con-
criaremos na sequência.
figurações utilizar para
outros bancos de dados. Caso você decida continuar usando o PostgreSQL, que já está confi-
Disponível em: https://examples. gurado, não é necessário fazer as alterações descritas a seguir.
javacodegeeks.com/enterprise-java/
jpa/java-persistence-xml-example/. Começaremos a configuração da nossa aplicação com a base H2.
Acesso em: 29 abr. 2021.
Para isso, executaremos os seguintes passos:
1. Abra o arquivo pom.xml e inclua uma nova dependência.
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
<scope>runtime</scope>
</dependency>
<persistence-unit name=”id_persistencia”>
<provider>org.hibernate.jpa.
HibernatePersistenceProvider</provider>
<properties>
(Continua)
90 Laboratório de Programação II
<property name=”javax.persistence.jdbc.
driver” value=”org.h2.Driver” />
<property name=”javax.persistence.jdbc.
user” value=”sa” />
<property name=”javax.persistence.jdbc.
password” value=”” />
<property name=”javax.persistence.jdbc.url”
value=”jdbc:h2:mem:test;DATABASE_TO_UPPER=false;DB_
CLOSE_DELAY=-1” />
<property name=”hibernate.hbm2ddl.auto”
value=”update” />
<property name=”hibernate.show_sql”
value=”true” />
<property name=”hibernate.format_sql”
value=”true” />
<property name=”hibernate.dialect”
value=”org.hibernate.dialect.H2Dialect”/>
<property name=”hibernate.temp.use_jdbc_
metadata_defaults” value=”false”/>
</properties>
</persistence-unit>
</persistence>
Essa configuração é a mais básica para que o software trabalhe
corretamente com o JPA, o Hibernate e o banco de dados. Com o passar
do tempo, mais pessoas usarão o sistema e, a cada novo acesso, um vín-
culo com a base de dados será concretizado. Devido ao somatório de vín-
culos, o sistema se tornará lento, por isso aconselhamos usar a técnica de
pool de conexões, a qual restringe a quantidade de conexões na base de
dados a um valor determinado (por exemplo, 20 conexões simultâneas,
independentemente da quantidade de usuários conectados simultanea-
mente no sistema). Para implementar o pool de conexões, utilizaremos a
biblioteca C3P0, incluindo-a no pom.xml e adicionando novas proprieda-
des ao arquivo persistence.xml. Seguem os passos:
1. Abra o arquivo pom.xml e adicione a nova dependência.
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>5.4.30.Final</version>
</dependency>
92 Laboratório de Programação II
5.3 Utilizando injeção de
Vídeo dependência com Spring
Para concluirmos as configurações e realizarmos as operações bá-
sicas de inserção, listagem, remoção e atualização em uma base de
dados, vincularemos o arquivo UfBean ao UfDao, que irá persistir os
dados na base H2.
Nome da
Descrição
biblioteca
Pacote básico para o gerenciamento de transações, injeção de dependências e men-
Spring Framework
sagens e o controle de acesso a dados.
Utilizado para iniciar rapidamente um projeto com Spring, é uma ajuda muito boa
para quem está começando nesse framework. Com a experiência nessas bibliotecas,
Spring Boot
é possível escolher individualmente os pacotes que realmente serão utilizados e,
com isso, deixar de usar o Spring Boot.
(Continua)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.3.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.5</version>
</dependency>
94 Laboratório de Programação II
<listener>
<listener-class>org.springframework.web.context.
ContextLoaderListener</listener-class>
</listener>
<bean id=”dataSource”
class=”org.springframework.jdbc.datasource.
DriverManagerDataSource”>
<property name=”driverClassName” value=”org.
h2.Driver” />
<property name=”url”
value=”jdbc:h2:mem:test;DATABASE_TO_UPPER=false;DB_
CLOSE_DELAY=-1” />
<property name=”username” value=”sa” />
<property name=”password” value=”” />
</bean>
<bean
(Continua)
96 Laboratório de Programação II
class=”org.springframework.orm.jpa.
LocalContainerEntityManagerFactoryBean”
id=”entityManagerFactory”>
<property name=”persistenceXmlLocation”
value=”classpath:./META-INF/persistence.xml” />
<context:component-scan
base-package=”br.com.aula”>
</context:component-scan>
<bean class=”org.springframework.orm.jpa.
JpaTransactionManager”
id=”transactionManager”>
<property name=”entityManagerFactory”
ref=”entityManagerFactory” />
</bean>
<tx:annotation-driven
transaction-manager=”transactionManager” />
<context:annotation-config />
<aop:config proxy-target-class=”true”/>
</beans>
Para checagem, a Figura 4 apresenta a estrutura de pastas e ar-
quivos do projeto.
Eclipse
98 Laboratório de Programação II
6. Elabore um arquivo chamado UfDao, o qual deve implementar
áreas do banho. Para isso, crie um pacote no src/main e atribua
a ele o nome br.com.aula.dao.impl. Dentro desse pacote, crie
outro arquivo chamado UfDao.java e adicione o código a seguir:
package br.com.aula.dao.impl;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.
Transactional;
import br.com.aula.dao.DAO;
import br.com.aula.model.Uf;
@Repository
@Transactional
public class UfDao implements DAO<Uf> {
@PersistenceContext
public EntityManager entityManager;
@Override
public List<Uf> findAll() {
return entityManager.createQuery(“from Uf”).
getResultList();
}
@Override
public Uf findById(Integer id) {
Query query = entityManager.createQuery(“from Uf
where id = :pId”);
query.setParameter(“pId”, id);
return (Uf) query.getSingleResult();
}
@Override
public List<Uf> findByName(String name) {
Query query = entityManager.createQuery(“from
Uf where nome like :pNome”);
query.setParameter(“pNome”, “%” + name + “%”);
return query.getResultList();
}
@Override
public boolean save(Uf uf) {
(Continua)
@Override
public boolean delete(Integer id) {
Uf uf = findById(id);
entityManager.remove(uf);
return true;
}
}
7. Altere o controlador UfBean para que ele consiga operar as
funcionalidades básicas, ou seja, para que faça uma inserção,
edição, listagem e remoção. Desse modo:
para o Spring identificar que a classe está na camada Model do Disponível em: https://youtu.
be/77O4zRagH2Y. Acesso em: 29
padrão MVC e que ela irá acessar a base de dados.
abr. 2021.
• Na classe UfDao, temos a anotação @Transactional e, por meio
dela, todas as operações são elegíveis para persistirem ou altera-
rem algo na base de dados.
• Na classe UfBean, temos a anotação @Component, maneira
mais simples de sinalizar que essa classe pode receber ou inje-
tar dependências.
• Por fim, na classe UfBean, temos a anotação @Autowired, que 1
serve para injetar uma dependência sem o vínculo de como. Todo o projeto está disponível
na plataforma GitHub (https://
Concluímos nosso estudo com um sistema web usando Java (JSF), github.com/wagnerfusca/
que tem persistência de dados (independentemente de qual seja), ExemploCrudJSF) para even-
1 tuais consultas.
injeção de dependência (DI) e controle de conexões (C3P0) .
CONSIDERAÇÕES FINAIS
Chegamos ao final deste capítulo e de nosso estudo. Agora temos a
base prática e todos os conceitos necessários para avançar na constru-
ção de sistemas web utilizando JSF e banco de dados. Para efeito prático,
desafiamos você a criar uma tela de cadastro de cidade e, posteriormen-
te, um cadastro de endereço que terá vínculo com as classes já criadas
(cidade e UF).
Gabarito 103
3 Criando páginas avançadas com Java
1. O problema está acontecendo na linha 15, pois não existe o comando
<h:inpText>. O correto é <h:inputText>.
3. Nesse caso devemos usar o escopo padrão, que é o mais leve de todos
e tem o ciclo de vida mais curto. O escopo padrão é o @RequestScoped.
Gabarito 105
Referência
BOND, M. et al. Aprenda J2EE em 21 dias. Trad. de João Eduardo Nobrega. Ribeirão Preto:
Makron Books, 2003.