Métodos de validação em JSF - Parte III
Validação Explícita
A Validação Explícita vem para evitar que ocorram os problemas existentes na validação manual onde a checagem dos campos é todo feita nas classes de negócio, tendo em vista que casa seja mudada alguma regra de validação o desenvolvedor é forçado mexer no codigo fonte da aplicação e recompilar as classes.
Na Validação Explícita e na Validação Explícita Automática fazemos uso de validadores fornecidos pelo Java Server Faces ou simplesmente JSF como irei me referir de agora adiante.
Para implementar a Validação Explícita é necessário seguir os seguinte passos:
Definir as propriedades do bean com os tipos adequados. Ex: int/Integer, long/Long, double/Double, boolean/Boolean, etc.
Usar os campos id e required nas tags <h:inputtext> dos forms para que com isso todo campo que estiver vazio existente no momento da submissão de um form dispare uma mensagem de erro.
Deve usar a tag <h:message> para exibir as mensagens de erro. A tag <h:message> aceita o atributo styleClass para que possamos fazer uso de Folhas de Estilo (CSS).
Você pode e deve adicionar na tag h:commandButton o atributo immediate para desviar da validação, é necessário desviar da validação pois a sua ou ausência ou caso esteja definido como false fará com que a pagina atual seja exibida novamente, o atributo immediate é muito util quando a aplicação tem um botão logout, validação de senha ou cancelar operação.
Agora vamos a um exemplo completo:
web.xml
<?xml version="1.0"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<!-- Configuracao 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>
<!-- Mapeando o Faces Servlet para a extensao *.faces -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<!-- Welcome files -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
Crie o pacote: br.nitewing.claudio.validacoes e nele crie o arquivo ApostaBean2.java.
package br.nitewing.claudio.validacoes;
public class ApostaBean2 {
private String nome;
private String cavalo;
private double valorAposta;
private int quantJogos;
// Metodos Getters e Setters
public String getNome()
{ return(nome); }
public void setNome(String nome) {
this.nome = nome;
}
public String getCavalo()
{ return(cavalo); }
public void setCavalo(String cavalo) {
this.cavalo = cavalo;
}
public double getValorAposta()
{ return(valorAposta); }
public void setValorAposta(double valoraposta) {
this.valorAposta = valoraposta;
}
public int getQuantJogos()
{ return(quantJogos); }
public void setQuantJogos(int quantjogos) {
this.quantJogos = quantjogos;
}
public String apostar() {
return("sucesso");
}
}
O Método apostar() devolve a String sucesso que faz com que o usuário seja redirecionado para a pagina de confirmação caso não exista erro no preenchimento dos campos do form.
Em seguida vemos o código do Faces-config.xml aonde configuramos ApostaBean utlizando as tags : <managed-bean-name> e <managed-bean-class> que são atributos da tag <managed-bean>.
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
"http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
<managed-bean>
<managed-bean-name>apostaBean2</managed-bean-name>
<managed-bean-class>br.nitewing.claudio.validacoes.ApostaBean2
</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/aposta1.jsp</from-view-id>
<navigation-case>
<from-outcome>sucesso</from-outcome>
<to-view-id>/WEB-INF/resultados/mostrarAposta1.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
No arquivo aposta1.jsp abaixo temos um form que servirá para entradas de dados digitado pelos apostadores.
aposta1.jsp
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<f:view>
<HTML>
<HEAD>
<TITLE>Apostas</TITLE>
<style type="text/css">
.RED {
font-weight: bold;
color: red;
size: 10px;
}
</style>
</HEAD>
<BODY>
<div align="left">
<h1>Corrida de Cavalos</h1>
<h3>Façam suas apostas!</h3>
<P><h:form>
<TABLE align="left" width=600px border=1>
<TR>
<TD>Nome :</TD>
<TD><h:inputText value="#{apostaBean2.nome}" required="true"
id="nome" /></TD>
<TD><h:message for="nome" styleClass="RED" /></TD>
</TR>
<TR>
<TD>Cavalo:</TD>
<TD><h:inputText value="#{apostaBean2.cavalo}" required="true"
id="cavalo" /></TD>
<TD><h:message for="cavalo" styleClass="RED" /></TD>
</TR>
<TR>
<TD>Lance: R$</TD>
<TD><h:inputText value="#{apostaBean2.valorAposta}"
id="valorAposta" required="true" /></TD>
<TD><h:message for="valorAposta" styleClass="RED" /></TD>
</TR>
<TR>
<TD>Quantidade de Jogos:</TD>
<TD><h:inputText value="#{apostaBean2.quantJogos}"
id="quantJogos" required="true" /></TD>
<TD><h:message for="quantJogos" styleClass="RED" /></TD>
</TR>
<TR>
<TH COLSPAN=3>
<h:commandButton value="Dar o lance!"
action="#{apostaBean2.apostar}" />
<h:commandButton value="Cancelar"
immediate="true" />
</TH>
</TR>
</TABLE>
</h:form>
</div>
</BODY>
</HTML>
</f:view>
Em WEB-INF crie uma pasta chamada resultados e dentro dela o seguinte arquivo:
mostrarAposta1.jsp
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<f:view>
<HTML>
<HEAD>
<TITLE>Lance Aceito</TITLE>
</HEAD>
<BODY>
<div align="left">
<H2>Lance recebido com sucesso!</H2>
<UL>
<LI>Nome : <h:outputText value="#{apostaBean2.nome}" />
<LI>Cavalo Escolhido : <h:outputText
value="#{apostaBean2.cavalo}" />
<LI>Valor do lance: R$<h:outputText
value="#{apostaBean2.valorAposta}" />
<LI>Quantidade de Jogos: <h:outputText
value="#{apostaBean2.quantJogos}" />
</UL>
(Validação Explicita)</div>
</BODY>
</HTML>
</f:view>
A página index.jsp redireciona para a pagina aposta1.faces.
index.jsp
<% response.sendRedirect("aposta1.faces"); %>
Para exemplo foram utilizados a MyFaces 1.5, Eclipse 3.3 e Tomcat 6x, é importante deixar claro que o código rodaria sem problema no Eclipse 3.1 ou 3.1 e no Apache Tomcat 5.5x.
Veja a aplicação rodando nas imagens abaixo:
Figura1 – Tela inicial
Figura2 – Tentativa de submissão com campos em branco.
Poderíamos achar que com isso a validação estaria completa mas as telas a seguir mostra que ainda há o que ser ser feito.
Figura3 – Tentativa de submissão com campos parcialmente preenchidos.
Figura4 – O Usuário foi saudado porem algum campos estão zerados.
Na parte 4 iremos fazer uso da Validação Explícita e evitarmos essa falha. Poderíamos até usar javascript e evitar que isso acontecesse, mas o foco do artigo é utilizar os recursos existentes no JSF para isso.