BT

JSF 2.2: Novidades para desenvolvimento HTML5

por Charles Humble , traduzido por Marcelo Cenerino em 10 Jul 2013 |

JSF 2.2, recém lançado no Java EE 7, traz atualizações importantes para desenvolvedores que querem utilizar HTML5 em aplicações JSF, em particular a habilidade de informar atributos HTML de forma transparente.

Entre as diversas novidades no HTML5, estão uma série de novos atributos para elementos já existentes. O atributo type de elementos input, por exemplo, agora suporta valores como text, search, email, url, tel, range, number e date. Existem também conjuntos de atributos de dados customizados cuja proposta é adicionar pequenas quantidades de dados aos elementos HTML. Esses dados não são renderizados, mas podem ser lidos usando JavaScript.

Para um framework baseado em componentes como o JSF, isso pode ser um problema, visto que os componentes JSF existentes precisariam ser atualizados para reconhecer os novos atributos. Para componentes que precisam explicitamente suportar tais atributos, uma atualização faz sentido. Mas em muitos casos, um componente não precisa fazer nada além de incluir o novo atributo no HTML que produz. Os atributos pass-through do JSF 2.2 fazem exatamente isso.

Atributos pass-through

A partir de um Facelet, os atributos pass-through podem ser utilizados de três maneiras:

1. Usando um atributo do namespace "http://java.sun.com/jsf/passthrough" na tag do componente:

<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:h="http://java.sun.com/jsf/html"
   xmlns:p="http://java.sun.com/jsf/passthrough">
   <h:form>
       <h:inputText value="#{bean.value}" p:placeholder="Enter text"/>
   </h:form>
</html>

2. Usando a tag f:passThroughAttribute para informar apenas um atributo:

<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:h="http://java.sun.com/jsf/html"
   xmlns:f="http://java.sun.com/jsf/core">
   <h:form>
       <h:inputText value="#{bean.value}" >
           <f:passThroughAttribute name="placeholder" value="Enter text" />
       </h:outputText>
   </h:form> 
</html>

3. Usando a tag f:passThroughAttributes para informar múltiplos atributos:

<h:outputText value="Something" >
   <f:passThroughAttributes value="#{bean.multipleAttributes}" />
</h:outputText>

A expressão #{bean.multipleAttributes} no atributo value refere-se a um objeto Map<String, Object>. Os valores informados nesse atributo pode ser tanto literais quanto expressões.

Com a Expression Language 3 (que também faz parte do Java EE 7), múltiplos atributos podem ser definidos diretamente usando uma expressão EL:

<h:outputText value="Something" >
   <f:passThroughAttributes value="{"one":1, "two":2, "three":3}" />
</h:outputText>

Como resultado dessas mudanças, os desenvolvedores poderão agora escrever a view JSF utilizando HTML puro, uma vantagem frequentemente citada por frameworks rivais como o Wicket.

No lado servidor, os atributos podem ser obtidos ou informados através dos novos métodos getPassThroughAttributes() e getPassThroughAttributes(boolean create) na classe UIComponent (a classe base de todos os componentes JSF):

UIComponent component = new SomeComponent();
Map passThrough = component.getPassThroughAttributes();
passThrough.put("placeholder", "Enter text");

Além da nova funcionalidade pass-through, o JSF 2.2 introduz várias outras melhorias, incluindo o Faces Flow e as Stateless Views.

Faces Flow

O Faces Flow é inspirado no Task Flows do ADF e no Spring Web Flow. Fornece suporte direto para fluxos que levam o usuário através de um conjunto de páginas e outros casos de uso relacionados. Um fluxo é definido como uma sequência de "nós", onde um nó pode ser:

  • Uma view: Qualquer página JSF da aplicação;
  • Uma chamada de método: Invocação da lógica da aplicação a partir de um fluxo via EL (Expression Language);
  • Um ponto de decisão: Decisões de navegação no fluxo baseadas em ELs booleanas;
  • Uma chamada de fluxo: Invoca um outro fluxo com parâmetros e recebe valores de retorno;
  • Um retorno de fluxo: Retorna para o fluxo invocador.

Os nós definem os pontos de entrada e saída de um fluxo.

Duas novas anotações foram acrescentadas:

  • @FlowScoped é um escopo CDI que define o escopo para um bean dentro do fluxo especificado. Isso faz com que a ativação/passivação do bean seja feita automaticamente quando o escopo é acessado/liberado.
  • @FlowDefinition é uma anotação em nível de classe que permite que a definição do fluxo seja feita com a API "fluente" da classe FlowBuilder.

Por fim, um novo objeto EL, o #{flowScope}, foi introduzido para armazenamento local de dados do fluxo. Esse objeto é mapeado para facesContext.getApplication().getFlowHandler().getCurrentFlowScope().

Stateless Views

Muitos frameworks web são stateful (com manutenção de estado), particularmente os baseados em componentes. Mas existem vantagens em não manter estado. Talvez a mais importante é evitar a necessidade de replicar estado através de múltiplos nós em um cluster, ou usar sticky-sessions para garantir que todas as requisições retornem ao mesmo nó de onde originou a conversação.

Há também outras vantagens comumente citadas, mas que normalmente são menos evidentes. Desempenho e consumo de memória podem ser um problema para os frameworks stateful, mas na prática tendem a ser triviais para a maioria das aplicações corporativas. De fato existe certo impacto no desempenho das aplicações ao aplicar e salvar estado, ainda que o Partial State Saving do JSF 2.x (em que apenas mudanças no estado são atualizadas), seja bastante eficiente e utilize uma quantidade de memória bem pequena para armazenar estado.

A implementação stateless do JSF é objetiva. O TagHandler para o componente <f:view> agora tem o atributo booleano transient, passado para o método UIViewRoot#setTransient. Se a página estiver configurada para ser transiente, o StateManager do JSF não armazenará nenhum dado relacionado àquela view. E durante a fase de restauração da view, a view é criada sem nenhum estado aplicado a ela.


A versão 2.2 do JSF traz várias outras mudanças menores. O artigo de Arjam Tijms no site J-Development inclui outros detalhes.

Olá visitante

Você precisa cadastrar-se no InfoQ Brasil ou para enviar comentários. Há muitas vantagens em se cadastrar.

Obtenha o máximo da experiência do InfoQ Brasil.

Dê sua opinião

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão
Comentários da comunidade

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

Dê sua opinião

Conteúdo educacional

Feedback geral
Bugs
Publicidade
Editorial
InfoQ Brasil e todo o seu conteúdo: todos os direitos reservados. © 2006-2014 C4Media Inc.
Política de privacidade
BT