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.
Para clarificar melhor o enquadramento da especificação JSF, há que considerar que o 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).
JSF | Struts | |
Tipo | Component framework | Action framework |
Orientado a | Componente | Página |
Modelo HTTP | Implícito (alto nível) | Explícito (baixo nível) |
Ideal para | Web app, backoffice (tarefa) | Website, intranet (informação) |
Palavras-chave | CRUD, 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, html, ui 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…