Arquivo

Archive for the ‘programação JSF’ Category

Bibliotecas de Interface Rica no JSF 2

Aprenda um pouco do que é RIA (Rich Internet Application) e veja um comparativo entre as três soluções de bibliotecas de interface rica para JSF: PrimeFaces, RichFaces e ICEfaces.

Essa palestra foi apresentada no CCT de maio do CEJUG e teve como base um artigo de minha autoria, intitulado Bibliotecas de Interface Rica no JSF 2, que saiu na edição 114 da Revista Java Magazine.

Anúncios

JSF 2 – visão geral e novidades do framework

A versão 2 do Java Server Faces é significativamente melhor do que a versão 1 em vários aspectos. Trazendo, sobretudo, conceitos que foram incluídos anteriormente no JBoss Seam, a nova especificação possui inúmeras vantagens que facilitam a vida do desenvolvedor.

Vamos a um levantamento delas:

Mudanças do Core do JSF

  • Anotações nas classes substituíram várias entradas no faces-config.xml. Exemplos:
    • Managed Bean: @ManagedBean. Exemplo:

    Leia mais

Corrigindo o problema de Ajax no IE9 com JSF e Richfaces 3

Assim que saiu o Internet Explorer 9 começamos a ter inúmeros problemas com o RichFaces 3, especialmente com as requisições em Ajax. O problema está no javascript de terceiros usado pelo componente de interfaces ricas. Algumas pessoas mencionaram ter conseguido corrigir e divulgaram o método, entretanto outras fizeram o mesmo procedimento e não deu certo (como eu).

Segundo os desenvolvedores do RichFaces, eles estão muito atarefados com a versão 4.0 da biblioteca. Há previsão de sair uma versão 3.3.4 com as correções, mas sem prazo divulgado.

Dessa forma, a única solução que encontrei foi adicionar um filtro no web.xml para forçar o IE9 a trabalhar como a versão 8. O procedimento é muito simples e leva poucos minutos. Vamos a ele:

Leia mais

Como adicionar Captcha na aplicação JSF – solução com Recaptcha

Um problema muito sério em aplicações que possuem acesso aberto na internet é o uso de softwares automatizados que enviam inúmeras requisições seguidas, normalmente com a pretensão de gerar spam, diminuindo o desempenho de sistemas e gerando prejuízo às empresas.

A técnica mais utilizada para evitar esse problema é o emprego de imagens com letras distorcidas, que em alguns casos pode ter a adição de uma seqüência obscurecida das letras ou dos dígitos que aparecem na tela. O objetivo é evitar o uso de robôs, já que eles não conseguem fazer a leitura de imagens. Essa solução é conhecida como Captcha (da sigla Completely Automated Public Turing test to tell Computers and Humans Apart) e embora tenha recebido esse nome, é visto como um Teste de Turing reverso, uma vez que é administrado pelo computador e não por humanos.

No meus testes em JSF consegui utilizar as soluções do Tomahawk, do PrimeFaces, do JCaptcha e do Recaptcha. Todos são muitos simples de adicionar à aplicação, mas o Tomahawk  e o JCaptcha integrado ao JSF usam, para fazer a validação, um atributo em escopo de sessão com o valor da chave, o que muitas vezes não é desejado a nível de arquitetura. Já o PrimeFaces tem como base o Recaptcha da Google, mas a maioria dos desenvolvedores (eu me incluo entre eles) usa o RichFaces como solução de biblioteca de interface rica, tornando-se impensável colocar o PrimeFaces na aplicação apenas para ter o componente Captcha.

Por fim, meu último teste foi o Recaptcha, da Google. Vamos às vantagens da solução:

  1. Não utiliza a chave como atributo de sessão para validar a imagem;
  2. Ajuda a digitalizar livros e jornais (no momento estão sendo digitalizadas edições do The New York Times e livros do Google Books);
  3. É acessível para deficientes visuais;
  4. É popular: empresas como Facebook e TicketMaster utilizam;
  5. Tem compatibilidade com várias linguagens e aplicações.

Obviamente que nem tudo são flores. As desvantagens são:

  1. O serviço da Google está na web, portanto se ele cair (pouco provável), ou se o host onde a aplicação Java está não conseguir comunicação com ele, o componente não será exibido;
  2. O componente possui uma visual mais complexo do que os outros, o que às vezes confunde o usuário;

Pesando as desvantagens e as vantagens, decidimos optar pelo Recaptcha, que se mostrou com a melhor relação entre os dois aspectos. Vamos ao que interessa: como colocar na aplicação.

Leia mais

Como Executar Tarefas em Paralelo no JSF – Abordagem com Threads

Essa semana me deparei com um problema em um sistema desenvolvido em JSF aqui da UECE. Após o usuário clicar em um CommandButton para executar uma action, o sistema tinha que atualizar uma entidade no banco de dados e logo depois disparar uma boa quantidade de e-mails informativos – não precisam de confirmação se foram enviados com sucesso – diferentes (variando de 4 a mais de 100) e para vários destinatários. O detalhe era: como fazer para não deixar o usuário esperando o envio de mais de 100 mensagens? Qual a solução mais prática?

Algumas pessoas me sugeriram usar o Quartz com uma tarefa recorrente que ficaria verificando se havia mensagens para enviar em uma fila, mas seria mais um componente a ser colocado no sistema e nem todos os desenvolvedores do departamento saberiam usá-lo.

A solução muito simples que encontrei foi criar uma Thread separada, responsável por realizar a tarefa de enviar as mensagens. Assim, a execução do método no Managed Bean continuaria imediatamente após o disparo da Thread, independente de as mensagens terem sido enviadas ou não. Vamos aos códigos:

Leia mais

Como retornar e preencher apenas alguns atributos da entidade na consulta com Hibernate

Esses dias desenvolvi um sistema que teria que armazenar uma entidade em escopo de sessão, porém a classe representada pela entidade tinha vários atributos de instância. Isso despertou uma certa preocupação em relação ao consumo de memória, visto que haveriam muitos acessos simultâneos ao sistema e quase todos os usuários teriam esse objeto setado na sessão. O detalhe é que em termos de escopo de sessão eu precisava de apenas alguns atributos, enquanto vários outros eu precisava em apenas algumas telas – poderia ser escopo de requisição.

A solução foi puxar somente alguns dos atributos na consulta que retornava o objeto a ser colocado na sessão. Quando eu precisasse dos outros atributos da entidade, teria uma variável do mesmo tipo em um managed bean com escopo de request que seria utilizado nas telas.

Pensei então: para fazer isso com JDBC é muito fácil, mas minha aplicação usa Hibernate. É possível fazer isso com Hibernate? Como?

Após algumas horas de pesquisa descobri a classe AliasToBeanResultTransformer que simplifica bastante as coisas para a gente. Vamos aos códigos:

Leia mais

Como executar métodos antes de renderizar páginas em JSF – abordagem com RestFaces

No meu post anterior, mostrei como preparar uma aplicação JSF para receber requisições GET com o uso de RestFaces Actions. Nessa nova publicação, mostrarei como chamar um método de um Bean antes de renderizar uma página.

Uma das possibilidades de se conseguir isso é criando um PhaseListener. O problema é que muitas vezes isso acontece em apenas uma página do nosso sistema, então criar um PhaseListener que vai verificar se o usuário está em uma determinada página para executar uma simples ação é bastante desencorajador. Uma outra opção seria colocar lógica no método getter, mas essa prática é fortemente desaconselhada, pois, em geral, os getters não devem ter lógica de negócio.

Com o RestFaces (caso você queira saber como instalar o RestFaces, consulte meu post anterior nesse endereço)  é muito simples fazer essa operação, conforme demonstrarei abaixo:

Leia mais