Este artigo apresenta como aplicar boas práticas no desenvolvimento de software, abrangendo a tecnologia JSF, utilizando-se de exemplos implementados com foco nos recursos inseridos a partir da versão 2.0.
Artigos Java Boas práticas com JSF
Por que eu devo ler este artigo: Boas Práticas com JSF
Este artigo apresenta como aplicar boas práticas no desenvolvimento de software, abrangendo a tecnologia JSF, utilizando-se de exemplos implementados com foco nos recursos inseridos apartir da versão 2.0.
Em que situação o tema é útil: Para desenvolvedores de software que utilizam a tecnologia JSF e desejam conhecer dicas de como empregar seus recursos da melhor maneira, a fim de levar melhorias a uma aplicação, como também aprimorar o seu método de desenvolvimento.
O uso de sistemas web tem se tornado cada vez mais comum e abrangente e, em função disso, nesta área de desenvolvimento é comum e necessário o uso de frameworks, buscando facilitar a implementação deste tipo de sistema.
Um dos frameworks mais comumente utilizados em aplicações web é o JavaServer Faces (JSF), que subsidia o desenvolvimento da interface com o usuário (UI). Essa tecnologia recomenda fortemente a adoção do padrão MVC, visando à separação entre o modelo de negócio e a camada de visualização.
O JSF, em sua atual versão (2.0), teve novos recursos inseridos, trazendo também dúvidas de como usufruir deles corretamente. Normalmente, por causa destas dúvidas, certas tecnologias são utilizadas de maneira ineficiente, comprometendo o desempenho de uma aplicação. Outras vezes, por falta de conhecimento, alguns recursos importantes deixam de ser utilizados, quando poderiam trazer melhorias ao projeto. Por esses motivos, o propósito desse artigo é mostrar como usufruir de alguns dos recursos essenciais do JSF e adotá-los como boas práticas no desenvolvimento de aplicações web.
Dentre os recursos do JSF abordados neste artigo, estão: a) os escopos, que quando empregados de maneira correta possibilitam aprimorar o desempenho das aplicações; b) a integração entre Ajax e JSF 2, visando melhorias na interação com o usuário; c) o Project Stage (estágios de execução do projeto); d) o uso de arquivos de propriedades; e e) a internacionalização.
Limitando a utilização do Escopo de Sessão
O desempenho de uma aplicação web é um fator essencial a ser levado em consideração durante o seu desenvolvimento. Para isso, deve-se analisar vários trechos de código a fim de descobrir de que maneira é possível aprimorá-los para tornar a aplicação mais ágil.
Dentre os artefatos que compõem uma aplicação JSF, estão os Managed Beans, que são classes que possuem a responsabilidade de realizar a intermediação na comunicação entre as páginas e o modelo de negócio da aplicação. Esta comunicação se dá quando uma requisição é realizada ao servidor, onde a mesma é então delegada para as classes de negócio. Cada Managed Bean possui um determinado escopo, que é responsável por definir o ciclo de vida de cada uma de suas instâncias. Esses escopos são representados por cinco tipos, os quais serão descritos a seguir:
Escopo de aplicação (Application Scope): O ciclo de vida do Managed Bean anotado com esse escopo dura enquanto a aplicação estiver em execução. Os valores armazenados estarão disponíveis em todas as páginas da aplicação e para todos os clientes;
Escopo de Requisição (Request Scope): Nesse escopo, o ciclo de vida começa quando uma requisição é iniciada e permanece disponível durante o tempo de execução dela;
Escopo de Visão (View Scope): As instâncias de um Managed Bean anotado com esse escopo iniciam quando houver uma requisição a determinada página e permanecem disponíveis enquanto houver requisições para esta mesma página, sendo finalizados quando ocorrer o redirecionamento para outra página;
Escopo de Sessão (Session Scope): O ciclo de vida proposto por esse escopo se inicia no momento em que a primeira requisição para a instância de um Managed Bean com este escopo for realizada, e termina no momento em que a sessão do cliente for finalizada;
Escopo Personalizado (Custom Scope): Este escopo se diferencia dos demais por ter seu ciclo de vida e comportamento definidos por meio de uma classe personalizada. Os métodos desta classe são implementados de acordo com o comportamento desejado para o escopo.
Dentre os escopos vistos, o escopo de sessão é o que apresenta maior consumo de memória, pelo fato de os objetos permanecerem disponíveis durante toda a sessão do cliente. Consequentemente, seu uso em demasia pode comprometer o desempenho da aplicação. Por esse motivo, a utilização desse escopo deve ser analisada com bastante cuidado.
Para entender de que forma o escopo de sessão consome tanta memória, é interessante analisar o seu funcionamento. Este escopo é o único que armazena os dados do Managed Bean na memória do servidor durante toda a sessão do cliente. Dessa maneira, durante todas as solicitações em diferentes páginas que o cliente fizer, os dados continuarão armazenados na sessão, até que a mesma seja finalizada, e consequentemente a memória liberada.
O escopo de sessão não é o mais adequado para o uso geral, entretanto, existem situações específicas em que Managed Beans necessitam desta definição. Imagine uma aplicação em que há a necessidade de armazenar alguns dados durante toda a navegação do usuário, e que esses dados deverão estar disponíveis em todas as páginas da aplicação. Como exemplo, é possível utilizar o clássico e-commerce, onde há duas situações:
Esses exemplos devem ser implementados no JSF com um único tipo de escopo, o escopo de sessão, pois os dados referentes à "Autenticação do usuário" e ao "Carrinho de compras" devem estar armazenados para o cliente durante todo o tempo em que o mesmo estiver conectado à aplicação. Posteriormente, a sessão pode ser finalizada pelo próprio usuário. No caso referente à "Autenticação do usuário", ela será finalizada por meio do logout, e no exemplo correspondente ao carrinho de compras, quando o mesmo estiver vazio ou se a compra for finalizada. Além disso, também é possível definir um tempo limite para que a sessão fique disponível na memória do servidor. Após esse tempo ela será automaticamente finalizada.