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.
Saiba mais: Como adicionar o JSF em seus projetos
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.
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.
<!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.
Relacionado: JSF: JavaServer Faces