Escolar Documentos
Profissional Documentos
Cultura Documentos
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).
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:
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”.
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
Classe Agenda
package br.com.tiowillians.agenda;
import java.util.ArrayList;
//
// 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>();
//
// 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>();
return listaUsuarios;
}
return listaPessoas;
}
//
// 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);
}
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);
}
return false;
}
listaUsuarios.add(novo);
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;
if (!arquivo.exists())
{
linhas = null;
return;
}
try
{
// faz a leitura do arquivo
FileReader fr = new FileReader(arquivo);
BufferedReader br = new BufferedReader(fr);
br.close();
fr.close();
}
catch (Exception ex)
{
System.out.println ("ERRO: leitura do arquivo de dados!");
}
}
try
{
// cria o arquivo (caso ele não exista)
arquivo.createNewFile();
// 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());
}
}
Classe Pessoa
package br.com.tiowillians.agenda;
//
// 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
Classe ResumoPessoa
package br.com.tiowillians.agenda;
//
// GETTERS e SETTERS
//
Classe UFBrasil
package br.com.tiowillians.agenda;
Classe Usuario
package br.com.tiowillians.agenda;
// CONSTRUTORES
public Usuario()
{
login = "";
senha = "";
}
// GETTERS e SETTERS
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>
<h:panelGrid columns="2">
<h:outputLabel value="Login:" for="login"/>
<h:inputText id="login" value="#{loginBeans.login}"/>
<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>
<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" />
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
return true;
}
return false;
}
return true;
}
return false;
}
// GETTERS e SETTERS
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: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();
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
//
return "pessoa";
}
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
//
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;
@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"));
}
};
//
// AÇOES DO USUÁRIO
//
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);
return "agenda";
}
// GETTERS e SETTERS
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.