Classe Cliente:
package java.magazine.livroOnline.entidade;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import org.hibernate.annotations.ForeignKey;
@Entity
@Table(name="CLIENTE")
public class Cliente {
public enum Sexo{FEMININO, MASCULINO}
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CLIENTE_SEQ")
@SequenceGenerator(name = "CLIENTE_SEQ", sequenceName = "CLIENTE_SEQ", allocationSize = 1)
private Long id;
@Column(name = "NOME", length = 40, nullable = false)
private String nome;
@Column(name = "SOBRENOME", length = 40, nullable = false)
private String sobrenome;
@Column(name = "CPF", length = 12, nullable = false)
private String cpf;
@Column(name = "RG", length = 10, nullable = false)
private String rg;
@Column(name = "DTNASCIMENTO", length = 10, nullable = true)
private Date dataNascimento;
@Enumerated(EnumType.ORDINAL)
@Column(name = "SEXO", length = 1, nullable = false)
private Sexo sexo;
@Column(name = "EMAIL", length = 100, nullable = false)
private String email;
@Column(name = "SENHA", length = 16, nullable = false)
private String senha;
@Column(name = "ENDERECO", length = 60, nullable = false)
private String endereco;
@Column(name = "NUMERO", length = 4, nullable = false)
private int numero;
@Column(name = "COMPLETO", length = 20, nullable = true)
private String complemento;
@Column(name = "BAIRRO", length = 40, nullable = true)
private String bairro;
@ManyToOne(targetEntity = Municipio.class, fetch = FetchType.LAZY)
@JoinColumn(name = "ID_MUNICIPIO", nullable = false)
@ForeignKey(name = "FK_CLIENTE_MUNICIPIO")
private Municipio municipio;
@ManyToOne(targetEntity = UnidadeFederativa.class, fetch = FetchType.LAZY)
@JoinColumn(name = "ID_UF", nullable = false)
@ForeignKey(name = "FK_CLIENTE_UF")
private UnidadeFederativa unidadeFederativa;
@Column(name = "REFERENCIA_ENDERECO", length = 100, nullable = true)
private String referencia;
@Column(name = "TELEFONE", length = 12, nullable = true)
private String telefone;
@Column(name = "CELULAR", length = 12, nullable = true)
private String celular;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getSobrenome() {
return sobrenome;
}
public void setSobrenome(String sobrenome) {
this.sobrenome = sobrenome;
}
public String getCpf() {
return cpf;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
public String getRg() {
return rg;
}
public void setRg(String rg) {
this.rg = rg;
}
public Date getDataNascimento() {
return dataNascimento;
}
public void setDataNascimento(Date dataNascimento) {
this.dataNascimento = dataNascimento;
}
public Sexo getSexo() {
return sexo;
}
public void setSexo(Sexo sexo) {
this.sexo = sexo;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getSenha() {
return senha;
}
public void setSenha(String senha) {
this.senha = senha;
}
public String getEndereco() {
return endereco;
}
public void setEndereco(String endereco) {
this.endereco = endereco;
}
public int getNumero() {
return numero;
}
public void setNumero(int numero) {
this.numero = numero;
}
public String getComplemento() {
return complemento;
}
public void setComplemento(String complemento) {
this.complemento = complemento;
}
public String getBairro() {
return bairro;
}
public void setBairro(String bairro) {
this.bairro = bairro;
}
public Municipio getMunicipio() {
return municipio;
}
public void setMunicipio(Municipio municipio) {
this.municipio = municipio;
}
public UnidadeFederativa getUnidadeFederativa() {
return unidadeFederativa;
}
public void setUnidadeFederativa(UnidadeFederativa unidadeFederativa) {
this.unidadeFederativa = unidadeFederativa;
}
public String getReferencia() {
return referencia;
}
public void setReferencia(String referencia) {
this.referencia = referencia;
}
public String getTelefone() {
return telefone;
}
public void setTelefone(String telefone) {
this.telefone = telefone;
}
public String getCelular() {
return celular;
}
public void setCelular(String celular) {
this.celular = celular;
}
public Cliente() {}
public boolean equals(Object obj) {
if(super.equals(obj)) {
return true;
}
else if(obj instanceof Cliente) {
Cliente temp = (Cliente) obj;
return temp.id == this.id;
}
return false;
}
}
Classe Municipio:
package java.magazine.livroOnline.entidade;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name = "MUNICIPIO")
public class Municipio {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MUNICIPIO_SEQ")
@SequenceGenerator(name = "MUNICIPIO_SEQ", sequenceName = "MUNICIPIO_SEQ", allocationSize = 1)
private Long id;
@Column(name = "DESCRICAO", length = 60, nullable = false)
private String descricao;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
}
Classe UnidadeFederativa:
package java.magazine.livroOnline.entidade;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name="UNIDADEFEDERATIVA")
public class UnidadeFederativa {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "UNIDADEFEDERATIVA_SEQ")
@SequenceGenerator(name = "UNIDADEFEDERATIVA_SEQ", sequenceName = "UNIDADEFEDERATIVA_SEQ", allocationSize = 1)
private Long id;
@Column(name ="DESCRICAO")
private String descricao;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
}
Classe ClienteBean:
package java.magazine.livroOnline.beans;
import java.io.Serializable;
import java.magazine.livroOnline.entidade.Cliente;
import java.magazine.livroOnline.entidade.UnidadeFederativa;
import java.magazine.livroOnline.entidade.Cliente.Sexo;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
public class ClienteBean implements Serializable {
private static final long serialVersionUID = 1L;
private List<SelectItem> municipios;
private List<SelectItem> unidadesFederativas;
private Cliente cliente;
private String senhaConfirmacao;
public ClienteBean() {}
public void atualizaMunicipio(ValueChangeEvent vce) {
cliente.setUnidadeFederativa((UnidadeFederativa) vce.getNewValue());
}
public String registrar() {
if(!senhaConfirmacao.equals(cliente.getSenha())) {
FacesMessage msg = new FacesMessage("A senha de confirmação não confere");
msg.setSeverity(FacesMessage.SEVERITY_ERROR);
FacesContext.getCurrentInstance().addMessage(null, msg);
return "erro";
}
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Obrigado por se registrar ao Livros Online!"));
FactoryDao.getClienteDao().criar(cliente);
return "sucesso";
}
public List<SelectItem> getMunicipios(){
if(municipios == null && cliente.getUnidadeFederativa() != null) {
loadMunicipios();
}
else if(municipios == null) {
return new ArrayList<SelectItem>();
}
return municipios;
}
private void loadMunicipios() {
municipios = new ArrayList<SelectItem>();
List<Municipio> entidades = FactoryDao.getMunicipioDao().findMunicipiosByUf(cliente.getUnidadeFederativa());
for (Municipio municipio : entidades) {
municipios.add(new SelectItem(municipio, municipio.getDescricao()));
}
}
public List<SelectItem> getUnidadesFederativas() {
if(unidadesFederativas == null) {
unidadesFederativas = new ArrayList<SelectItem>();
List<UnidadeFederativa> entidades = FactoryDao.getUnidadeFederativaDao().findAll();
for (UnidadeFederativa uf : entidades) {
unidadesFederativas.add(new SelectItem(uf, uf.getDescricao()));
}
}
return unidadesFederativas;
}
public List<SelectItem> getOpcoesSexo(){
List<SelectItem> itens = new ArrayList<SelectItem>();
itens.add(new SelectItem(Sexo.FEMININO, "Feminino"));
itens.add(new SelectItem(Sexo.MASCULINO, "Masculino"));
return itens;
}
}
Classe UnidadeFederativaConverter:
package java.magazine.livroOnline.converter;
import java.magazine.livroOnline.entidade.UnidadeFederativa;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import org.hibernate.ObjectNotFoundException;
public class UnidadeFederativaConverter implements Converter {
public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String str)throws ConverterException {
UnidadeFederativa uf;
try {
Integer id = new Integer(str);
if(id == null || id == 0) {
return null;
}
uf = FactoryDao.getUnidadeFederativaDao.findById(id);
} catch (NumberFormatException nfe) {
throw new ConverterException(nfe);
}catch (ObjectNotFoundException e) {
throw new ConverterException("Estado não encontrado");
}
return uf;
}
public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object obj) throws ConverterException {
if(obj == null) {
return null;
}
else if(obj instanceof UnidadeFederativa) {
UnidadeFederativa unidFed = (UnidadeFederativa) obj;
return String.valueOf(unidFed.getId());
}
else {
return null;
}
}
}
Classe EmailValidator:
package java.magazine.livroOnline.validators;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
public class EmailValidator implements Validator {
public void validate(FacesContext context, UIComponent toValidate, Object valor) throws ValidatorException {
Pattern mask = Pattern.compile(".+@.+\\.[a-z]+");
Matcher matcher = mask.matcher((String) valor);
if(matcher.matches()) {
((UIInput) toValidate).setValid(false);
FacesMessage message = new FacesMessage();
message.setDetail("O Email é inválido");
message.setSummary("O Email é inválido");
message.setSeverity(FacesMessage.SEVERITY_ERROR);
context.addMessage(toValidate.getClientId(context), message);
//throw new ValidatorException(message);
}
}
}
JSP Casdastro:
<%@ page contentType="text/html; charset=ISO-8859-1" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<f:view>
<body>
<h:form>
<fieldset>
<div>
<h:messages id="MensagensGlobais" globalOnly="true" errorClass="errorMessage" infoClass="successMessage" />
</div>
<p>
<h:outputLabel value="Nome:" for="nome" />
<h:inputText id="nome" value="#{cliente.nome}" required="true" maxlength="60" size="40" requiredMessage="Informe seu Nome" />
<br /><h:message for="nome" styleClass="message" />
</p>
<p>
<h:outputLabel value="Date de nascimento:" for="DataNascimento" />
<h:inputText id="DataNascimento" value="#{cliente.dataNascimento}" maxlength="10" size="40" >
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:inputText>
<br /><h:message for="DataNascimento" styleClass="message" />
</p>
<p>
<h:outputLabel value="Sexo:" for="sexo" />
<h:selectOneRadio id="sexo" value="#{cliente.sexo}" required="true" requiredMessage="Sexo é obrigatório" styleClass="radio">
<f:selectItems value="#{clienteBean.opcoesSexo}" />
</h:selectOneRadio>
<br /><h:message for="sexo" styleClass="message" />
</p>
<p>
<h:outputLabel value="Estado:" for="estado" />
<h:selectOneMenu id="uf" value="#{cliente.unidadeFederativa}" required="true" immediate="true" requiredMessage="Informe o Estado de seu Endereço" valueChangeListener="#{clienteBean.atualizaMunicipio}" onchange="submit()">
<f:selectItem itemLabel="-- Selecionar --" />
<f:selectItems value="#{clienteBean.unidadesFederativas}" />
</h:selectOneMenu>
<br /><h:message for="estado" styleClass="message" />
</p>
<p>
<h:outputLabel value="Email:" for="email" />
<h:inputText id="email" value="#{cliente.email}" required="true" maxlength="100" size="60" requiredMessage="É necessário informar um email válido para login">
<%--
<f:validator validatorId="jm.validator.email" />
--%>
</h:inputText>
<br /><h:message for="email" styleClass="message" />
</p>
<p>
<h:outputLabel value="Senha:" for="senha" />
<h:inputSecret id="senha" value="#{cliente.senha}" required="true" maxlength="16" size="20" requiredMessage="A senha é obrigatória" />
<br /><h:message for="senha" styleClass="message" />
</p>
<p>
<h:commandButton action="#{clienteBean.registrar}" value="Registrar" styleClass="ok" />
</p>
</fieldset>
</h:form>
</body>
</f:view>
faces-config.xml:
<?xml version="1.0"?>
<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
<converter>
<converter-for-class>java.magazine.livroOnline.entidade.UnidadeFederativa</converter-for-class>
<converter-class>java.magazine.livroOnline.converter.UnidadeFederativaConverter</converter-class>
</converter>
<managed-bean>
<managed-bean-name>cliente</managed-bean-name>
<managed-bean-class>java.magazine.livroOnline.entidade.Cliente</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>clienteBean</managed-bean-name>
<managed-bean-class>java.magazine.livroOnline.beans.ClienteBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>cliente</property-name>
<property-class>java.magazine.livroOnline.entidade.Cliente</property-class>
<value>#{cliente}</value>
</managed-property>
</managed-bean>
<navigation-rule>
<from-view-id>/pages/registrar.jsp</from-view-id>
<navigation-case>
<from-outcome>sucesso</from-outcome>
<to-view-id>/pages/areaCliente.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>erro</from-outcome>
<to-view-id>/pages/registrar.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<validator>
<validator-id>jm.validator.email</validator-id>
<validator-class>java.magazine.livroOnline.validators.EmailValidator</validator-class>
</validator>
</faces-config>
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<display-name>Livros On Line</display-name>
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/faces-config.xml</param-value>
</context-param>
<listener>
<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>
<!-- Faces Servlet -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Mapeamento Faces Servlet -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
</web-app>