JSF – Conversores personalizados – Parte III

Uma aplicação JavaServer Faces pode ter associado um componente com os dados do objeto do  modelo do lado do servidor. Este objeto do modelo é um componente JavaBeans que pode encapsular dos dados de um conjunto de componentes.

Quando um componente de usa a um objeto, a aplicação ganha duas vistas dos dados do componente: a vista do modelo e a vista da apresentação, que representa dos dados de uma forma que o usuário pode vê-los e/ou modifica-los.

A aplicação deve garantir deve garantir que os dados do componente podem ser convertidos entra a vista do modelo e a vista de apresentação. Esta conversão normalmente realiza-se de forma automática ao renderizar o componente ou usando um converso padrão disponível no JavaServer Faces.

Durante o desenvolvimento de uma aplicação pode surgir a necessidade de converter um dado de um componente para um tipo não suportado pelo renderizador do componente e para o qual o JavaServer Faces não tem um conversor padrão.  Para contornar esta situação, a tecnologia JavaServer Faces disponibiliza  definições padrão de Converter que permitem ao desenvolvedor criar conversores personalizados. A implementação de um Converter permite converter os dados do componente entre a vista do modelo e a vista de apresentação.

Em muitas situações é necessário converter objetos de classe do modelo da aplicação para serem utilizadas em telas de uma aplicação construída com componentes do JavaServer Faces. Por exemplo, uma classe Departamento ou Município, deve ser convertida para poder ser utilizada em alguns componentes JavaServer Faces. Nestes casos, é necessário criar e utilizar conversores personalizados.

Conversores personalizados

Uma aplicação JavaServer Faces pode ter associado um componente com os dados do objeto do  modelo do lado do servidor. Este objeto do modelo é um componente JavaBeans que pode encapsular dos dados de um conjunto de componentes.

Quando um componente de usa a um objeto, a aplicação ganha duas vistas dos dados do componente: a vista do modelo e a vista da apresentação, que representa dos dados de uma forma que o usuário pode vê-los e/ou modifica-los.

A aplicação deve garantir deve garantir que os dados do componente podem ser convertidos entra a vista do modelo e a vista de apresentação. Esta conversão normalmente realiza-se de forma automática ao renderizar o componente ou usando um converso padrão disponível no JavaServer Faces.

Durante o desenvolvimento de uma aplicação pode surgir a necessidade de converter um dado de um componente para um tipo não suportado pelo renderizador do componente e para o qual o JavaServer Faces não tem um conversor padrão.  Para contornar esta situação, a tecnologia JavaServer Faces disponibiliza  definições padrão de Converter que permitem ao desenvolvedor criar conversores personalizados. A implementação de um Converter permite converter os dados do componente entre a vista do modelo e a vista de apresentação.

Em muitas situações é necessário converter objetos de classe do modelo da aplicação para serem utilizadas em telas de uma aplicação construída com componentes do JavaServer Faces. Por exemplo, uma classe Departamento ou Município, deve ser convertida para poder ser utilizada em alguns componentes JavaServer Faces. Nestes casos, é necessário criar e utilizar conversores personalizados.

A aplicação deve garantir deve garantir que os dados do componente podem ser convertidos entra a vista do modelo e a vista de apresentação. Esta conversão normalmente realiza-se de forma automática ao renderizar o componente ou usando um converso padrão disponível no JavaServer Faces.

Durante o desenvolvimento de uma aplicação pode surgir a necessidade de converter um dado de um componente para um tipo não suportado pelo renderizador do componente e para o qual o JavaServer Faces não tem um conversor padrão.  Para contornar esta situação, a tecnologia JavaServer Faces disponibiliza  definições padrão de Converter que permitem ao desenvolvedor criar conversores personalizados. A implementação de um Converter permite converter os dados do componente entre a vista do modelo e a vista de apresentação.

Em muitas situações é necessário converter objetos de classe do modelo da aplicação para serem utilizadas em telas de uma aplicação construída com componentes do JavaServer Faces. Por exemplo, uma classe Departamento ou Município, deve ser convertida para poder ser utilizada em alguns componentes JavaServer Faces. Nestes casos, é necessário criar e utilizar conversores personalizados.

 

Procedimento da implementar um converter personalizado

 

Para implementar um conversor personalizado é suficiente exectura 3 passos:

Criar uma classe que implemente a interfaces javax.faces.convert.Converter

Implementar os métodos getAsObject() e getAsString() da referida interface

Usar a anotação @FacesConverter para atribuir um ID único para o converter personalizado.

A seguir serão mostradas duas formas de implentação dos métodos getAsObject() e getAsString() da interfaces Converter.

 

Forma I

 

import javax.faces.component.UIComponent;

import javax.faces.context.FacesContext;

import javax.faces.convert.Converter;

import javax.faces.convert.FacesConverter;

 

@FacesConverter(value = “departamentoConverter”, forClass = Departamento.class)

public class DepartamentoConverter implements Converter {

 

DepartamentoDAO departamentoDAO = new DepartamentoDAO();

 

@Override

public Object getAsObject(FacesContext context, UIComponent component, String value) {

Integer id = Integer.parseInt(value);

try {

return departamentoDAO.findById(id);

} catch (Exception ex) {

System.err.println(“Erro na conversão: ” + ex.getMessage());

}

return null;

}

 

@Override

public String getAsString(FacesContext context, UIComponent component, Object value) {

if (value != null) {

Departamento departamento =(Departamento)value;

return String.valueOf(departamento.getIdDepartamento());

}

return null;

 

}

 

}

 

 

Forma II

 

import java.util.HashMap;

import java.util.Map;

 

import javax.faces.component.UIComponent;

import javax.faces.context.FacesContext;

import javax.faces.convert.Converter;

import javax.faces.convert.FacesConverter;

 

@FacesConverter(“municipiioConverter”)

public class MunicipioConverter implements Converter{

 

private static Map<String, Municipio> mapa = new HashMap<String, Municipio>();

 

@Override

public Object getAsObject(FacesContext ctx, UIComponent comp, String value) {

return mapa.get(value);

}

 

@Override

public String getAsString(FacesContext ctx, UIComponent comp, Object value) {

if(value instanceof Municipio{

Municipio m = (Produto) value;

mapa.put(String.valueOf(m.getId()), m);

return String.valueOf(m.getId());

}else{

return “”;

}

}

 

As duas formas de construir o converter têm o mesmo resultado.

A anotação @FacesConverter é usada para dar um nome que funciona como o ID do converter e para registar o converter no contexto da aplicação JSF.

 

Os Métodos hashCode() e equals( Object object) nas classe do Modelo

Os métodos hashCode() e equals são métodos extremamente uteis quando se trabalha com Coleções (Collections) do Java.

O métodos equals da classe Object define a logica de comparação entre objetos de um determinado tipo.

O método hashCode() é utilizado par organizar os elementos de uma coleção num mesmo bucket(compartimento). O método hashCode() gera um código hash que facilita nos processos de busca de um objeto especifico. Numa busca, dois objectos são considerados iguais se o método hashCode() de ambos retorna o mesmo valor e o método equals() retorna true na comparação destes dois objetos.

Uma classe para a qual se vai criar um converter deve sobrescrever estes dois métodos, além do método toString().

 

Utilizar o converter no componente.

O ultimo passo consiste em utilizar o converter no componente e pode ser feito de duas formas.

Passando o ID do conterver como valor do atributo converter do componente ou encapsulando o converter entre a tag de abertura e de fecho do componente, como pode ser visto a seguir.

<h:input value=”#{contatoBean.contato.municipio}”>

  <f:converter converterId=”municipioConverter” />

</input>

Para usar o atributo converter do componente, basta incluir o id do conversor diretamente como valor do atributo.Como pode ser visto a seguir.

<h:input value=”#{funcionarioBean.funcionario.departamento}”  converter=”departamentoConverter” />

 

<h:selectOneMenu value=”#{funcionarioBean.funcionario.departamento}”  converter=”departamentoConverter”

  <f:selectItems value=”#{departamentoBean.lista}”

        var=”d” itemLabel=”#{d.nome}” itemValue=”#{d}” />

</h:selectOneMenu>

Essas duas formas de utilizar o converter, têm o mesmo resultado.

 

Convertes e componentes de seleção

 

Os componentes de seleção, como o seletOneMenu representam os causas mais elaborados e completos. Existe um valor que é exibido e uma valor que é envolvido no processo de conversão.

Para os casos como esse do h:selectOneMenu, o valor que é retornado por getAsString (o ID, no caso) é usado para que o componente saiba qual a relação entre o que está sendo exibido na tela, com o valor que o método getAsObject seu conversor espera receber. O ID não é usado na visualização mas sim ele é o elemento a ser enviado quando o formulário for submetido.

Deixe um comentário