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.
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.
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: <h:outputText value="#{capBean1.userID}"/>
<LI>Valor do investido: R$ <h:outputText value="#{capBean1.bidAmount}"/>
<LI>Vigência: <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/
Figura-3
Figura-4
Figura-5
Figura-6
Figura-7
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