Escolar Documentos
Profissional Documentos
Cultura Documentos
Página Inicial
Sobre
Navegação de Posts
← Sistema Acadêmico – O Começo
Sistema Acadêmico Parte 2 – Orientador e Validação no servidor →
mar 1 2013
Galeria
Figura 2 – MER
1) Cadastros:
a) Aluno
b) Orientador
c) Curso
d) Publicação
e) CursoxAluno
No JSF para que um campo do tipo h:inputText fique obrigatório temos que
adicionar required=”true”, caso queira que a mensagem de
erro personalizada temos que usar requiredMessage=”Descrição do
Erro”. O validador f:validateLengthé utilizado para verificar se uma string
possui uma quantidade mínima ou máxima de letras, no exemplo apresentado
quando a quantidade de caracteres for maior que cem e gerado uma mensagem
de erro, que é definida emvalidatorMessage=”A matricula ultrapassou 100
caracteres”. Foi utilizada como exemplo de validação o campo texto da
matrícula, a regra de validação segue para todos os campos obrigatórios ou
que possuem alguma limitação da quantidade de caracteres.
<h:inputText id="txtMatricula" label="lblMatricila"
value="#{alunoBean.aluno.matricula}" required="true" maxlength="100"
requiredMessage="Informe a Matricula" validatorMessage="A matricula
ultrapassou 100 caracteres" styleClass="txtMatricula">
<f:validateLength maximum="100"/>
</h:inputText>
2) Formatação de Data
Em muitos caso temo que formatar ou converter datas e horas.Isso pode ser
feito com o auxílio da tag <f:convertDateTime>.
A tag <f:convertDateTime> exibirá a data formatada para um tipo específico,
que pode ser date, time. O padrão de formatação é definido pelo
atributo pattern e o timeZone defino a região, como foi definido
um timeZone igual a America/Sao_Paulo isso defini que a data exibida de
acordo com o horário de Brasilia.
<h:inputText id="txtDataNascimento" label="lblDataNascimento"
value="#{alunoBean.aluno.dataNascimento.time}" required="true"
requiredMessage="Informe a Data de
Nascimento(dd//MM/yyyy)" styleClass="txtDataNascimento">
<f:convertDateTime pattern="dd/MM/yyyy" timeZone="America/Sao_Paulo"/>
</h:inputText>
3) Classe Aluno
import java.io.Serializable;
import java.util.Calendar;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
/**
* @author http://javaes.wordpress.com/
* */
@Entity
public class Aluno implements Serializable {
/**
*
*/
private static final long serialVersionUID = 3228578352397589062L;
@Id
@GeneratedValue
private long idAluno;
private String matricula;
private String nome;
private byte sexo;
@Temporal(TemporalType.DATE)
private Calendar dataNascimento = Calendar.getInstance();
private String cpf;
@OneToOne
@JoinColumn(name="idOrientador")
private Orientador orientador;
public Aluno(){}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((cpf == null) ? 0 : cpf.hashCode());
result = prime * result
+ ((dataNascimento == null) ? 0 : dataNascimento.hashCode());
result = prime * result + (int) (idAluno ^ (idAluno >>> 32));
result = prime * result
+ ((matricula == null) ? 0 : matricula.hashCode());
result = prime * result + ((nome == null) ? 0 : nome.hashCode());
result = prime * result
+ ((orientador == null) ? 0 : orientador.hashCode());
result = prime * result + sexo;
return result;
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Aluno other = (Aluno) obj;
if (cpf == null) {
if (other.cpf != null)
return false;
} else if (!cpf.equals(other.cpf))
return false;
if (dataNascimento == null) {
if (other.dataNascimento != null)
return false;
} else if (!dataNascimento.equals(other.dataNascimento))
return false;
if (idAluno != other.idAluno)
return false;
if (matricula == null) {
if (other.matricula != null)
return false;
} else if (!matricula.equals(other.matricula))
return false;
if (nome == null) {
if (other.nome != null)
return false;
} else if (!nome.equals(other.nome))
return false;
if (orientador == null) {
if (other.orientador != null)
return false;
} else if (!orientador.equals(other.orientador))
return false;
if (sexo != other.sexo)
return false;
return true;
}
}
4) DAO Aluno
import java.util.List;
import modelo.Aluno;
/**
* @author http://javaes.wordpress.com/
* */
public interface AlunoDAO {
package dao;
import java.util.List;
import RN.AlunoRN;
import RN.OrientadorRN;
import modelo.Aluno;
import modelo.Orientador;
/**
* @author http://javaes.wordpress.com/
* */
public class AlunoDAOHibernate implements AlunoDAO{
@Override
public void salvar(Aluno aluno) throws Exception
{
InsertUpdate.salvar(aluno);
}
@Override
public void deletar(Aluno aluno) throws Exception
{
ObterObject<Aluno> obj = new ObterObject<Aluno>(new Aluno());
InsertUpdate.deletar(aluno);
}
@Override
public Aluno buscarAlunoID(long id) throws Exception
{
ObterObject<Aluno> obj = new ObterObject<Aluno>(new Aluno());
return (Aluno)obj.buscarObjectID(id, "idAluno");
}
@Override
public Aluno buscarAlunoMatricula(String matricula) throws Exception
{
ObterObject<Aluno> obj = new ObterObject<Aluno>(new Aluno());
return (Aluno)obj.buscarObjectID(matricula, "matricula");
}
@Override
public Aluno buscarAlunoCPF(String cpf) throws Exception
{
ObterObject<Aluno> obj = new ObterObject<Aluno>(new Aluno());
return (Aluno)obj.buscarObjectUnique(cpf, "cpf");
}
@Override
public List<Aluno> listar() throws Exception
{
ObterObject<Aluno> obj = new ObterObject<Aluno>(new Aluno());
return obj.listar();
}
@Override
public boolean verificaExistencia(long id, String nomeTabela, String
campo)throws Exception
{
ObterObject<Aluno> obj = new ObterObject<Aluno>(new Aluno());
return obj.verificaExistencia(id, nomeTabela, campo);
}
@Override
public List<Aluno> buscaOrientadorAluno(long id) throws Exception
{
ObterObject<Aluno> obj = new ObterObject<Aluno>(new Aluno());
Orientador or = OrientadorRN.buscarOrientadorID(id);
return obj.buscaPorIdRelacionamento(or,"orientador");
}
5) Regra de Negócio
import modelo.Aluno;
import modelo.Publicacao;
import dao.AlunoDAO;
import dao.AlunoDAOHibernate;
import dao.PublicacaoDAOHibernate;
/**
* @author http://javaes.wordpress.com/
* */
public class AlunoRN
{
private static AlunoDAO alunoDAO;
6) Bean
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import util.Constantes;
import RN.AlunoRN;
import RN.OrientadorRN;
import modelo.Aluno;
import modelo.Orientador;
/**
* @author http://javaes.wordpress.com/
* */
@ManagedBean
@SessionScoped
public class AlunoBean
{
private Aluno aluno = new Aluno();
private Constantes constantes = new Constantes();
private byte sexo;
private List<Orientador> orientadores;
private List<Aluno> listaAlunos;
private String nomeOrientadorSelecionado;
private long idOrientadorSelecionado;
1) Mensagens
Para que as mensagens gerada no processo de validação possa aparecer para o
usuário temos que acrescentar a tag <h:messages/>.
2) Id
3)Escolha do Sexo
Para definir a escolha do sexo do aluno eu usei a tag selectOneRadio, essa se
comporta como um radio button do html onde só é possível a escolha de um
resultado.
4) Cosntantes
Foi criado a classe Constantes que tem a função de gerar listas estáticas de
valores que não são trazidos do banco de dados. Essa lista é usada para
preencher h:selectOneRadio e h:selectOneMenu,fiz essa classe para ser um
lugar único de inserção de valores estáticos. A Constantes é um classe simples
com outras classes internas que representam por exemplo sexo, titulação e etc.
5) Gravar Orientador
6) Salvar Aluno
if(PublicacaoRN.buscaOrientadorPublicacao(orientador.getIdOrientador()
))
{
FacesContext.getCurrentInstance().addMessage("orientador", new
FacesMessage("Não foi possível excluir, pois existe publicação
relacionada."));
return null;
}
else
{
if(AlunoRN.buscaOrientadorAluno(orientador.getIdOrientador()))
{
FacesContext.getCurrentInstance().addMessage("orientador", new
FacesMessage("Não foi possível excluir, pois existe aluno
relacionada."));
return null;
}
else
{
OrientadorRN.deletar(orientador);
this.orientador = new Orientador();
this.constantes = new Constantes();
this.lista = null;
}
}
}
catch (Exception e)
{
FacesContext.getCurrentInstance().addMessage("orientador", new
FacesMessage("Erro ao excluir Orientador"));
}
this.lista = null;
return "listaOrientador?faces-redirect=true";
}
Para compor as páginas do projeto com o template, foi usado Facelets que é
um framework de template que diminui a quantidade de código-fonte nas
páginas,padronizando e centralizando as definições visuais e estruturais das
telas do sistema.
O Facelets permite criar uma página modelo, que será base estrutural e visual
para as demais páginas do sistemas. No projeto esse arquivo .xhtml que
possuem tags facelets foi criado no diretório template o
arquivo _template.xhtml.
Figura 2 – Template
1) _template.xhtm
http://www.freecsstemplates.org
Name : Accomplishable
Description: A two-column, fixed-width design.
Version : 1.0
Released : 20090731
-->
<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>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Gestão Acadêmico</title>
<meta name="keywords" content="" />
<meta name="description" content="" />
<link href="./resources/css/style.css" rel="stylesheet"
type="text/css" media="screen" />
</h:head>
<h:body>
<div id="page">
<div id="page-bgtop">
<div id="page-bgbtm">
<!-- start content -->
<div id="content">
<ui:insert name="conteudo">
<div class="post">
<h2 class="title">About This Website</h2>
<div class="entry">
</div>
</div>
</ui:insert>
</div>
<!-- end content -->
<!-- start sidebar -->
<div id="sidebar">
<h:form>
<ul>
<li>
<h2>Cadastros</h2>
<ul>
<li><h:commandLink value="Aluno" action="#{linkBean.linkAluno}"
immediate="true" ></h:commandLink></li>
<li><h:commandLink value="Orientador"
action="#{linkBean.linkOrientador}" immediate="true"
></h:commandLink></li>
<li><h:commandLink value="Curso" action="#{linkBean.linkCurso}"
immediate="true" ></h:commandLink></li>
<li><h:commandLink value="Publicação"
action="#{linkBean.linkPublicacao}" immediate="true"
></h:commandLink></li>
<li><h:commandLink value="CursoxAluno"
action="#{linkBean.linkCursoAluno}" immediate="true"
></h:commandLink></li>
</ul>
</li>
<li>
<h2>Listas</h2>
<ul>
<li><h:commandLink value="Aluno" action="#{linkBean.listaLinkAluno}"
immediate="true" styleClass="linkAluno"></h:commandLink></li>
<li><h:commandLink value="Orientador"
action="#{linkBean.listaLinkOrientador}" immediate="true"
styleClass="linkOrientador" ></h:commandLink></li>
<li><h:commandLink value="Curso" action="#{linkBean.listaLinkCurso}"
immediate="true" styleClass="linkCurso"></h:commandLink></li>
<li><h:commandLink value="Publicação"
action="#{linkBean.listaLinkPublicacao}" immediate="true"
styleClass="linkPublicacao"></h:commandLink></li>
<li><h:commandLink value="CursoxAluno"
action="#{linkBean.listaLinkCursoAluno}" immediate="true"
styleClass="listaLinkCursoAluno}"></h:commandLink></li>
</ul>
</li>
</ul>
</h:form>
</div>
<!-- end sidebar -->
<div style="clear:both"> </div>
</div>
</div>
</div>
<div id="footer">
<p>©2013 All Rights Reserved • Design by <a
href="http://www.freecsstemplates.org">FCT</a> •
Icons by <a href="http://www.famfamfam.com/">FAMFAMFAM</a>.</p>
</div>
</h:body>
</html>
</div>
</div>
</ui:insert>
2) Aplicação do Template
O Facelets não necessita de nenhuma configuração externa quanto aos
templates a serem utilizados, isso é um grande facilitador no uso
de Facelets em comparação outro frameworks.
Agora para usar o template criado no _template.xhtm, vamos ao exemplo
abaixo:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<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">
<ui:composition template="/template/_template.xhtml">
<ui:define name="conteudo">
<h:form>
<h:messages/>
<h:inputHidden value="#{cursoBean.curso.idCurso}"/>
<fieldset>
<LEGEND>Cadastro de Curso</LEGEND>
<h:panelGrid columns="2">
<h:outputLabel id="lblNome" for="lblNome" value="Nome:"/>
<h:inputText id="txtNome" label="lblNome" required="true"
requiredMessage="Informe o nome" value="#{cursoBean.curso.nome}"
styleClass="txtNome" />
</h:panelGrid>
</fieldset>
<br/>
<h:panelGrid columns="3">
<h:commandButton value="Novo" action="#{cursoBean.novo}"
immediate="true"/>
<h:commandButton value="Salvar" action="#{cursoBean.salvar}"/>
<h:commandButton value="Excluir" action="#{cursoBean.excluir}"/>
</h:panelGrid>
</h:form>
</ui:define>
</ui:composition>
</html>
Análise do código:
a) Primeiramente foi delimitada a área que será regida pelo template definido
pelo elemento <ui:composition>.
<ui:composition template="/template/_template.xhtml">