Criando Convert/Conversores no JSF
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 == 3 || 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;
}
}