Olá, pretendo nesse post demonstrar a criação de Convert ou também chamados conversores em aplicações web JSF 1.2.
Os conversores nós auxiliam no desenvolvimento de aplicações web facilitando nosso trabalho no dia-à-dia. Um exemplo de conversor pode ser aplicado nos input (entrada de dados) que um usuário digita.
Imagine um formulário com cadastro de um cliente em que seja necessário entrar com o CPF do cliente, aplicando uma mascara javascript no browser do cliente conseguimos obter uma formatação comum como exemplo: CPF = 111.111.111-11. Só que temos um pequeno problema ao persistir esse dado quando o banco de dados só aceita 11111111111 por exemplo. Uma saída seria antes de gravar o dado retirar a formatação. Mas em todos os campos que tenha CPF deveremos nos preocupar com isso.
Uma solução bastante atraente é utilizar os conversores JSF. Nele podemos criar diversos conversores como desejarmos, exemplo: Conversores de CNPJ, CPF, Cartão de Crétido entre outros.
Por padrão aAPI JSF já nós dá alguns convert padrões como f:convertNumber, datatime entre diversos outros que podem ser visto aqui (exemplos completos muito bom):
http://www.ibm.com/developerworks/library/j-jsf3/

Criando um convert no JSF: CPFConvert

Os conversore implementam a interface Convert.


public class CPFConverter implements Converter {


Precisamos explicar a interface como queremos que nosso convert se comporte. Para isso devemos implementar os métodos:

@Override public Object getAsObject(FacesContext context, UIComponent component, String newvalue)
public Object getAsString(FacesContext context, UIComponent component, Object value)


No método getAsObject devemos pegar a string do componente de imput html e transformá-ló em um objeto (podendo ser String também).
O método getAsString deverá retorna o Object mas em um formato que possa ser convertido em uma String.

Abaixo segue a class utilizada pelo conversor


import javax.faces.application.FacesMessage;

import javax.faces.component.UIComponent;

import javax.faces.context.FacesContext;

import javax.faces.convert.Converter;

import javax.faces.convert.ConverterException;



/**

 

 @author Thiago Fonseca Meneses

 *

 */

public class CPFConverter implements Converter {



  @Override

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

    StringBuilder builder = new StringBuilder(newvalue);

    //Caracteres permitidos '0..9 '.' e '-' 

    boolean encontrouCaracterInvalido = false;

    int i = 0;

    while i < builder.length() && !encontrouCaracterInvalido) {

      char c = builder.charAt(i);

      if (Character.isDigit(c))

        i++;

      else

        if (Character.isDefined('.'))

          builder.deleteCharAt(i);

        else

          if (Character.isDefined('-'))

            builder.deleteCharAt(i);

          else 

            encontrouCaracterInvalido = true;

            

    }

    if (encontrouCaracterInvalido) {

      FacesMessage message = new FacesMessage("Ocorreu um erro de conversão. ","CPF inválido");

      message.setSeverity(FacesMessage.SEVERITY_ERROR);

      throw new ConverterException(message);

    }

    return new CPF(builder.toString());

  }



  @Override

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

    //11111111111

    //111.111.111-11 - como será exibido

    String v = value.toString();

    StringBuilder builder = new StringBuilder();

    int tam = v.length();

    for(int i = 0; i < tam; i++) {

      if (i == || i== 6)

        builder.append(".");

      else

        if (i == 9)

          builder.append("-");

      if (i < 11)

        builder.append(v.charAt(i));

      else

        break;

    }

    return builder.toString();

  }



}


--------------------------- Class CPF --------------------------------


import java.io.Serializable;



public class CPF implements Serializable{

  private static final long serialVersionUID = 1L;

  private String numero;

  

  public CPF(String numero){

    this.numero = numero;

  }

  public String toString() {

    return numero;

  }

}