Parâmetros com a extensão Demoiselle-JSF

26abr11

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:

Estado inicial

Acessei o Link 1, que submete o valor “Uma frase qualquer”.

Após a primeira submissão

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.

Após a segunda submissã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.

Após a terceira submissão

Passei parâmetros diretamente via URL para serem renderizados na tela.

Passagem de parâmetros via URL

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!

Anúncios


3 Responses to “Parâmetros com a extensão Demoiselle-JSF”

  1. 1 Rafael Bomfim

    Ótima dica!
    Precisei disso no Demoiselle 1 e infelizmente tive que fazer pelo jeito mais difícil.

  2. 2 Leonardo

    Muito bom. Estava usando manipulando o FacesContext, vi dessa forma e vou informar aos outros membros da equipe, sobre esta possibilidade.


  1. 1 Parâmetros com a extensão Demoiselle-JSF « Demoiselle Framework's Blog

E aí, o que você achou? Comenta aí...

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s