Clique aqui para ler esse artigo em PDF.
JavaServer Faces
Criação visual de interfaces web
Nesta edição vamos falar sobre uma das mais esperadas especificações da plataforma Java, Java Server Faces (JSR-127). A JSF está na reta final – a versão public draft foi lançada em agosto desse ano e já está disponível uma implementação de referência early access.
Produtividade
Um dos grandes gargalos de produtividade no desenvolvimento de aplicações web é a construção da camada de apresentação, normalmente implementada em HTML com servlets e JSPs. A maioria dos sistemas segue a mesma linha: uma variação da tradicional arquitetura Model-View-Controller (MVC) – servlets processam a requisição, classes de negócio executam as regras e páginas JSP apresentam o resultado.
Porém, normalmente muito pouco do código de apresentação pode ser reutilizado entre aplicações – e às vezes nem dentro da mesma aplicação. O fato é que a criação da interface HTML e da lógica de apresentação ainda segue um processo um pouco rudimentar, sem o apoio ferramental que os programadores poderiam ter. Imagine criar aplicações Swing sem ferramentas para desenhar a interface e tendo que implementar componentes que ficam mais complexos a cada projeto – é basicamente isso que fazemos em aplicações web!
As tecnologias da camada web têm evoluído bastante para suprir a demanda por maior produtividade. Um bom exemplo são as bibliotecas de tags JSP, que reduzem a quantidade de linhas de código Java nas páginas JSP, facilitando o reuso de código. Um conjunto dessas bibliotecas desenvolvidas pelo grupo Apache foi adotado como a JSR-52 e lançado recentemente como a JSTL 1.0 (JSP Standard Tag Library) – uma biblioteca de tags padronizada incorporada à tecnologia JSP.
Também já existe uma quantidade razoável de frameworks para a camada web, entre eles Apache Struts, WebWork e JATO. Estes auxiliam os programadores web a desenvolver o controle de fluxo da interface e implementar o modelo MVC. Além disso, muitas empresas chegaram a desenvolver sua própria solução caseira, já que essas dificuldades são comuns.
Cada framework tem seu próprio modelo, apesar de vários serem bastante parecidos. O JavaServer Faces vem para colocar ordem na construção desses frameworks e promete aumentar a produtividade na programação web.
Padronização
Um objetivo importante do JSF é reduzir o esforço necessário para criar páginas JSP com processamento feito por servlets, mas esse não é o único cenário suportado. A especificação visa facilitar e padronizar a criação de componentes de interfaces gráficas na internet, sejam eles desenhados em HTML, WAP, XML ou outras tecnologias similares. A idéia é permitir a criação de bibliotecas reusáveis desses componentes.
Outro ponto importante é fazer surgir uma série de ferramentas de apoio para facilitar o trabalho do desenvolvedor. O JSF está sendo arquitetado de forma a criar um ambiente ideal para o surgimento de ferramentas. Mais um objetivo do JSF é permitir que programadores não capacitados na programação orientada a objetos, possam utilizar Java para criar sistemas para a web – basicamente selecionando uma ação para um determinado componente e escrevendo a rotina que a implementa com apoio de uma ferramenta.
O framework
O JSF é composto basicamente por um mecanismo para mapear dados vindos do cliente em componentes no servidor, controlar o fluxo da aplicação, e armazenar estado entre as requisições.
Além disso, foi criada uma API para a manipulação de componentes e controle de aplicações JSF. Mas é interessante observar que o objetivo é que boa parte da API seja utilizada pelas ferramentas de desenvolvimento, e que o programador se concentre na parte de mais alto nível.
O JSF se baseia nas versões 2.3 e 1.2 das APIs de servlets e JSP, respectivamente. Além disso, a JSLT 1.0 também é utilizada pelo mecanismo, que também tem sua própria biblioteca de tags para facilitar a integração com JSP (veja a Figura 1).
Ciclo de vida
O framework JSF procura resolver problemas comuns da programação web, tais como: processamento de formulários, tratamento de eventos, conversão de tipos, tratamento de erros, gerenciamento de estado, validação de dados e internacionalização. A API e as tags criadas são voltadas para a solução desses problemas, que são abordados durante um ciclo de vida de atendimento à requisição.
O ciclo de vida de atendimento a uma requisição é composto por sete fases (veja a Figura 2). Cada fase tem um papel bem definido e pode alterar o fluxo da requisição.
Reconstitute Request Tree. Na primeira fase, as informações sobre quais componentes são utilizados no servidor são reconstituídas a partir dos parâmetros recebidos na requisição e de informações armazenadas na sessão do usuário. As informações são representadas na forma de uma Request Component Tree – uma espécie de árvore de componentes.
Apply Request Values. Após montar a árvore de componentes, o JSF percorre cada componente e solicita que cada um obtenha para si os dados relevantes, a partir dos parâmetros da requisição – é como se cada componente se atualizasse com valores contidos na requisição.
...