Por que eu devo ler este artigo:Este artigo descreve como otimizar o desempenho de aplicações web que utilizam a tecnologia JavaServer Faces, melhorando o tempo de resposta para que elas consigam suportar um número maior de requisições. Para isso, serão analisados detalhes das configurações da tecnologia e quando se deve optar por uma configuração ou outra. No artigo, será utilizada a versão 2.2 do JSF, pois foram introduzidos novos conceitos, como visões sem estado e fluxo de página, que também podem ajudar significativamente na melhora do desempenho.

Aplicações web são essenciais para praticamente qualquer empresa. Ao oferecer uma solução prática e eficaz para realizar a interface com o usuário, sem a necessidade de instalação de um aplicativo do lado do cliente, tais aplicações possibilitam uma maior mobilidade, facilidade de acesso e menor custo.

Buscando trazer essas vantagens para a linguagem Java, a tecnologia JavaServer Faces (JSF) surgiu como uma alternativa ao JSP, tecnologia até então padrão para a implementação de aplicações web em Java.

Ao viabilizar recursos até o momento inexistentes e uma API de fácil utilização, o JSF se firmou no mercado como uma tecnologia de referência, se tornando uma ótima opção para o desenvolvimento web. Indo mais além, o framework JSF implementa o modelo MVC (Model-View-Controller), ou seja, permite que seu código seja organizado em três camadas: modelo, visão e controle, garantindo assim um desacoplamento e uma simplicidade maior para as tarefas de manutenção e evolução.

Porém, mesmo com todas essas vantagens, ainda é necessário um bom domínio dessa tecnologia e um desenvolvimento cuidadoso, com muita atenção aos detalhes, para que se consiga implementar um sistema otimizado e com boa performance.

Neste momento é válido ressaltar que muitos dos problemas de performance das primeiras versões foram resolvidos na versão 2 da especificação. Essas melhorias foram possíveis graças a novos recursos, como Partial State Saving, Tree Visiting e Project Stage, o que tornou mais simples implementar um código realmente otimizado, que resulta em:

  • Menor consumo de memória e CPU;
  • Melhor gerenciamento do estado de cada componente;
  • Otimização no algoritmo de busca de componentes;
  • Otimização na serialização da árvore de componentes.

Dito isso, o objetivo deste artigo será orientar como resolver os principais problemas de performance enfrentados pelos desenvolvedores e expor soluções que a tecnologia JSF oferece, a partir de pequenos exemplos de código. Inicialmente, no entanto, iremos analisar alguns conceitos fundamentais do JSF, referentes à árvore de componentes, para que o desenvolvedor possa ficar a par de como esse framework funciona.

Árvore de componentes

Em JSF, a árvore de componentes é um conceito fundamental. A construção dessa árvore é baseada no código de uma página JSF (view), código esse que utiliza a linguagem de marcação XHTML. Após o código ser analisado, uma instância de cada componente JSF é criada e a árvore de componentes é construída. A partir disso, essa estrutura será utilizada ao longo de todo o ciclo de vida do JSF, ciclo esse que é definido pelas seguintes fases:

  • Restaurar View: Nesta fase a árvore de componentes é criada ou restaurada, caso já tenha sido criada em uma requisição anterior;
  • Aplicar valores: Os componentes JSF são atualizados com os valores enviados na requisição, por exemplo entradas de formulário;
  • Conversão / Validação: Conversores e validadores são aplicados sobre os valores dos componentes de entrada (inputs) da página;
  • Atualização do modelo: Se a validação for bem-sucedida, os valores dos componentes de entrada são atribuídos às propriedades do bean. Isso significa que os métodos setters dos beans serão chamados;
  • Invocar aplicação: Esta fase é onde a lógica da aplicação será executada, isto é, onde os métodos dos managed beans são executados;
  • Criar a resposta: Fase responsável por encontrar a página (view) de resposta, percorrer a árvore de componentes e processar cada componente JSF para criar um HTML de resposta para o cliente.

Como vimos, a árvore de componentes está envolvida em todas as fases do ciclo de vida, sendo percorrida várias vezes. Isso sugere que a quantidade de componentes JSF presente em cada uma tem um impacto significativo sobre o tempo de resposta, e consequentemente, sobre o desempenho da aplicação. Com essas informações, podemos assumir que uma árvore de componentes de pequeno porte é benéfica para ter um tempo de resposta mais curto. Tal afirmação pode ser confirmada no gráfico da Figura 1, que mede o tempo de duração de cada fase, com diferentes tamanhos de árvores. Note que quanto maior a quantidade de componentes JSF em uma página, maior é o tempo gasto em cada fase do ciclo de vida.

Figura 1. Duração das fases em relação ao tamanho da árvore. Fonte: blog.oio.de

Otimizando sua aplicaçã ...

Quer ler esse conteúdo completo? Tenha acesso completo