Java Server Faces: Métodos de Validação – Parte 2

 

Continuando com nosso artigo sobre métodos de validação em JSF, vamos ver um exemplo de Validação Manual.

 

cvjsfmvp2fig01.jpg 

Figura-1

 

O código de nosso aplicativo  esta comentado, é um aplicativo bem simples que simula um aplicação de venda de Títulos de aplicação, ela não é um exemplo real, mas o seu objetivo é você entender como se ocorre a validação manual.

 

Primeiro crie um projeto web em sua IDE preferida, e vamos criar dois arquivos com extensão .jsp, chame o primeiro de index.jsp e o segundo de cap1,jsp como na Figura-1 mostrada anteriormente.

 

É importante lembrar que como estou usando eclipse, com os plugins Sysdeo para Tomcat, e Amateras HTML e Amateras Faces IDE, estrutura do projeto pode parecer estranha para usuários do WTP ou ainda para usuários do Netbeans, mas isso não chega a ser um problema, pois o exemplo funcionara se você tiver os  jars  do myfaces na sua aplicação no classpath da sua aplicação como mostrada  na Figura-2, não usamos o Tomahawk em nossa aplicação mas o plugin Amateras Faces adiciona tambem coloca ele na aplicação por padrão, no Eclipse você pode baixar o eclipse 1.1.5 que é a versão utiliza em nosso artigo ou uma mais nova, e colocar na pasta lib de sua aplicação,  caso esteja usando o eclipse com Exadel, Lomboz ou algum outro plugin é só pedir para adicionar JSF capabilities, já no Netbeans você pode escolher um projeto web e marcar o frame java server faces quando estiver criando um projeto web pois o código aqui apresentando é totalmente compatível com a especificação da Sun e não usamos componentes do Tomahawk.

 

cvjsfmvp2fig02.jpg 

Figura-2

 

código do index.jsp

 

<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

<title>Validação Manual</title>

</head>

<body>

<h1>Metódos de Validação</h1>

<a href="cap1.jsf"> Validação Manual</a><br>

</body>

</html>

 

Agora crie o arquivo cap1.jsp:

 

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>

<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>

<f:view>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

<TITLE>Exemplo de Validação Manual</TITLE>

 

<LINK REL="STYLESHEET"

      href="./css/styles.css"

      TYPE="text/css">

</HEAD>

<BODY>

<CENTER>

<h1>Capitalização NossaCap</h1>

 

<h:form>

  <h:outputText value="#{capBean1.errorMessages}"

                escape="false"/>

  <TABLE width="350px">

  <TR>

    <TD>Nome Titular:

    </TD>

    <td align="right"><h:inputText value="#{capBean1.userID}"/></td>

    </TR>

 

    <TD>Valor Aplicado(R$):

    </TD>

    <td align="right"><h:inputText value="#{capBean1.bidAmount}"/></td>

    </TR>

  <TR>

    <TD>Vigência do Titulo:

    </TD>

    <td align="right"><h:inputText value="#{capBean1.bidDuration}"/></td>

    </TR>

  <TR><Td colspan="2" align="right">

      <h:commandButton value="Confirmar!"

                       action="#{capBean1.doCap}"/></Td></TR>  </TABLE>

</h:form>

</CENTER></BODY></HTML>

</f:view>

 

Agora vamos criar o Backbean CapBean1 que será responsável pela validação de campos submetidos pelo usuário.

 

CapBean.java

 

package validacoes;

//Essa classe faz parte do pacote validacoes

 

import java.util.ArrayList;

 

public class CapBean1 {

  private String userID = "";

  private String bidAmount;

  private double numericBidAmount = 0;

  private String bidDuration;

  private int numericBidDuration = 0;

/* As mensagens de erro serão armazenadas em um ArrayList

 * Observe que o nosso código é adaptado para o Java 5

 * podendo ser rodado sobre um JVM 1.4 com algumas adaptações

 * no código.

 */

  private ArrayList<String> errorMessages = new ArrayList<String>();

 

  // Agora definiremos o metódos get e Set do Managed Bean CapBean1.java

 

  public String getUserID() { return(userID); }

 

  public void setUserID(String userID) {

    this.userID = userID.trim();

  }

 

  public String getBidAmount() { return(bidAmount); }

 

  public void setBidAmount(String bidAmount) {

    this.bidAmount = bidAmount;

    /* é feita a conversão da String recebida e armazenada no objeto

     numericBidAmout que é do tipo double

     */

    try {

      numericBidAmount = Double.parseDouble(bidAmount);

    } catch(NumberFormatException nfe) {}

  }

 

  public double getNumericBidAmount() {

    return(numericBidAmount);

  }

 

  public String getBidDuration() { return(bidDuration); }

 

  public void setBidDuration(String bidDuration) {

    this.bidDuration = bidDuration;

    /* é feita a conversão da String recebida e armazenada no objeto

    numericBidAmout que é do tipo int */

    try {

      numericBidDuration = Integer.parseInt(bidDuration);

    } catch(NumberFormatException nfe) {}

  }

 

  public int getNumericBidDuration() {

    return(numericBidDuration);

  }

  /* Este'é o método getErrorMessages() que verifica as mensagens de erros

   * no objeto ArrayList errorMessages e devolve a variavel tipo  String

   * message concatenada.

   * */

  public String getErrorMessages() {

    String message;

    if (errorMessages.size() == 0) {

      message = "";

    } else {

      message = "<FONT COLOR=RED><B><UL>\n";

      for(int i=0; i<errorMessages.size(); i++) {

        message = message + "<LI>" +

                 (String)errorMessages.get(i) + "\n";

      }

      message = message + "</UL></B></FONT>\n";

    }

    return(message);

  }

  /*O metódo doBid() é responsável por fazer as validações

   * dos campos e quando encontra um erro adiciona na ArrayList

   * errorMessages, caso não encontre error, retorna uma mensagem

   * de sucesso (success).

   * */

  public String doCap() {

    errorMessages = new ArrayList<String>();

    if (getUserID().equals("")) {

      errorMessages.add("Nome do titular não foi preenchido");

    }

   

    if (getNumericBidAmount() < 20.00) {

      errorMessages.add("O valor investido deve ser de no mí­nimo R$20.00");

    }

    if (getNumericBidDuration() < 60) {

      errorMessages.add("o prazo mí­nimo de investimento é de 60 dias.");

    }

    if (errorMessages.size() > 0) {

      return(null);

    } else {

      return("success");

    }

  }

}

 

Crie na pasta WEB-INF a pasta results e dentro dela crie mais um arquivo jsp, chame o de mostraCap1.jsp que caso a submissão do formulário retorne sucesso, sera exibido ao usuário com a confirmação da concretização da transação.

 

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>

<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>

<f:view>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD><TITLE>Transação efetuada com sucesso!</TITLE>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

<LINK REL="STYLESHEET"

      href="./css/styles.css"

      TYPE="text/css">

</HEAD>

<BODY>

<CENTER>

  <h1>Transação Efetuada com sucesso!</h1>

 

<H2>Por favor imprima uma cópia desse comprovante.</H2>

<UL>

  <LI>Nome Titular: &nbsp; <h:outputText value="#{capBean1.userID}"/>

 

  <LI>Valor do investido: &nbsp; R$ &nbsp;<h:outputText value="#{capBean1.bidAmount}"/>

  <LI>Vigência: &nbsp; <h:outputText value="#{capBean1.bidDuration}"/>

</UL>

</CENTER></BODY></HTML>

</f:view>

 

Crie na pasta css o  arquivo styles.css:

 

BODY { background-color: #FFFFFF }

A:hover { color: red }

H2 {

      color: #440000;

      text-align: center;

      font-family: Arial, Helvetica, sans-serif

}

TH.TITLE   { background-color: #EF8429;

             font-size: 28px;

             font-family: Arial, Helvetica, sans-serif;

}

.WHITE {

    color: white;

    font-family: Arial, Helvetica, sans-serif;

    font-size: 80%;

    font-weight: bold;

    text-decoration : none;

}

.DARK { background-color: black;

}

.RED { font-weight: bold;

       color: red;

}

 

Agora vamos configurar os arquivos faces-config.xml e web.xml:

 

Este é o web.xml:

 

<?xml version="1.0" encoding="UTF-8"?>

 

<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">

 

  <display-name>validacao</display-name>

 

  <!-- servlet -->

  <servlet>

    <servlet-name>FacesServlet</servlet-name>

    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>

    <load-on-startup>1</load-on-startup>

  </servlet>

 

  <!-- servlet-mapping -->

 

  <servlet-mapping>

    <servlet-name>FacesServlet</servlet-name>

    <url-pattern>*.jsf</url-pattern>

  </servlet-mapping>

 

  <!-- The Usual Welcome File List -->

    <welcome-file-list>

      <welcome-file>index.jsp</welcome-file>

      <welcome-file>index.html</welcome-file>

    </welcome-file-list>

 

</web-app>

 

Este é o faces-config.xml :

 

<?xml version="1.0"?>

<!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>capBean1</managed-bean-name>

    <managed-bean-class>validacoes.CapBean1</managed-bean-class>

    <managed-bean-scope>request</managed-bean-scope>

  </managed-bean>

  <navigation-rule>

    <from-view-id>/cap1.jsp</from-view-id>

    <navigation-case>

      <from-outcome>success</from-outcome>

      <to-view-id>/WEB-INF/results/mostraCap1.jsp</to-view-id>

    </navigation-case>

  </navigation-rule> 

</faces-config>

 

Observe que em managed-bean-name nós indicamos o nome capBean1 e fizemos referencia a ele nas tags jsf das paginas cap1.jsp e mostracap1.jsp.

 

Em managed-bean-class nós informamos o caminho completo até a classe CapBean1 e o pacote ao qual ele faz parte.

 

em navigation-rule informamos que a partir de cap1.jsp sera esperado uma resposta de sucesso que ao ocorrer exibirá mostraCap1.jsp ao usuário. Importante frisar que essas paginas em tempo de execução serão chamadas com a extensão .jsf que mapeamos no arquivo web.xml.

 

Como pode ver em CapBean1.java todo a lógica esta praticamente no classe java, inclusive a validação dos campos, poderíamos ter usado javascript para validar dos dados no cliente, apesar de que um usuário poderia facilmente desativar o suporte ao javascript do navegador em questão, poderíamos também utilizar triggers(gatilhos), funções  e stored procedures (procedimento armazenados) para fazer a validação dos campos, correndo apenas o risco de perder talvez a portabilidade da aplicação de um banco para outro, por exemplo você desenvolveu em HSQLDB em desenvolvimento e precisar mudar para um Oracle ou um SQL Server e ai teria que reprogramar tudo de novo, o ideal nesses casos é definir o banco a ser usado desde o início, o importante é frisar é que em nossa aplicação de exemplo caso fosse necessário atualizar as o prazo mínimo de vigência ou o valor minimo de investimento seria necessário mexer no código da aplicação, talvez o uso de um arquivo de propriedades ajudasse pois seria  necessário alterar o arquivo mas na vida real essa informação estaria em um banco de dados ainda assim a validação manual é desaconselhável.

 

Nas figuras vemos a aplicação sendo executada:

 

digite o seguinte endereço em seu navegador: http://localhost:8080/validacao/

 

cvjsfmvp2fig03.jpg 

Figura-3

 

cvjsfmvp2fig04.jpg 

Figura-4

 

cvjsfmvp2fig05.jpg 

Figura-5

 

cvjsfmvp2fig06.jpg 

Figura-6

 

cvjsfmvp2fig07.jpg 

Figura-7

 

cvjsfmvp2fig08.jpg 

Figura-8

 

Na próxima parte desta série de artigos veremos exemplos de validação explícita, até lá.

 

Sobre este artigo:

IDE utilizada: Eclipse 3.3 (com Plugins Amateras faces,Amateras HTML e Sysdeo)

Versão do Bd: Não se aplica

Navegadores Utilizados: Firefox 2.x, Opera 9.x