Um dos grandes motivadores para a adoção do JavaServer Faces é a facilidade de implementar a comunicação entre as páginas HTML e as classes Java responsáveis por receber e tratar suas requisições: os ManagedBeans. De forma simples e direta, conseguimos fazer chamadas a métodos e atribuir valores a propriedades dessas classes com poucas linhas de código, a partir dos componentes do JSF.

Nesse artigo, demonstraremos como criar um ManagedBean e a página HTML correspondente, que irá realizar as chamadas aos métodos e atributos desse managedbean, expondo dessa forma como tal ligação pode ser feita.

Criando o ManagedBean

O ManagedBean, também conhecido por muitos como BackingBean, é a classe responsável por realizar a comunicação entre o XHTML e alguma outra camada que seu projeto possua. Por exemplo, quando estamos trabalhando com uma arquitetura MVC, essa classe atua como controller, tratando as requisições vindas do front-end. Dessa forma, não devemos, ou pelo menos devemos evitar, adicionar regras de negócio a essa classe, pois ela deve ser apenas uma ponte de comunicação entre a camada de apresentação (páginas HTML/XHTML) e as demais camadas.

No exemplo que implementaremos, nossa classe terá uma tarefa bem simples: validar um CPF passado através do XHTML pelo usuário e retornar ao navegador uma mensagem dizendo se o valor é válido ou não. O código pode ser visto na Listagem 1.

Listagem 1. ManagedBean ValidadorMB

package firstmb;

import java.io.Serializable;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

@ManagedBean(name = "validadorMB")
@RequestScoped
public class ValidadorMB  {

/**
*
*/
private static final long serialVersionUID = 1L;

private String cpf;

public void validar() {
   if (cpf == null || "".equals(cpf)) {
       FacesContext.getCurrentInstance().addMessage("msgValidador", 
       new FacesMessage("CPF Vazio"));
   } else if (cpf.length() != 11) {
       FacesContext.getCurrentInstance().addMessage("msgValidador", 
       new FacesMessage("CPF deve ter 11 dígitos"));
   }else{
       FacesContext.getCurrentInstance().addMessage("msgValidador", 
       new FacesMessage("CPF Validado com sucesso !!"));
   }
}

public String getCpf() {
   return cpf;
}

public void setCpf(String cpf) {
   this.cpf = cpf;
}

}
  • Linha 10: Dizemos ao JSF, com essa anotação, que essa classe será um ManagedBean e deve ser injetada em seu contexto com o nome "validadorMB", pois usaremos esse nome para referenciá-la no XHTML;
  • Linha 11: Informamos que vamos utilizar o escopo de requisição. Assim, o estado do managedbean será guardado apenas durante a requisição corrente e perdido assim que a mesma for finalizada. Com isso, economizamos recursos do servidor;
  • Linha 21: Começamos a implementar a validação do CPF. Note que nossa validação é bem simples e optamos por não utilizar um algoritmo para validar o dígito verificador do CPF, pois esse não é o foco desse artigo. Note, também, que a cada cláusula condicional temos a criação de um objeto FacesMessage, que é adicionado a uma lista de mensagens do FacesContext. Esse último é responsável por trafegar todas as mensagens durante o ciclo de vida do JSF, até que elas sejam renderizadas no navegador do usuário;
  • Linhas 23, 25 e 27: O método addMessage() recebe dois argumentos. O primeiro representa o ID do componente JSF que exibirá as mensagens no navegador do usuário, e o segundo é a mensagem propriamente dita, que está encapsulada dentro do objeto FacesMessage.

Criando a página XHTML

Criaremos, agora, a página XHTML responsável por receber o valor digitado pelo usuário e acionar o método de validação do ManagedBean ValidadorMB. Seu código pode ser visto na Listagem 2.

Listagem 2. Página XHTML usando ValidadorMB

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<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>
   <title>Valida CPF</title>
</h:head>
<h:body>
   <h:form>
       <h:inputText value="#{validadorMB.cpf}" />
       <h:commandButton value="VALIDAR" 
       actionListener="#{validadorMB.validar}" />
       <h:message for="msgValidador" />
   </h:form>
</h:body>
</html>

Na linha 12, temos um componente inputText, do JSF, que usa uma Expression Language (EL Expression) para fazer referência ao ManagedBean “validadorMB”. O objetivo desse componente é atribuir o valor digitado no campo de texto ao atributo cpf do ManagedBean referenciado.

Na linha seguinte, declaramos um botão que chama o método validar(), explicado anteriormente. Assim que o componente commandButton for clicado, ele fará uma chamada ao método do nosso ManagedBean. O importante aqui é notar que podemos fazer referência a qualquer atributo ou método que seja visível de fora do ManagedBean, apenas usando a EL Expression dentro da página XHTML.

Por último, temos o componente message com um atributo for, que especifica qual o ID das mensagens que devem ser capturadas e mostradas nesse componente. Como utilizamos o ID msgValidador na Listagem 1, todas as mensagens com esse ID serão mostradas no componente message da Listagem 2.