Parâmetros com a extensão Demoiselle-JSF
Uma funcionalidade muito útil na extensão JSF do Demoiselle 2 é a injeção de parâmetros. Ao invés de fazer malabarismo através FacesContext para obter informações dos escopos request e session, o Demoiselle 2 oferece uma funcionalidade que faz automaticamente as devidas conversões. Se você não conhece, fique à par desta facilidade.
Ao invés gastar parágrafos explicando o funcionamento, achei melhor mostrar o código. Criei uma página index.xhtml que contém apenas links com passagem de parâmetros utilizando tags do JSF 2.
<h:link value="Link 1"> <f:param name="param1" value="Uma frase qualquer" /> </h:link> <h:link value="Link 2"> <f:param name="param2" value="1" /> </h:link>
No primeiro link passei um parâmetro literal, no segundo um numeral para testar a conversão automática de tipos. Estes parâmetros serão enviados para a própria página via URL. Criei a classe MyManagedBean para auxiliar o funcionamento da tela, como geralmente acontece na vida real:
@RequestScoped
@ViewController
public class MyManagedBean {
@Inject
private Parameter<String> param1;
@Inject
@SessionScoped
@Name("param2")
private Parameter<Long> p2;
public String getParam1() {
return param1.getValue();
}
public Long getParam2() {
return p2.getValue();
}
}
Como a classe possui o escopo request, à cada nova requisição o objeto será recriado e seu estado será perdido. Existem dois atributos, param1 e p2 que são injetados pelo Demoiselle 2. O primeiro atributo espera um valor do tipo literal, o segundo um valor numérico. O nome do primeiro atributo coincide com o nome do parâmetro, mas o segundo não. Por isso p2 foi nomeado como “param2″ pela anotação @Name do Demoiselle. Criei dois métodos assessores que retornam os valores dos parâmetros.
O atributo p2 foi marcado com a anotação @SessionScoped. Neste caso o parâmetro “param2″ será armazenado na sessão e depois será injetado em MyManagedBean. Caso o parâmetro “param2″ não seja submetido pela tela, o mecanismo buscará a informação no escopo de sessão. Como o param1 não define escopo, o valor será obtido através do escopo de requisição e armazenado em cache para só então ser injetado no atributo. Se você não quiser usar o cache, anote-o com @RequestScoped.
Modifiquei o arquivo index.xhtml para obter e imprimir os atributos na tela. O código-fonte ficou assim:
<html xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html">
<f:view contentType="text/html" />
<h:body>
<h:panelGrid columns="2">
<h:link value="Link 1">
<f:param name="param1" value="Uma frase qualquer" />
</h:link>
<h:outputText value="#{myManagedBean.param1}" />
<h:link value="Link 2">
<f:param name="param2" value="1" />
</h:link>
<h:outputText value="#{myManagedBean.param2}" />
</h:panelGrid>
</h:body>
</html>
A expressão #{myManagedBean.param1} invoca o método assessor do bean gerenciado. Por fim, implantei a aplicação no servidor JBoss AS 6.0.0.Final para testar. Ao acessar a aplicação, a visão inicial é esta:
Acessei o Link 1, que submete o valor “Uma frase qualquer”.
Depois acessei o Link 2, que submete o valor “1″. O valor da requisição anterior foi perdido, pois estava armazenado no bean gerenciado, que é recriado à cada requisição.
Ao acessar novamente o Link 1 o valor submetido pelo Link 2 não é perdido, pois ele foi armazenado no escopo de sessão.
Passei parâmetros diretamente via URL para serem renderizados na tela.
Para quem quiser experimentar, disponibilizei a aplicação de exemplo neste repositório Subversion aqui. Viu como é fácil? Mas se mesmo assim você quiser fazer da forma antiga, fique à vontade. O importante é ter opções!
Filed under: Post | 3 Comments
Tags:Demoiselle, Software Livre












Ótima dica!
Precisei disso no Demoiselle 1 e infelizmente tive que fazer pelo jeito mais difícil.
Muito bom. Estava usando manipulando o FacesContext, vi dessa forma e vou informar aos outros membros da equipe, sobre esta possibilidade.