JSF – Parte 1

O JSF (JavaServer Faces) é uma especificação para criar interfaces gráficas de aplicações web. É um standard do mundo Java EE, atualmente na versão 2.2. A ideia base é, após alguns anos de evolução (esta especificação nasceu em 2004), sistematizar o que as interfaces web têm em comum, apoiando o programador nesse sentido. Com relativa facilidade permite desenvolver interfaces web ricas e interativas (cujas aplicações são denominadas RIA – Rich Internet Application). É server-side e totalmente orientada ao componente: para além de uma série de componentes (abstrações dos componentes HTML), prevê validadores, gestão de estado, conversores, modelo de eventos, etc. Entenda-se por componente (UI) um “pedaço” reutilizável da interface (ex: dropdown box).

Além disso, o JSF, considera capacidades de internacionalização, templating, acessibilidade, navegação, AJAX, entre outras. É de alto nível, pelo que o modelo HTTP, servlets e outros conceitos da página são implícitos.

JSF: arquitectura

Para clarificar melhor o enquadramento da especificação JSF, há que considerar que JSF não é:

  • Uma framework ou biblioteca
  • Uma alternativa ao JSP

O JSF é:

  • Uma especificação/standard
  • Uma alternativa ao Struts (embora com objetivos e filosofias diferentes)

Sendo o JSF “apenas” uma especificação, as suas duas implementações mais comuns (essas sim, as frameworks) são o Apache MyFaces e o Oracle Mojarra. Tanto o JSF como o Struts pertencem ao mundo Java e ambos apoiam o desenvolvimento de interfaces gráficas web. A maior diferença é que o JSF foi pensado para aplicações e o Struts para sites. Apesar do JSF poder servir para websites, esse não é o seu uso mais comum (exceto quando se tratam de sites muito orientados à tarefa, com necessidades de componentes ricos e variados e diversas interações AJAX).

 JSFStruts
TipoComponent frameworkAction framework
Orientado aComponentePágina
Modelo HTTPImplícito (alto nível)Explícito (baixo nível)
Ideal paraWeb app, backoffice (tarefa)Website, intranet (informação)
Palavras-chaveCRUD, AJAX, interagir, fazer, RIA, SPI, controlos, funcionalidade, etc.Navegar, consultar, permalink, refresh, back, ler, etc.

O facto de ser server-side resulta em que os componentes sejam codificados numa linguagem, neste caso markup XHTML (facelets), que depois é convertida para HTML, ao ir para o cliente, o browser. O conceito de facelet é importante na medida em que substitui os já velhos JSP, tornando-os obsoletos. Sendo MVC, não é suposto haver código Java nesses facelets.

<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN'
   'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml'
      xmlns:f='http://java.sun.com/jsf/core'
      xmlns:h='http://java.sun.com/jsf/html'>
   <h:head>
 
   </h:head>
   <body>
      <h:inputSecret redisplay='false' value='#{utilizadorBean.password}' />
      <h:outputLink id='link1' value='http://www.google.com/search'>
         <f:param name='q' value='#{utilizadorBean.musicaFavorita' />
         <h:outputText value='Pesquisar no Google' />
      </h:outputLink>
   </body>
</html>

O JSF considera as taglibs de base: core, htmlui e composite (veremos concretamente o que são num dos próximos artigo da série). É facilmente extensível com as chamadas “bibliotecas de componentes”, entre as quais constam o PrimeFaces, o RichFaces e o ICEFaces. O PrimeFaces é uma excelente aposta, dado que contém mais de 100 componentes, com imensas funcionalidades, entre as quais excelentes capacidades AJAX e skinning (mais de 30 temas). Entre os componentes, está o calendário, o rich text editor, o wizard, o menu, a toolbar, a tabela, a árvore, etc. Inclui a biblioteca jQuery assim como a Atmosphere (PrimePush).

Existe ainda um grande suporte por parte da comunidade, desde fóruns, demos, samples, livros, etc. Os componentes suportam o mundo mobile.

Assim em resumo, e de forma a aguçar a curiosidade do leitor para os próximos artigos sobre esta especificação, as principais vantagens do JSF resumem-se principalmente a:

  • Componentes fáceis de usar e muito parametrizáveis, reduzindo assim a necessidade de recorrermos a JavaScript;
  • Fácil criação de componentes personalizados (embora seja raramente necessário, dada a oferta de bibliotecas de componentes);
  • Fácil transferência de dados entre aplicação e UI;
  • Fácil gestão do estado da página (alta abstração);
  • Modelo de eventos muito simples;
  • Possibilidade de uso de anotações Java em vez de ficheiros XML para configuração (mais contextualidade e encapsulação);
  • Convention over configuration: muita coisa não precisa de ser configurada, assumindo valores por omissão.

Estas vantagens serão entendidas mais facilmente nos próximos artigos. Em conclusão, é certo que inicialmente é estranho lidar com o facto de conceitos HTTP/HTML serem tão abstraídos e de alto nível. Mas após vencer este pequeno desafio, a velocidade de desenvolvimento aumenta largamente e o leitor dará por si a criar aplicações muito complexas em relativamente pouco tempo, principalmente quando começar a criar e reutilizar os seus próprios componentes…

Publicado na edição 43 (PDF) da Revista PROGRAMAR.