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:

 

cvmvjsfp3fig01.jpg 

Figura1 – Tela inicial

 

cvmvjsfp3fig02.jpg 

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.

 

cvmvjsfp3fig03.jpg 

Figura3 – Tentativa de submissão com campos parcialmente preenchidos.

 

cvmvjsfp3fig04.jpg 

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.