Você está na página 1de 25

Criando Páginas com Persistência

Utilização de arquivos locais para persistência de dados em páginas Web Dinâmicas

Esse documento mostra como utilizar persistência de dados utilizando arquivos textos locais no
ambiente Eclipse, juntamente com JSF (Java Server Faces) e GlassFish. Será criado uma página
para manutenção de dados de uma agenda telefônica, havendo necessidade de fazer
autenticação de usuário via login e senha. Como o objetivo desse documento é descrever um
roteiro de utilização de persistência de dados, não serão considerados problemas de segurança,
onde o login e senha dos usuários serão armazenados nos arquivos sem nenhuma criptografia
(em um ambiente real, isso NUNCA deve acontecer).

Versões dos softwares e ambientes utilizados:

 Java Faces: 2.2


 Eclipse: Oxygen.1a Release (4.7.1a)
 GlassFish: 4.1.2

Estrutura da base de dados


A base de dados será estruturada em dois arquivos texto:

 usuarios.txt
Arquivo texto contendo os dados dos usuários que poderão acessar o sistema. Cada
linha do arquivo corresponderá aos dados de um usuário (com 2 campos), com o
seguinte formato:
login;senha
 pessoas.txt
Arquivo texto contendo os dados das pessoas cadastradas na agenda. Cada linha do
arquivo corresponderá aos dados de uma pessoa (com 9 campos), com o seguinte
formato:
nome;rua;complemento;setor;cidade;uf;cep;ddd;telefone

Utilizando o GlassFish
Utilizaremos o servidor de aplicação GlassFish para gerenciar o acesso à página dinâmica Web
que criaremos. Para isso, basta baixar o GlassFish da Internet e descompactar o arquivo baixado
em uma pasta. Atualmente o GlassFish está na versão 5, mas como o Eclipse ainda não é
compatível com essa versão, iremos utilizar uma versão mais antiga (no caso, a versão 4.1.2).

Download do GlassFish:

 URL: https://javaee.github.io/glassfish/download
 Versão: GlassFish 4.1.2 – Full Platform (
 Arquivo: glassfish-4.1.2.zip
ATIVIDADE:

Fazer o download do GlassFish (arquivo: glassfish-4.1.2.zip) e descompatá-lo no seu


computador.

Configurando o GlassFish no Eclipse


Acessar a aba “Servers” (parte inferior o Eclipse). Se essa aba não estiver presente, ela poderá
ser visualizada através do menu do Eclipse:

Na aba “Servers”, clique no link “Create a new server...”

Configure o nome e local do servidor (se necessário, informe a pasta na qual você descompactou
o arquivo glassfish-4.1.2.zip).
Se a configuração for bem-sucedida, o servidor aparecerá na aba “Servers”.

Criando a aplicação no Eclipse


Dados do projeto:
 Nome: Agenda
 Target Runtime: GlassFish 4
 Configuration: JavaServer
Faces 2.2 Project
ATIVIDADE:

 Criar um novo projeto “Dynamic Web Project” no Eclipse e configure-o conforme


mostrado na figura anterior.
 Dentro da pasta “src”, criar um pacote para colocar as classes do projeto
(no meu exemplo: br.com.tiowillians.agenda)
 Dentro da pasta “WebContent”, criar uma pasta “resources”. É nessa pasta que serão
colocados os arquivos texto com os dados dos usuários e pessoas.

Classes de manipulação dos dados dos arquivos texto


ATIVIDADE:

Dentro do pacote, criar as classes para manipulação dos arquivos texto, a saber:
 Agenda: conterá os dados lidos dos arquivos e informações gerais que serão
usadas entre as páginas mostradas.
 ArquivosTexto: classe para leitura e escrita dos arquivos texto
 ResumoPessoa: armazena os dados que serão mostrados na página que lista as
pessoas cadastradas na agenda. Nessa página, não são mostrados todos os dados.
 Pessoa: armazena os dados lidos do arquivo texto das pessoas
 UFBrasil: armazena os nomes e siglas dos Estados (Unidades da Federação) do
Brasil.
 Usuario: armazena os dados lidos do arquivo texto dos usuários

Os códigos dessas classes estão listados abaixo.

Classe Agenda
package br.com.tiowillians.agenda;

import java.util.ArrayList;

public class Agenda


{
// nomes dos arquivos textos de dados
private static final String ARQ_USUARIOS = "usuarios.txt";
private static final String ARQ_PESSOAS = "pessoas.txt";

private static ArrayList<Usuario> listaUsuarios = null;


private static ArrayList<Pessoa> listaPessoas = null;

// indica se usuário já fez login


private static boolean fezLogin = false;
private static Pessoa dadosOriginais = null;
private static int idxOriginais = -1;

//
// monta lista de usuários cadastrados a partir da lista
// criada na leitura do arquivo texto.
//
public static void MontaListaUsuarios()
{
// cria lista vazia de usuários cadastrados
listaUsuarios = new ArrayList<Usuario>();

ArquivosTexto arq = new ArquivosTexto(ARQ_USUARIOS);


arq.lerArquivoTexto();
ArrayList<String> lista = arq.getLinhas();
if (lista == null)
return;

// percorre lista das linhas lidas no arquivo texto


// Formato da lista de entrada: login;senha
Usuario novoUsr;
String[] vet;
for (String str : lista)
{
// separa dados da lista
vet = str.split(";");

// insere dados na lista de usuários, caso não haja


// erro na separação dos dados da linha
if (vet.length == 2)
{
novoUsr = new Usuario(vet[0], vet[1]);
listaUsuarios.add (novoUsr);
}
}
}

//
// monta lista de pessoas cadastradas a partir da lista
// criada na leitura do arquivo texto.
//
public static void MontaListaPessoas()
{
// cria lista vazia de pessoas cadastradas
listaPessoas = new ArrayList<Pessoa>();

ArquivosTexto arq = new ArquivosTexto(ARQ_PESSOAS);


arq.lerArquivoTexto();
ArrayList<String> lista = arq.getLinhas();
if (lista == null)
return;

// percorre lista das linhas lidas no arquivo texto


//
// Formato da lista de entrada:
// nome;rua;complemento;setor;cidade;uf;cep[;telefones]
//
// onde [;telefones] é uma lista de telefones da pessoa, separados
// por ";", e cada telefone possui o formato "ddd;número;tipo"
//
Pessoa novaPessoa;
String[] vet;
for (String str : lista)
{
// separa dados da lista
vet = str.split(";");

// insere dados na lista de pessoas, caso não haja


// erro na separação dos dados da linha
if (vet.length == 9)
{
novaPessoa = new Pessoa(vet);
listaPessoas.add (novaPessoa);
}
}
}

public static ArrayList<Usuario> getListaUsuarios()


{
// se lista de usuários estiver vazia, ler arquivo texto
// com os dados dos usuários cadastrados
if (listaUsuarios == null)
MontaListaUsuarios();

return listaUsuarios;
}

public static ArrayList<Pessoa> getListaPessoas()


{
// se agenda estiver vazia, ler arquivo texto
// com os dados e telefones das pessoas cadastradas
if (listaPessoas == null)
MontaListaPessoas();

return listaPessoas;
}

public static boolean jaFezLogin()


{
return fezLogin;
}

public static void jaFezLogin(boolean b)


{
fezLogin = b;
}

public static Pessoa getDadosOriginais ()


{
return dadosOriginais;
}

public static void setDadosOriginais (Pessoa p)


{
dadosOriginais = p;
}

public static int getIndiceOriginal()


{
return idxOriginais;
}

public static void setIndiceOriginal(int idx)


{
idxOriginais = idx;

if (idx >= 0 && idx <= listaPessoas.size())


{
dadosOriginais = listaPessoas.get(idx);
}
else
dadosOriginais = null;
}

//
// salva dados dos usuários contidos na lista de usuários
// no arquivo texto.
//
public static void salvaUsuarios()
{
ArrayList<String> linhas = new ArrayList<String>();
String linha;
for(Usuario usr: listaUsuarios)
{
linha = usr.getLogin() + ";" + usr.getSenha();
linhas.add(linha);
}

ArquivosTexto arq = new ArquivosTexto(ARQ_USUARIOS);


arq.gravarDados(linhas);
}

public static void salvaPessoas()


{
ArrayList<String> linhas = new ArrayList<String>();

String linha;
for(Pessoa p: listaPessoas)
{
linha = p.getNome() + ";" + p.getRua() + ";" + p.getComplemento() + ";" +
p.getSetor() + ";" + p.getCidade() + ";" + p.getUf() + ";" +
p.getCep() + ";" + p.getDdd() + ";" + p.getNumFone();

linhas.add(linha);
}

ArquivosTexto arq = new ArquivosTexto(ARQ_PESSOAS);


arq.gravarDados(linhas);
}

public static boolean loginJaCadastrado(String login)


{
if (listaUsuarios == null)
return false;

for(Usuario usr: listaUsuarios)


{
if (login.compareToIgnoreCase(usr.getLogin()) == 0)
return true;
}

return false;
}

public static void insereNovoUsuario(String login, String senha)


{
Usuario novo = new Usuario(login, senha);
if (listaUsuarios == null)
listaUsuarios = new ArrayList<Usuario>();

listaUsuarios.add(novo);

// salva lista no arquivo


salvaUsuarios();
}

public static void insereNovaPessoa(Pessoa pNova)


{
// insere novo elemento na lista de pessoas cadastradas
listaPessoas.add(pNova);

// salva dados no arquivo


salvaPessoas();
}

public static void alteraDadosPessoa(Pessoa pNova)


{
// elimina dados antigo
listaPessoas.remove(idxOriginais);

// insere dados novos na lista


insereNovaPessoa(pNova);
}
}

Classe ArquivosTexto
package br.com.tiowillians.agenda;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

/*
* Classe para gravação e leitura de arquivos texto
*/
public class ArquivosTexto
{
// percurso + nome do arquivo texto a ser lido/gravado
private String percursoCompletoArquivo;

// Lista contendo cada linha do arquivo


private ArrayList<String> linhas = null;

public ArquivosTexto(String nomeArquivo)


{
try
{
// obtem percurso para o arquivo
ExternalContext ec =
FacesContext.getCurrentInstance().getExternalContext();
percursoCompletoArquivo = ec.getRealPath("/");
if (percursoCompletoArquivo.endsWith("\\") == false)
percursoCompletoArquivo += "\\";
percursoCompletoArquivo += "resources\\" + nomeArquivo;
}
catch (Exception ex)
{
System.out.println("Erro Construtor de TextFileOnResource:" +
ex.getMessage());
percursoCompletoArquivo = null;
}
}

public void lerArquivoTexto()


{
File arquivo = new File(percursoCompletoArquivo);
String linha;

if (!arquivo.exists())
{
linhas = null;
return;
}

try
{
// faz a leitura do arquivo
FileReader fr = new FileReader(arquivo);
BufferedReader br = new BufferedReader(fr);

linhas = new ArrayList<String>();

// leitura dos dados (enquanto houver linhas)


while (br.ready())
{
//lê a proxima linha
linha = br.readLine();
linhas.add(linha);
}

br.close();
fr.close();
}
catch (Exception ex)
{
System.out.println ("ERRO: leitura do arquivo de dados!");
}
}

public void gravarDados(ArrayList<String> linhas)


{
File arquivo = new File(percursoCompletoArquivo);

try
{
// cria o arquivo (caso ele não exista)
arquivo.createNewFile();

// variáveis para manipulação do arquivo


FileWriter fw = new FileWriter(arquivo, false);
BufferedWriter bw = new BufferedWriter(fw);

// grava dados
for (String str : linhas)
{
bw.write(str);
bw.newLine();
}

bw.close();
fw.close();
}
catch (Exception ex)
{
System.out.println("ERRO: gravação do arquivo de dados!");
System.out.println(ex.getLocalizedMessage());
}
}

public ArrayList<String> getLinhas()


{
return linhas;
}
}

Classe Pessoa
package br.com.tiowillians.agenda;

public class Pessoa


{
private String nome;
private String rua;
private String complemento;
private String setor;
private String cidade;
private String uf;
private String cep;
private int ddd;
private String numFone;

//
// CONSTRUTORES
//

public Pessoa()
{
nome = "";
rua = "";
complemento = "";
setor = "";
cidade = "";
uf = "";
cep = "";
ddd = 0;
numFone = "";

//
// Formato do parâmetro "String[] dados":
// vetor contendo campos de uma linha do arquivo texto das
// pessoas cadastradas. Essa linha estava no formato:
// nome;rua;complemento;setor;cidade;uf;cep;ddd;numeroFone
//
public Pessoa(String[] dados)
{
this.nome = dados[0];
this.rua = dados[1];
this.complemento = dados[2];
this.setor = dados[3];
this.cidade = dados[4];
this.uf = dados[5];
this.cep = dados[6];
this.ddd = Integer.parseInt(dados[7]);
this.numFone = dados[8];
}

// GETTERS e SETTERS

public String getNome()


{
return nome;
}

public void setNome(String nome)


{
this.nome = nome;
}

public String getRua()


{
return rua;
}

public void setRua(String rua)


{
this.rua = rua;
}

public String getComplemento()


{
return complemento;
}

public void setComplemento(String complemento)


{
this.complemento = complemento;
}

public String getSetor()


{
return setor;
}

public void setSetor(String setor)


{
this.setor = setor;
}

public String getCidade()


{
return cidade;
}

public void setCidade(String cidade)


{
this.cidade = cidade;
}

public String getUf()


{
return uf;
}

public void setUf(String uf)


{
this.uf = uf;
}

public String getCep()


{
return cep;
}

public void setCep(String cep)


{
this.cep = cep;
}

public int getDdd()


{
return ddd;
}

public void setDdd(int ddd)


{
this.ddd = ddd;
}

public String getNumFone()


{
return numFone;
}

public void setNumFone(String numFone)


{
this.numFone = numFone;
}
}

Classe ResumoPessoa
package br.com.tiowillians.agenda;

public class ResumoPessoa


{
private int indice;
private String nome;
private String endereco;
private String telefone;

//
// GETTERS e SETTERS
//

public int getIndice()


{
return indice;
}
public void setIndice(int idx)
{
this.indice = idx;
}
public String getNome()
{
return nome;
}
public void setNome(String nome)
{
this.nome = nome;
}
public String getEndereco()
{
return endereco;
}
public void setEndereco(String endereco)
{
this.endereco = endereco;
}
public String getTelefone()
{
return telefone;
}
public void setTelefone(String telefone)
{
this.telefone = telefone;
}

Classe UFBrasil
package br.com.tiowillians.agenda;

public class UFBrasil


{
private String sigla;
private String nome;

public UFBrasil(String sigla, String nome)


{
this.sigla = sigla;
this.nome = nome;
}

public String getSigla()


{
return sigla;
}
public void setSigla(String sigla)
{
this.sigla = sigla;
}
public String getNome()
{
return nome;
}
public void setNome(String nome)
{
this.nome = nome;
}

Classe Usuario
package br.com.tiowillians.agenda;

public class Usuario


{
private String login;
private String senha;

// CONSTRUTORES

public Usuario()
{
login = "";
senha = "";
}

public Usuario(String login, String senha)


{
this.login = login;
this.senha = senha;
}

// GETTERS e SETTERS

public String getLogin()


{
return login;
}

public void setLogin(String login)


{
this.login = login;
}

public String getSenha()


{
return senha;
}

public void setSenha(String senha)


{
this.senha = senha;
}
}

Criar página de login


ATIVIDADE:

 Dentro da pasta “WebContent”, adicionar uma nova página HTML “login.xhtml”, que
será a página de entrada do sistema, e alterar o conteúdo da página conforme
mostrado abaixo.
 Dentro da pasta “WebContent”, adicionar uma nova página HTML
“novoUsuario.xhtml”, que será a página na qual poderá cadastrar um novo usuário, e
alterar o conteúdo da página conforme mostrado abaixo.
 Criar dentro do pacote de código fonte a classe “LoginBeans”, que será o managed
bean dessas duas páginas, e que irá fornecer os dados a serem exibidos, além de
executar as tarefas de acordo com as ações dos usuários. Alterar o código da classe
conforme mostrado abaixo.

Arquivo login.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">

<h:head>
<title>Agenda Telefônica - Login</title>
</h:head>

<h:body >
<h:form>

<!-- local onde serão mostradas as mensagens de erro -->


<h:messages style="color:red;margin:8px;" />

<h:panelGrid columns="2">
<h:outputLabel value="Login:" for="login"/>
<h:inputText id="login" value="#{loginBeans.login}"/>

<h:outputLabel value="Senha:" for="senha"/>


<h:inputSecret id="senha" value="#{loginBeans.senha}"/>

<h:commandButton value ="OK"


action ="#{loginBeans.fazerLogin}"/>
<h:commandButton value ="Novo Usuário.."
action ="novoUsuario"/>
</h:panelGrid>
</h:form>
</h:body>
</html>
Arquivo novoUsuario.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core" >

<h:head>
<title>Cadastrar Novo Usuário</title>
</h:head>

<h:body >
<h:form>

<!-- local onde serão mostradas as mensagens de erro -->


<h:messages style="color:red;margin:8px;" />

<h:panelGrid columns="2">
<h:graphicImage library="imagens" name="novo_usuario.png" />
<h:outputLabel value="Cadastro de Novo Usuário"
style="font-size:24px; font-weight:bold" />

<h:outputLabel value="Login:" for="login"/>


<h:inputText id="login" value="#{loginBeans.login}"/>

<h:outputLabel value="Senha:" for="senha"/>


<h:inputSecret id="senha" value="#{loginBeans.senha}"/>

<h:commandButton value ="OK" action ="#{loginBeans.cadastrarNovo}"/>


</h:panelGrid>
</h:form>
</h:body>
</html>

Essa página faz referência a uma imagem (arquivo “novo_usuario.png”). Essa imagem deverá
ser colocada dentro da pasta “WebContent/resources/imagens”, podendo ser qualquer
imagem que você desejar mostrar nessa página (essa imagem tem uma função meramente
estética).

Classe LoginBeans
package br.com.tiowillians.agenda;

import java.util.ArrayList;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;

@ManagedBean
public class LoginBeans
{
private String login;
private String senha;

// AÇOES DO USUÁRIO

public String fazerLogin()


{
// indica que usuário ainda não fez login
Agenda.jaFezLogin(false);

// verifica se usuário informou o login


if (loginEmBranco())
{
// permanece na mesma página
return "login";
}

// verifica se usuário informou a senha


if (senhaEmBranco())
{
// permanece na mesma página
return "login";
}

// valida login e senha


ArrayList<Usuario> listaUsr = Agenda.getListaUsuarios();
for(Usuario usr : listaUsr)
{
// valida login ignorando diferenças entre letras maiúsculas e minúsculas
if (login.compareToIgnoreCase(usr.getLogin()) == 0)
{
// valida senha
if (senha.compareTo(usr.getSenha()) == 0)
{
// indica que usuário fez o login com sucesso
Agenda.jaFezLogin(true);

// usuário será redirecionado para a página "agenda.xhtml"


return "agenda";
}
}
}

// login e senha inválidos. Mostra mensagem de erro


FacesMessage mensagem = new FacesMessage ("Login e/ou senha incorretos");
FacesContext.getCurrentInstance().addMessage(null, mensagem);

// permanece na mesma página


return "login";
}

public String cadastrarNovo()


{
// verifica se usuário informou o login
if (loginEmBranco())
{
// permanece na mesma página
return "novoUsuario";
}

// verifica se usuário informou a senha


if (senhaEmBranco())
{
// permanece na mesma página
return "novoUsuario";
}

// verifica se o login informado já existe


if (Agenda.loginJaCadastrado(login))
{
// mostra mensagem de erro
FacesMessage mensagem = new FacesMessage ("Login já foi cadastrado");
FacesContext.getCurrentInstance().addMessage("login", mensagem);
// permanece na mesma página
return "novoUsuario";
}

// insere novo usuário na lista


Agenda.insereNovoUsuario(login, senha);

// volta para a página de login


return "login";
}

// verifica se usuário informou o login


private boolean loginEmBranco()
{
if (login.length() == 0)
{
// mostra mensagem de erro
FacesMessage mensagem = new FacesMessage ("Login não foi informado");
FacesContext.getCurrentInstance().addMessage("login", mensagem);

return true;
}

return false;
}

// verifica se usuário informou a senha


private boolean senhaEmBranco()
{
if (login.length() == 0)
{
// mostra mensagem de erro
FacesMessage mensagem = new FacesMessage ("Senha não foi informada");
FacesContext.getCurrentInstance().addMessage("senha", mensagem);

return true;
}

return false;
}

// GETTERS e SETTERS

public String getLogin()


{
return login;
}

public void setLogin(String login)


{
this.login = login;
}

public String getSenha()


{
return senha;
}

public void setSenha(String senha)


{
this.senha = senha;
}
}
Criar página de visualização da agenda
ATIVIDADE:

 Dentro da pasta “WebContent”, adicionar uma nova página HTML “agenda.xhtml”,


que será a página onde a agenda será visualizada, e alterar o conteúdo da página
conforme mostrado abaixo.
 Dentro da pasta “WebContent”, adicionar uma nova página HTML “pessoa.xhtml”,
que será a página onde os dados e telefones de uma determinada pessoa poderão ser
alterados, e alterar o conteúdo da página conforme mostrado abaixo.
 Criar dentro do pacote de código fonte as classes “AgendaBeans”, “PessoaBeans”,
que serão os managed beans das páginas, fornecendo os dados que serão exibidos,
além de executar as tarefas de acordo com as ações dos usuários. Alterar o código das
classes conforme mostrado abaixo.

Arquivo agenda.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">

<h:head>
<title>Agenda Telefônica</title>
</h:head>

<h:body>
<h1>Agenda Telefônica</h1>

<h:form>
<h:dataTable value="#{agendaBeans.listaResumo}" var="pessoatab"
rendered="#{not empty agendaBeans.listaResumo}"
cellspacing="5">

<h:column>
<f:facet name="header">Nome</f:facet>
#{pessoatab.nome}
</h:column>

<h:column>
<f:facet name="header">Endereco</f:facet>
#{pessoatab.endereco}
</h:column>

<h:column>
<f:facet name="header">Telefone</f:facet>
#{pessoatab.telefone}
</h:column>

<h:column>
<h:commandButton value="Editar"
actionListener="#{agendaBeans.editPessoa}">
<f:attribute name="indice" value="#{pessoatab.indice}" />
</h:commandButton>
</h:column>
</h:dataTable>
<h:commandButton value="Novo Contato"
action="#{agendaBeans.cadastraContato}"/>
</h:form>
</h:body>
</html>

Arquivo pessoa.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core" >

<h:head>
<title>Manutenção Cadastro de Pessoas e Telefones</title>
</h:head>

<h:body >
<h:form>

<h:panelGrid columns="2">
<h:graphicImage library="imagens" name="cadastro.png" />
<h:outputLabel value="Cadastro de Pessoas"
style="font-size:24px; font-weight:bold" />
</h:panelGrid>

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

<h:outputLabel value="Rua:" for="rua"/>


<h:inputText id="rua" value="#{pessoaBeans.rua}"/>

<h:outputLabel value="Complemento:" for="complemento"/>


<h:inputText id="complemento" value="#{pessoaBeans.complemento}"/>

<h:outputLabel value="Setor:" for="setor"/>


<h:inputText id="setor" value="#{pessoaBeans.setor}"/>

<h:outputLabel value="Cidade:" for="cidade"/>


<h:inputText id="cidade" value="#{pessoaBeans.cidade}"/>

<h:outputLabel value="UF:" for="uf"/>


<h:selectOneMenu id="uf" value="#{pessoaBeans.uf}">
<f:selectItem itemLabel="Escolha a UF" noSelectionOption="true"/>
<f:selectItems
value="#{pessoaBeans.ufs}"
var="estado"
itemValue="#{estado.sigla}"
itemLabel="#{estado.nome}" />
</h:selectOneMenu>

<h:outputLabel value="CEP:" for="cep"/>


<h:inputText id="cep" value="#{pessoaBeans.cep}"/>

<h:outputLabel value="DDD:" for="ddd"/>


<h:inputText id="ddd" value="#{pessoaBeans.ddd}"/>

<h:outputLabel value="Número do Telefone:" for="fone"/>


<h:inputText id="fone" value="#{pessoaBeans.numFone}"/>
</h:panelGrid>
<!-- local onde serão mostradas as mensagens de erro -->
<h:messages style="color:red;margin:8px;" />

<h:panelGrid columns="2">
<h:commandButton value="OK"
action="#{pessoaBeans.fazerCadastro}"/>

<h:commandButton value="Cancelar"
action="#{pessoaBeans.cancelarCadastro}"/>
</h:panelGrid>
</h:form>
</h:body>
</html>

Classe AgendaBeans
package br.com.tiowillians.agenda;

import java.util.ArrayList;

import javax.faces.application.ConfigurableNavigationHandler;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

@ManagedBean
public class AgendaBeans
{
private ArrayList<ResumoPessoa> listaResumo;

public AgendaBeans()
{
// leitura do arquivo de dados com as pessoas cadastradas
Agenda.MontaListaPessoas();

// cria uma nova lista resumo


listaResumo = new ArrayList<ResumoPessoa>();

// obtém lista das pessoas cadastradas


ArrayList<Pessoa> listaPessoas = Agenda.getListaPessoas();
if (listaPessoas == null)
return;

// percorre lista das pessoas cadastradas e copia para lista resumo


int idx = 0;
ResumoPessoa novoResumo;
String telefone, endereco;
for (Pessoa pessoa : listaPessoas)
{
novoResumo = new ResumoPessoa();
novoResumo.setIndice(idx++);
novoResumo.setNome(pessoa.getNome());

endereco = pessoa.getRua();
if (pessoa.getComplemento().isEmpty() == false)
endereco += " " + pessoa.getComplemento();

if (pessoa.getCidade().isEmpty() == false)
{
endereco += " - " + pessoa.getCidade();
if(pessoa.getUf().isEmpty() == false)
endereco += "/" + pessoa.getUf();
}
novoResumo.setEndereco(endereco);

if (pessoa.getNumFone().isEmpty())
novoResumo.setTelefone("Não Cadastrado");
else
{
if (pessoa.getDdd() != 0)
telefone = "(" + Integer.toString(pessoa.getDdd()) + ") ";
else
telefone = "";
telefone += pessoa.getNumFone();
novoResumo.setTelefone(telefone);
}

listaResumo.add(novoResumo);
}
}

//
// AÇÕES DO USUÁRIO
//

public String cadastraContato()


{
// indica que está sendo feito um novo cadastro
Agenda.setDadosOriginais(null);

return "pessoa";
}

public String cadastrarFones()


{
return "pessoa";
}

public void editPessoa(ActionEvent event)


{
int indice = (Integer)event.getComponent().getAttributes().get("indice");
Agenda.setIndiceOriginal(indice);

if (Agenda.getDadosOriginais() == null)
{
// mostra mensagem de erro
FacesMessage mensagem = new FacesMessage (
"ERRO INTERNO: dados da pessoa não foram encontrados!");
FacesContext.getCurrentInstance().addMessage(null, mensagem);
}
else
{
// redireciona para página de edição dos dados da pessoa
FacesContext fc = FacesContext.getCurrentInstance();
ConfigurableNavigationHandler nav = (ConfigurableNavigationHandler)
fc.getApplication().getNavigationHandler();
nav.performNavigation("pessoa.xhtml");
}
}

//
// GETTERS e SETTERS
//

public ArrayList<ResumoPessoa> getListaResumo()


{
return listaResumo;
}
public void setListaResumo(ArrayList<ResumoPessoa> listaResumo)
{
this.listaResumo = listaResumo;
}
}

Classe PessoaBeans
package br.com.tiowillians.agenda;

import java.util.ArrayList;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;

@ManagedBean
public class PessoaBeans
{
private String nome;
private String rua;
private String complemento;
private String setor;
private String cidade;
private String uf;
private String cep;
private int ddd;
private String numFone;

private ArrayList<UFBrasil> ufs;

@SuppressWarnings("serial")
public PessoaBeans()
{
// inicializa lista dos Estados Brasileiros
ufs = new ArrayList<UFBrasil>()
{
{
add(new UFBrasil("AC", "Acre"));
add(new UFBrasil("AL", "Alagoas"));
add(new UFBrasil("AP", "Amapá"));
add(new UFBrasil("AM", "Amazonas"));
add(new UFBrasil("BA", "Bahia"));
add(new UFBrasil("CE", "Ceará"));
add(new UFBrasil("DF", "Distrito Federal"));
add(new UFBrasil("ES", "Espírito Santo"));
add(new UFBrasil("GO", "Goiás"));
add(new UFBrasil("MA", "Maranhão"));
add(new UFBrasil("MT", "Mato Grosso"));
add(new UFBrasil("MS", "Mato Grosso do Sul"));
add(new UFBrasil("MG", "Minas Gerais"));
add(new UFBrasil("PA", "Pará"));
add(new UFBrasil("PB", "Paraíba"));
add(new UFBrasil("PR", "Paraná"));
add(new UFBrasil("PE", "Pernambuco"));
add(new UFBrasil("PI", "Piauí"));
add(new UFBrasil("RJ", "Rio de Janeiro"));
add(new UFBrasil("RN", "Rio Grande do Norte"));
add(new UFBrasil("RS", "Rio Grande do Sul"));
add(new UFBrasil("RO", "Rondônia"));
add(new UFBrasil("RR", "Roraima"));
add(new UFBrasil("SC", "Santa Catarina"));
add(new UFBrasil("SP", "São Paulo"));
add(new UFBrasil("SE", "Sergipe"));
add(new UFBrasil("TO", "Tocantins"));
}
};

// verifica se está inserindo novo contato ou alterando dados


// de um já existente
Pessoa p = Agenda.getDadosOriginais();
if (p != null)
{
// alterando dados de um contato já existente
this.nome = p.getNome();
this.rua= p.getRua();
this.complemento = p.getComplemento();
this.setor = p.getSetor();
this.cidade = p.getCidade();
this.uf = p.getUf();
this.cep = p.getCep();
this.ddd = p.getDdd();
this.numFone = p.getNumFone();
}
}

//
// AÇOES DO USUÁRIO
//

public String fazerCadastro()


{
// verifica se nome está em branco
if (nome.length() == 0)
{
// mostra mensagem de erro
FacesMessage mensagem = new FacesMessage ("Nome não foi informado");
FacesContext.getCurrentInstance().addMessage("nome", mensagem);

return "pessoa";
}

// copiar dados
Pessoa p = new Pessoa();
p.setNome(nome);
p.setRua(rua);
p.setComplemento(complemento);
p.setSetor(setor);
p.setCidade(cidade);
p.setUf(uf);
p.setCep(cep);
p.setDdd(ddd);
p.setNumFone(numFone);

// salva dados na Classe Agenda


if (Agenda.getDadosOriginais() == null)
{
// inserindo nova pessoa
Agenda.insereNovaPessoa(p);
}
else
{
// alterando dados de uma pessoa já cadastrada
Agenda.alteraDadosPessoa(p);
}

return "agenda";
}

public String cancelarCadastro()


{
return "agenda";
}

// GETTERS e SETTERS

public String getNome()


{
return nome;
}
public void setNome(String nome)
{
this.nome = nome;
}
public String getRua()
{
return rua;
}
public void setRua(String rua)
{
this.rua = rua;
}
public String getComplemento()
{
return complemento;
}
public void setComplemento(String complemento)
{
this.complemento = complemento;
}
public String getSetor()
{
return setor;
}
public void setSetor(String setor)
{
this.setor = setor;
}
public String getCidade()
{
return cidade;
}
public void setCidade(String cidade)
{
this.cidade = cidade;
}
public String getUf()
{
return uf;
}
public void setUf(String uf)
{
this.uf = uf;
}
public String getCep()
{
return cep;
}
public void setCep(String cep)
{
this.cep = cep;
}
public ArrayList<UFBrasil> getUfs()
{
return ufs;
}

public int getDdd()


{
return ddd;
}

public void setDdd(int ddd)


{
this.ddd = ddd;
}

public String getNumFone()


{
return numFone;
}

public void setNumFone(String numFone)


{
this.numFone = numFone;
}
}

Arquivos de dados
Criar na pasta “WebContent/Resources” os arquivos “pessoas.txt” e “usuarios.txt” contendo
alguns cadastros de pessoas e usuários, conforme formato descrito no início deste documento.
Com isso, ao iniciar o servidor de aplicação, já existirão alguns dados previamente cadastrados,
uma vez que, todas as vezes que for feita uma alteração nos códigos fontes e as páginas forem
publicadas no GlassFish, esses arquivos serão sobrescritos.

Testar o projeto e fazer as seguintes alterações


Testar o projeto e, caso tudo funcione conforme o esperado, fazer as seguintes alterações no
projeto Agenda:

 Na página “login.xhtml”, implementar “Alterar Senha”.


 Na página “pessoa.xhtml”:
o Não deixar que o usuário cadastre duas pessoas com o mesmo nome.
o Validar e formatar os dados: CEP e Telefone
 Na página “agenda.xhtml”:
o Não deixar que a página seja carregada sem que o usuário tenha previamente
feito o login.
o Sempre manter a lista de pessoas em ordem alfabética.
o Adicionar um botão para eliminar os dados de cada uma das linhas mostradas
na tabela.
o Adicionar um botão para visualizar todos os dados de uma linha mostrada na
tabela.
o Implementar um botão de busca por qualquer dado.
o Permitir que uma pessoa tenha zero ou mais telefones, sem limite da
quantidade de telefones por pessoa.

Você também pode gostar