Laboratório PROGRAMAÇÃO WEB II: Prática 6
Ferramentas utilizadas:
•
NetBeans;
Desenvolvendo cadastrado de Usuário e conexão em Banco de Dados
Passo 1:
Crie um projeto um projeto Maven com nome sistFinanceiro.
-Acesse no NetBeans
Arquivo
Novo Projeto
Em Categorias selecione Maven
e em Projetos: Selecione Aplicação Web.
Clique em Próximo para continuar.
Clique em Próximo para continuar.
Após a criação do projeto vamos editar o conteúdo do arquivo pom.xml, ou
seja, definir as dependências do projeto no Maven.
Edite o arquivo pom.xml conforme código abaixo:
Dica apague o conteúdo do arquivo criado e cole o conteúdo abaixo.
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>br.com.pitagoras</groupId>
<artifactId>sistFinanceiro</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>sistFinanceiro</name>
<properties>
<endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<repositories>
<repository>
<id>jvnet-nexus-releases</id>
<name>jvnet-nexus-releases</name>
<url>https://maven.java.net/content/repositories/releases/</url>
</repository>
<dependencies> <dependency> <groupId>javax</groupId> <artifactId>javaee-web-api</artifactId> <version>7.0</version> <scope>provided</scope> </dependency>
<!-- Java Server Faces -->
<dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.faces</artifactId> <version>2.2.10</version> </dependency>
<!-- Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.4.Final</version>
</dependency>
<!-- MySQL -->
<groupId>javax</groupId>
<artifactId>javaee-endorsed-api</artifactId>
<version>7.0</version>
<type>jar</type>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Passo 2:
Vamos adicionar o Frameworks JavaServer Faces ao nosso projeto.
Selecione o projeto sistFinanceiro e com o botão direito do mouse e selecione
Propriedades.
Clique em JavaServer Faces e clique em OK.
Na aba Configurações e em Padrão de URL do Servlet JSF, apague o conteúdo e
preencha com *.jsf.
Clique em OK para concluir.
Veja que houve uma modificação na estrutura do projeto
Passo 3:
Agora iremos criar inicialmente 3 pacotes já na Pasta Pacotes de
Códigos Fontes. Conforme figura abaixo:
Para isso selecione Pacotes de Códigos-fontes e com o botão direito do mouse
selecione
Novo
Pacote Java.
Após criar os 3 pacotes vamos criar 3 classes Java.
Passo 4:
Agora iremos criar as classes DAOException, RNExpection e
UtilException no pacote
br.pitagoras.sistFinanceiro.util
, o objetivo é criar
classes que irão lidar com as exceções de nossa aplicação e centralizar em um
único local esse tratamento de exceções.
Para isso selecione Pacotes de Códigos-fontes e com o botão direito do mouse
selecione
Novo
Classe Java.
Código: DAOException.java
package br.com.pitagoras.sistfinanceiro.util;
public class DAOException extends Exception {
public DAOException() {
// TODO Auto-generated constructor stub
}
public DAOException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
public DAOException(Throwable cause) {
super(cause);
}
public DAOException(String message, Throwable cause) {
super(message, cause);
// TODO Auto-generated constructor stub
}
public DAOException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
// TODO Auto-generated constructor stub
}
}
Código: RNException.java
package br.com.pitagoras.sistfinanceiro.util;
public class RNException extends Exception {
public RNException() {
// TODO Auto-generated constructor stub
}
public RNException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
public RNException(Throwable cause) {
super(cause);
// TODO Auto-generated constructor stub
public RNException(String message, Throwable cause) {
super(message, cause);
// TODO Auto-generated constructor stub
}
public RNException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
// TODO Auto-generated constructor stub
}
}
Código: UtilException.java
package br.com.pitagoras.sistfinanceiro.util;
public class UtilException extends Exception {
public UtilException() {
// TODO Auto-generated constructor stub
}
public UtilException(String arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
public UtilException(Throwable arg0) {
super(arg0);
// TODO Auto-generated constructor stub
public UtilException(String arg0, Throwable arg1) {
super(arg0, arg1);
// TODO Auto-generated constructor stub
}
public UtilException(String arg0, Throwable arg1, boolean arg2, boolean arg3) {
super(arg0, arg1, arg2, arg3);
// TODO Auto-generated constructor stub
}
}
Passo 5: Vamos criar nosso banco de dados. Iremos utilizar o MySQL como nosso gerenciador de banco de dados.
Acesse o Workbench de sua máquina ou qualquer forma de conexão com o MySQL e crie um banco de dado com o nome sistFinanceiro.
Dica: Create database sistFinanceiro;
Passo 6: Agora iremos criar a classe Usuario.java, iremos criar também uma interface UsuarioDAO.java e a classe UsuarioDAOHibernate.java
Na classe usuário iremos realizar o nosso mapeamento para o Hibernate lidar com o MySQL. Para isso usaremos as Annotations Obrigatórian @Entity e indicar qual é o campo-chave e autonumerado na tabela por meio das annotations @Id e
@GeneratedValue.
Iremos criar na classe
br.pitagoras.sistFinanceiro.usuario
as classes
Usuario.java, UsuarioDAO.java e a classe UsuarioDAOHibernate.java
Código: Usuario.java
OBS: Ao criar essa classe o sistema irá da um alerta para criar a unidade de persistência. Não se apavore, iremos cria-lo, daqui a pouco.
package br.com.pitagoras.sistfinanceiro.usuario;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Usuario implements Serializable {
@Id
@GeneratedValue
private Integer codigo;
private String nome;
private String email;
@org.hibernate.annotations.NaturalId
private String login;
private String senha;
private Date nascimento;
private String celular;
private String idioma;
private boolean ativo;
public Integer getCodigo() {
return codigo;
}
public void setCodigo(Integer codigo) {
this.codigo = codigo;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
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;
}
public Date getNascimento() {
return nascimento;
}
public void setNascimento(Date nascimento) {
this.nascimento = nascimento;
public String getCelular() {
return celular;
}
public void setCelular(String celular) {
this.celular = celular;
}
public String getIdioma() {
return idioma;
}
public void setIdioma(String idioma) {
this.idioma = idioma;
}
public boolean isAtivo() {
return ativo;
}
public void setAtivo(boolean ativo) {
this.ativo = ativo;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (ativo ? 1231 : 1237);
result = prime * result + ((celular == null) ? 0 : celular.hashCode());
result = prime * result + ((codigo == null) ? 0 : codigo.hashCode());
result = prime * result + ((email == null) ? 0 : email.hashCode());
result = prime * result + ((login == null) ? 0 : login.hashCode());
result = prime * result + ((nascimento == null) ? 0 : nascimento.hashCode());
result = prime * result + ((nome == null) ? 0 : nome.hashCode());
result = prime * result + ((senha == null) ? 0 : senha.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Usuario other = (Usuario) obj;
if (ativo != other.ativo)
return false;
if (celular == null) {
if (other.celular != null)
return false;
} else if (!celular.equals(other.celular))
return false;
if (codigo == null) {
if (other.codigo != null)
return false;
} else if (!codigo.equals(other.codigo))
return false;
if (email == null) {
if (other.email != null)
return false;
return false;
if (idioma == null) {
if (other.idioma != null)
return false;
} else if (!idioma.equals(other.idioma))
return false;
if (login == null) {
if (other.login != null)
return false;
} else if (!login.equals(other.login))
return false;
if (nascimento == null) {
if (other.nascimento != null)
return false;
} else if (!nascimento.equals(other.nascimento))
return false;
if (nome == null) {
if (other.nome != null)
return false;
} else if (!nome.equals(other.nome))
return false;
if (senha == null) {
if (other.senha != null)
return false;
} else if (!senha.equals(other.senha))
return false;
return true;
}
}
Agora iremos criar uma interface a interface UsuarioDAO.java, o processo de
verdade iremos criar uma classe e editar o código interno para ela funcionar
como interface.
Código: UsuarioDAO.java
package br.com.pitagoras.sistfinanceiro.usuario;
import java.util.List;
public interface UsuarioDAO {
public void salvar(Usuario usuario);
public void atualizar(Usuario usuario);
public void excluir(Usuario usuario);
public Usuario carregar(Integer codigo);
public Usuario buscarPorLogin(String login);
public List<Usuario> listar();
}
Agora iremos criar a classe UsuarioDAOHibernate.java, essa classe deverá
implementar a interface UsuarioDAO.
Código: UsuarioDAOHibernate.java
package br.com.pitagoras.sistfinanceiro.usuario;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
public class UsuarioDAOHibernate implements UsuarioDAO {
public void setSession(Session session) {
this.session = session;
}
public void salvar(Usuario usuario) {
this.session.save(usuario);
}
public void atualizar(Usuario usuario) {
this.session.update(usuario);
}
public void excluir(Usuario usuario) {
this.session.delete(usuario);
}
public Usuario carregar(Integer codigo) {
return (Usuario) this.session.get(Usuario.class, codigo);
}
public List<Usuario> listar() {
return this.session.createCriteria(Usuario.class).list();
}
public Usuario buscarPorLogin(String login) {
String hql = "select u from Usuario u where u.login = :login";
Query consulta = this.session.createQuery(hql);
consulta.setString("login", login);
return (Usuario) consulta.uniqueResult();
}
Passo 7:
Agora iremos voltar ao pacote
br.com.pitagoras.sistfinanceiro.util e
criar duas novas classes.
- HibernateUtil.java
- DAOFactory.java
Código: HibernateUtil.java
package br.com.pitagoras.sistfinanceiro.util;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.SessionFactory;
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");
StandardServiceRegistryBuilder registradorServico = new StandardServiceRegistryBuilder();
registradorServico.applySettings(cfg.getProperties());
StandardServiceRegistry servico = registradorServico.build();
return cfg.buildSessionFactory(servico);
} catch (Throwable e) {
System.out.println("Criação inicial do objeto SessionFactory falhou. Erro: " + e);
throw new ExceptionInInitializerError(e);
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
Agora iremos criar a Classe DAOFactory, como próprio nome diz essa classe
tem a intenção de ser um construtor de DAOs. Ela deverá ser o único ponto no
sistema onde as classes DAO são instanciadas.
Código: DAOFactory.java
package br.com.pitagoras.sistfinanceiro.util;
import br.com.pitagoras.sistfinanceiro.usuario.*;
public class DAOFactory {
public static UsuarioDAO criarUsuarioDAO() {
UsuarioDAOHibernate usuarioDAO = new UsuarioDAOHibernate();
usuarioDAO.setSession(HibernateUtil.getSessionFactory().getCurrentSession());
return usuarioDAO;
}
}
Passo 8:
Agora nosso controle que irá lidar com as requisições de nossa viu.
Logo no pacote br.com.pitagoras.web iremos criar nossa classe bean,
UsuarioBean.java
Código: UsuárioBean.java
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import br.com.pitagoras.sistfinanceiro.usuario.Usuario;
import br.com.pitagoras.sistfinanceiro.usuario.UsuarioRN;
@ManagedBean(name = "usuarioBean")
@RequestScoped
public class UsuarioBean {
private Usuario usuario = new Usuario();
private String confirmarSenha;
public String novo() {
this.usuario = new Usuario();
this.usuario.setAtivo(true);
return "/publico/usuario";
}
public String salvar() {
FacesContext context = FacesContext.getCurrentInstance();
String senha = this.usuario.getSenha();
if (!senha.equals(this.confirmarSenha)) {
FacesMessage facesMessage = new FacesMessage("A senha não foi confirmada corretamente");
context.addMessage(null, facesMessage);
return null;
}
UsuarioRN usuarioRN = new UsuarioRN();
return "usuariosucesso";
}
public Usuario getUsuario() {
return usuario;
}
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
public String getConfirmarSenha() {
return confirmarSenha;
}
public void setConfirmarSenha(String confirmarSenha) {
this.confirmarSenha = confirmarSenha;
}
}
Observe que nessa classe estamos importando a Classe UsuarioRN.java que ainda não criamos. Não se preocupe em breve criaremos essa classe.
Passo 9:
Agora iremos criar a infraestrutura para a conexão ao banco de dados
e para isso iremos criar um novo pacote com o nome
br.com.pitagoras.web.filter
, e nesse pacote iremos criar a classe
ConexaoHibernateFilter.java
Código: ConexaoHibernateFilter.java
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import br.com.pitagoras.sistfinanceiro.util.HibernateUtil;
@WebFilter(urlPatterns = { "*.jsf" })
public class ConexaoHibernateFilter implements Filter {
private SessionFactory sf;
public void init(FilterConfig config) throws ServletException {
this.sf = HibernateUtil.getSessionFactory();
}
public void doFilter(ServletRequest servletRequest, ServletResponse
servletResponse, FilterChain chain)
Session currentSession = this.sf.getCurrentSession();
Transaction transaction = null;
try {
transaction = currentSession.beginTransaction();
chain.doFilter(servletRequest, servletResponse);
transaction.commit();
if (currentSession.isOpen()) {
currentSession.close();
}
} catch (Throwable ex) {
try {
if (transaction.isActive()) {
transaction.rollback();
}
} catch (Throwable t) {
t.printStackTrace();
}
throw new ServletException(ex);
}
}
public void destroy() {
}
Passo 10:
Agora iremos configurar o Hibernate.
Na pasta Outros Códigos-fonte/src/resources, iremos criar o seguinte arquivo
hibernate.cfg.xml, nesse arquivos iremos informar os dados de conexão e com
qual banco de dados iremos trabalhar.
Código: hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property
name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property
name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property
name="connection.url">jdbc:mysql://localhost:3306/sistfinanceiro</property>
<property name="connection.username">root</property>
<property name="connection.password">quimica7295</property>
<property name="current_session_context_class">thread</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping class="br.com.pitagoras.sistfinanceiro.usuario.Usuario" />
</session-factory>
Lembre-se de alterar o nome do usuário e senha referente a sua conexão de
banco de dados.
Passo 11:
Agora iremos criar uma classe que conterá nossa regra de negócio
para o usuário e faz parte da camada que poderá se comunicar com o banco de
dados.
Essa classe será criada no pacote
br.com.pitagoras.sistfinanceiro.usuario
.
Código: UsuarioRN.java
package br.com.pitagoras.sistfinanceiro.usuario;
import java.util.List;
import br.com.pitagoras.sistfinanceiro.util.DAOFactory;
public class UsuarioRN {
private UsuarioDAO usuarioDAO;
public UsuarioRN() {
this.usuarioDAO = DAOFactory.criarUsuarioDAO();
}
public Usuario carregar(Integer codigo) {
return this.usuarioDAO.carregar(codigo);
}
public Usuario buscarPorLogin(String login) {
return this.usuarioDAO.buscarPorLogin(login);
public void salvar(Usuario usuario) {
Integer codigo = usuario.getCodigo();
if (codigo == null || codigo == 0) {
this.usuarioDAO.salvar(usuario);
} else {
this.usuarioDAO.atualizar(usuario);
}
}
public void excluir(Usuario usuario) {
this.usuarioDAO.excluir(usuario);
}
public List<Usuario> listar() {
return this.usuarioDAO.listar();
}
}
Passo 11: Agora iremos criar nossas views. Na pasta Paginas Web, vamos criar
a pasta publico e nesta pasta iremos criar as seguintes páginas:
- usuário.xhtml;
-usuariosucesso.xhtml;
Código: usuario.xhtml
<?xml version="1.0" encoding="UTF-8"?>
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Cadastro de Usuários</title>
</h:head>
<h:body>
<h1>Cadastro de Usuários</h1>
<h:form id="cadastro">
<h:messages />
<h:inputHidden value="#{usuarioBean.usuario.codigo}" />
<h:inputHidden value="#{usuarioBean.usuario.ativo}" />
<h:panelGrid columns="2">
<h:outputLabel value="Nome:" for="nome" />
<h:inputText id="nome" label="Nome"
value="#{usuarioBean.usuario.nome}" size="30" maxlength="30"
required="true" requiredMessage="Você não tem nome?">
<f:validateLength minimum="10" maximum="30" />
</h:inputText>
<h:outputLabel value="Data Nascimento:" for="data" />
<h:inputText id="data" label="Data Nascimento"
value="#{usuarioBean.usuario.nascimento}" size="10" maxlength="10"
required="true">
<f:convertDateTime dateStyle="medium" />
</h:inputText>
<h:outputLabel value="Celular:" for="celular" />
<h:inputText id="celular" label="Celular"
<h:outputLabel value="e-Mail:" for="email" />
<h:panelGroup>
<h:inputText id="email" label="e-Mail"
value="#{usuarioBean.usuario.email}" size="50" maxlength="50"
required="true" validatorMessage="e-mail inválido">
<f:validateRegex pattern="[a-zA-Z0-9\-\_\.]+@[a-zA-Z0-9\-\_\.]+" />
</h:inputText>
<h:message for="email" />
</h:panelGroup>
<h:outputLabel value="Idioma:" for="idioma" />
<h:selectOneMenu id="idioma" value="#{usuarioBean.usuario.idioma}">
<f:selectItem itemValue="pt_BR" itemLabel="Português" />
<f:selectItem itemValue="en_US" itemLabel="English" />
<f:selectItem itemValue="es_ES" itemLabel="Espanol" />
</h:selectOneMenu>
<h:outputLabel value="Login:" for="login" />
<h:inputText id="login" label="Login"
value="#{usuarioBean.usuario.login}" size="15" maxlength="15"
required="true"
validatorMessage="Login deve ter no mínimo 5 e no máximo 15 caracteres e só pode ter os símbolos '.' e '_'.">
<f:validateRegex pattern="([a-z]|[0-9]|[.]|[_]){5,15}" />
</h:inputText>
<h:outputLabel value="Senha:" for="senha" />
<h:inputSecret id="senha" label="Senha"
required="true" redisplay="true" />
<h:outputLabel value="Confirmar Senha:" for="confirmarsenha" />
<h:inputSecret id="confirmarsenha" label="Confirmar Senha"
value="#{usuarioBean.confirmarSenha}" size="10" maxlength="10"
required="true" redisplay="true" />
</h:panelGrid>
<h:commandButton action="#{usuarioBean.salvar}" value="Salvar" />
</h:form>
</h:body>
</html>
Código: usuariosucesso.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>Cadastro de Usuários</title>
</h:head>
<h:body>
<h1>
<h:outputText value="#{usuarioBean.usuario.nome}" />
, seja Bem-vindo
</h1>
Seu cadastro foi efetuado com sucesso.
<br />
Clique <a href="login.jsf">aqui</a> para efetuar o login.
</html>
Agora vamos editar a nossa página index.xhtml existe na pasta Paginas web.
Código: index.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>Financeiro</title>
</h:head>
<h:body>
<h1>Financeiro</h1>
<h:form>
<h:commandLink action="#{usuarioBean.novo}">Novo usuário</h:commandLink>
</h:form>
</h:body>
</html>
Pronto! Salve os do projeto e execute!
Preencha com dados de sua preferência e clique em salvar para testar a aplicação.
Se você verificar no banco de dados vai perceber que o Hibernate criou a tabela usuário no banco de dados sistFinanceiro.