terça-feira, 10 de dezembro de 2013

Como ignorar acentos usando o filtro do Primefaces


Um dos mais comuns pedidos dos usuários de sistemas é que possam pesquisar dados em tabelas sem a preocupação com acentos. Há várias maneiras de implementar esse recurso, mas vou mostrar hoje uma maneira bastante simples e direta.

Dois passos simples para filtrar dados ignorando os acentos, independente de tecnologia de bancos de dados, utilizando Primefaces:

1 - Criar um método no ManagedBean para gerar uma string sem acentos:

1.     public String removeAcentos(String s) {
2.         if (s == null) {
3.             return "";
4.         }
5.         String semAcentos = s.toLowerCase();
6.         semAcentos = semAcentos.replaceAll("[áàâãä]", "a");
7.         semAcentos = semAcentos.replaceAll("[éèêë]", "e");
8.         semAcentos = semAcentos.replaceAll("[íìîï]", "i");
9.         semAcentos = semAcentos.replaceAll("[óòôõö]", "o");
10.         semAcentos = semAcentos.replaceAll("[úùûü]", "u");
11.         semAcentos = semAcentos.replaceAll("ç", "c");
12.         semAcentos = semAcentos.replaceAll("ñ", "n");
13.         return semAcentos;
14.     }

2- Utilizar o filtro do Primefaces com uma expressão que tenha a string original (com acentos) e a string sem acentos, como pode ser visto na linha 16 abaixo:

1. <p:dataTable id="Tabela" style="width: 100%; font-size: 0.95em"
2.                                  widgetVar="wTabela"
3.                                  rowIndexVar="rownumber"
4.                                  var="item"
5.                                  value="#{bean.pessoas}"
6.                                  paginator="true"
7.                                  lazy="false"
8.                                  currentPageReportTemplate="{currentPage} de {totalPages}"
9.                                  rows="10"
10.                                  pageLinks="7"
11.                                  rowsPerPageTemplate="10,20,50,100">
12. ...
13.                         <p:column sortBy="#{item.nome}"
14.                                   style="white-space: normal"
15.                                   filterMatchMode="contains"
16.                                  filterBy="#{item.nome}#{bean.removeAcentos(item.nome)}" >
17.                                   <h:outputText value="#{item.nome}" />
18.                         </p:column>

Desta maneira, podemos pesquisar tanto José como Jose, pois a comparação vai ser feita com a string "joséjose", lembrando que o Primefaces já ignora maiúsculas e minúsculas.

4 comentários:

  1. Muito bom post Roselito! Obrigado!

    Com relação ao método removeAcentos, encontrei uma versão que utiliza a classe java.text.Normalizer.

    Segue como sugestão de melhoria:

    public String removeAcentos(String str) {
    str = Normalizer.normalize(str, Normalizer.Form.NFD);
    str = str.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
    //
    return str;
    }

    ResponderExcluir
  2. Hola gracias por tu post
    que JDK, Primefaces, JSF, server usas

    Yo esoty utilizando el JDK 7 primefaces 4 JSF 2.2 y apache tomacat 7
    y
    tambien
    JDK 6 primefaces 4 JSF 2.2 y apache tomcat 6

    pero los dos botan error

    ResponderExcluir