JSF2
Autor: Sandoval | Publicado: 2012-12-19T15:03:00-08:00







A versão 2 do Java Server Faces é significativamente melhor do que a versão 1 em vários aspectos. Trazendo, sobretudo, conceitos que foram incluídos anteriormente no JBoss Seam, a nova especificação possui inúmeras vantagens que facilitam a vida do desenvolvedor.

Vamos a um levantamento delas:

Mudanças do Core do JSF

Anotações nas classes substituíram várias entradas no&nbsp;faces-config.xml. Exemplos:
Managed Bean:&nbsp;@ManagedBean. Exemplo:


Antes (jsf 1.x):






1&lt;managed-bean&gt;




2&nbsp;&nbsp;&nbsp;&lt;managed-bean-name&gt;carroBean&lt;/managed-bean-name&gt;




3&nbsp;&nbsp;&nbsp;&lt;managed-bean-class&gt;br.com.projeto.bean.CarroBean&lt;/managed-bean-class&gt;




4&nbsp;&nbsp;&nbsp;&lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;




5&lt;/managed-bean&gt;







Agora (jsf 2):






1@ManagedBean




2public&nbsp;class&nbsp;CarroBean {




3&nbsp;




4}







Converter:&nbsp;@FacesConverter. Exemplo:


Antes (jsf 1.x):






1&lt;converter&gt;




2&nbsp;&nbsp;&nbsp;&lt;converter-id&gt;converter.ConversorDeCpf&lt;/converter-id&gt;




3&nbsp;&nbsp;&nbsp;&lt;converter-class&gt;br.com.projeto.converter.ConversorDeCpf&lt;/converter-class&gt;




4&lt;/converter&gt;







Agora (jsf 2):






1@FacesConverter("converter.conversorDeCpf")




2public&nbsp;class&nbsp;ConversorDeCpf&nbsp;implements&nbsp;Converter {




3&nbsp;




4}







Validator:&nbsp;@FacesValidator. Exemplo:


Antes (jsf 1.x):






1&lt;validator&gt;




2&nbsp;&nbsp;&nbsp;&lt;validator-id&gt;validator.validadorDeCpf&lt;/validator-id&gt;




3&nbsp;&nbsp;&nbsp;&lt;validator-class&gt;br.uece.projeto.validator.ValidadorDeCpf&lt;/validator-class&gt;




4&lt;/validator&gt;







Agora (jsf 2):






1@FacesValidator("validator.validadorDeCpf")




2public&nbsp;class&nbsp;ValidadorDeCpf&nbsp;implements&nbsp;Validator {




3&nbsp;




4}







Podem ser usados nomes default. Por exemplo: se a classe que possui a anotação&nbsp;@ManagedBean&nbsp;se chama&nbsp;pacote1.pacote2.MeuBean, você pode usar&nbsp;#{meuBean.atributo}&nbsp;no código;
O escopo&nbsp;view&nbsp;foi adicionado. A ideia é manter determinados dados enquanto o usuário não mudar de tela. As instâncias dos managed beans em escopo view são eliminadas somente quando há uma navegação entre telas;
Managed Beans possuem escopo&nbsp;request&nbsp;por padrão
Para especificar escopo use&nbsp;@RequestScoped,&nbsp;@ViewScoped,&nbsp;@SessionScoped&nbsp;e@ApplicationScoped&nbsp;nos Managed Beans.


Por padrão, a instância de um managed bean em escopo&nbsp;application&nbsp;é criada no momento em que ela é usada pela primeira vez. Podemos alterar esse comportamento, fazendo com que essa instância seja criada quando a aplicação é inicializada. Basta acrescentar a propriedade&nbsp;eager&nbsp;com o valor&nbsp;true&nbsp;na anotação @ManagedBean;
Novos botões &lt;h:button /&gt; e &lt;h:link /&gt;  realizam requisições HTTP do tipo GET. As URLs das requisições são geradas pelo JSF a partir do atributo&nbsp;outcome. Não devem ser utilizados para submissão de formulários;
Novo componente &lt;h:outputFormat /&gt;. Permite diversos tipos de formatação do texto que será exibido. Exemplo:







1&lt;h:outputFormat&nbsp;value="Preço do carro {0}: R$ {1}"&gt;




2&nbsp;&nbsp;&nbsp;&lt;f:param&nbsp;value="#{carroBean.carro.nome}"/&gt;




3&nbsp;&nbsp;&nbsp;&lt;f:param&nbsp;value="#{carroBean.carro.preco}"/&gt;




4&lt;/h:outputFormat&gt;







Podemos alterar o comportamento padrão do JSF, fazendo com que ele considere o conteúdo de uma caixa de texto não preenchida como&nbsp;null. Esse comportamento é obtido acrescentando o seguinte trecho no arquivo web.xml:







1&lt;context-param&gt;




2&nbsp;&nbsp;&nbsp;&lt;param-name&gt;javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL&lt;/param-name&gt;




3&nbsp;&nbsp;&nbsp;&lt;param-value&gt;true&lt;/param-value&gt;




4&lt;/context-param&gt;







Para padronizar a organização dos recursos da sua aplicação e facilitar a internacionalização, o JSF 2 permite a criação de bibliotecas de imagens e o uso das novas tags &lt;h:outputScript /&gt; e &lt;h:outputStylesheet /&gt;:
A criação de uma biblioteca de imagens é simples: adicione um diretório na pasta /resources (na raiz da aplicação). Por exemplo, se criarmos o diretório /resources/carros/ e adicionarmos a imagem golf.png nesse diretório, podemos inseri-la em uma página da seguinte forma:







1&lt;h:graphicImage&nbsp;library="carros"&nbsp;name="golf.png"&nbsp;/&gt;







As tags &lt;h:outputScript /&gt; e &lt;h:outputStylesheet /&gt; devem ser usadas com a notação:







1&lt;h:outputScript&nbsp;name="mascara-carro-brasil.js"&nbsp;library="javascript"target="head"&nbsp;/&gt;




2&lt;h:outputStylesheet&nbsp;name="estilo-carro-brasil.css"&nbsp;library="css"&nbsp;/&gt;





Suporte integrado a facelets
JSF 2 despreza o JSP como linguagem da camada de visão;


Possibilidade de utilizar bookmarking;
Suporte nativo a Ajax;
Suporte nativo a Groovy;
Mais detalhes no debug
Colocando o valor&nbsp;Development&nbsp;na configuração&nbsp;javax.faces.PROJECT_STAGE&nbsp;do&nbsp;web.xml, aparecerão mensagens de erro mais explícitas que antes não eram disparadas na versão 1.x. Exemplo:







1&lt;context-param&gt;




2&nbsp;&nbsp;&nbsp;&lt;param-name&gt;javax.faces.PROJECT_STAGE&lt;/param-name&gt;




3&nbsp;&nbsp;&nbsp;&lt;param-value&gt;Development&lt;/param-value&gt;




4&lt;/context-param&gt;





Não é mais necessário usar regra de navegação (navigation-rule) no faces.config.xml. Basta que o nome da página corresponda à string retornada pela action ou pelo componente;
Exemplo: se a sua página se chama&nbsp;formulario.xhtml&nbsp;e ela está na raiz do conteúdo web, você pode redirecionar para&nbsp;formulario.jsf;


Podemos criar navegações condicionais. Imagine uma aplicação em que os usuários podem escolher o idioma que desejam utilizar. As regras de navegação podem então considerar essa situação através da tag na definição de uma regra de navegação. Veja o exemplo:







01&lt;navigation-rule&gt;




02&nbsp;&nbsp;&nbsp;&lt;from-view-id&gt;/login.xhtml&lt;/from-view-id&gt;




03&nbsp;&nbsp;&nbsp;&lt;navigation-case&gt;




04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;from-outcome&gt;sucesso&lt;/from-outcome&gt;




05&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;if&gt;#{usuarioBean.idioma[’preferencia’] == ’pt-BR’}&lt;/if&gt;




06&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;to-view-id&gt;/home-brasil.xhtml&lt;/to-view-id&gt;




07&nbsp;&nbsp;&nbsp;&lt;/navigation-case&gt;




08&nbsp;&nbsp;&nbsp;&lt;navigation-case&gt;




09&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;from-outcome&gt;sucesso&lt;/from-outcome&gt;




10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;if&gt; #{usuarioBean.idioma[’preferencia’] == ’en-US’}&lt;/if&gt;




11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;to-view-id&gt;/home-internacional.xhtml&lt;/to-view-id&gt;




12&nbsp;&nbsp;&nbsp;&lt;/navigation-case&gt;




13&lt;/navigation-rule&gt;







Você pode usar&nbsp;#{meuBean.meuAtributo}&nbsp;diretamente na página ao invés de&nbsp;&lt;h:outputText value=”#{meuBean.meuAtributo}” /&gt;;
Está mais simples desenvolver componentes. Agora a programação deles está baseada no facelets e não no próprio java, como era antes;
Uma nova abordagem para definir validações. A ideia é declarar as regras de validação nas classes do modelo através de anotações ao invés de inseri-las nos arquivos XHTML que definem as telas. O recurso usado foi o Bean Validation, especificado na&nbsp;JSR 303. As opções são:


AnotaçãoUtilidadeChave no Arquivo properties
@AssertTrueVerifica se uma propriedade booleana possui valor false.{javax.validation.constraints.AssertTrue.message}
@AssertFalseVerifica se uma propriedade booleana possui valor true.{javax.validation.constraints.AssertFalse.message}
@DecimalMaxDefine o valor real máximo que uma propriedade pode armazenar.{javax.validation.constraints.DecimalMax.message}
@DecimalMinDefine o valor real mínimo que uma propriedade pode assumir.{javax.validation.constraints.DecimalMin.message}
@DigitsDefine a quantidade máxima de dígitos da parte inteira (através do atributo integer) ou da parte fracionária (através do atributo fraction) de um número.{javax.validation.constraints.Digits.message}
@FutureVerifica se uma data é posterior ao instante atual.{javax.validation.constraints.Future.message}
@MaxDefine o valor inteiro máximo que uma propriedade pode assumir.{javax.validation.constraints.Max.message}
@MinDefine o valor inteiro mínimo que uma propriedade pode assumir.{javax.validation.constraints.Min.message}
@NotNullVerifica se o valor de uma propriedade não é null.{javax.validation.constraints.NotNull.message}
@NullVerifica se o valor de uma propriedade é null.v{javax.validation.constraints.Null.message}
@PastVerifica se uma data é anterior ao instante atual.{javax.validation.constraints.Past.message}
@PatternVerifica se o valor de uma propriedade respeita uma expressão regular.{javax.validation.constraints.Pattern.message}
@SizeDefine os tamanhos mínimo (através do atributo min) e máximo (através do atributo max) para uma Collection, array ou String.{javax.validation.constraints.Size.message}


Tabela 1: anotações do Bean Validator.

É possível desabilitar a validação de uma propriedade com anotação em uma ou mais telas específicas com a tag &lt;f:validateBean&gt; e o atributo&nbsp;disable&nbsp;com o valor&nbsp;true. Exemplo:








1&lt;h:inputText&nbsp;value="#{carroBean.carro.nome}"&gt;






2&nbsp;&nbsp;&nbsp;&lt;f:validateBean&nbsp;disabled="true"&nbsp;/&gt;




3&lt;/h:inputText&gt;







As mensagens do bean validation podem ser personalizadas. Exemplo:&nbsp;@NotNull (message =”O nome não pode ser nulo “)
Nesse caso estamos usando uma mensagem fixa, não dando suporte para internacionalização;


Também é possível mapear a mensagem da annotation a uma chave de um arquivo resource-bundle. Exemplo:&nbsp;@NotNull(message=”{br.com.projeto.funcionario.nome}”)
Essa solução é recomendada quando queremos usar uma mensagem personalizada e a chave deve ser inserida em um arquivo chamado ValidationMessages.properties, que deve ser colocado no classpath da aplicação;


Outra opção é alterar as mensagens padrões dos validadores do bean validation. Nesse caso não precisamos usar o atributo&nbsp;message&nbsp;da Annotation. Basta usar as chaves que estão na tabela 1 publicada no mesmo arquivo comentado no item anterior.



Mudanças do Facelets

Suas páginas devem terminar com .xhtml;
Use&nbsp;&lt;h:head&gt;,&nbsp;&lt;h:body&gt;&nbsp;e&nbsp;&lt;h:form&gt;;
Em geral, não é necessário usar mais&nbsp;&lt;f:view&gt;;