Usando um Map<String, Object> para armazenar os parâmetros de um Managed Bean

Antes de escrever a segunda parte do artigo, vou apresentar o código do managed bean mencionado na seção de comentários do post anterior.

Na ocasião, o leitor Alessandro questionou os motivos de passar para os métodos create() e update() dos services um Map<String, Object> contendo os dados a serem persistidos ao invés da própria entidade. Respondi então que um desses motivos era a existência de um managed bean cujos atributos mapeados para a página JSF correspondente estavam contidos em um Map<String, Object> – onde a key é o nome do atributo e o value, seu valor – e assim seria mais fácil passá-lo para os services.

Sem mais delongas, segue o código (comentários javadoc removidos para torná-lo mais sucinto).

public abstract class ManagedBean {
	private Map<String, Object> parametros = new HashMap<String, Object>();
	
	protected final void definirParametros(String... nomesParametros) {
		for (String nome: nomesParametros) {
			parametros.put(nome, null);
		}
	}
	
	protected final void limparParametros() {
		for (String parametro: parametros.keySet()) {
			parametros.put(parametro, null);
		}
	}
	
	public final Map<String, Object> getParametros() {
		return parametros;
	}

	public final void setParametros(Map<String, Object> parametros) {
		this.parametros = parametros;
	}

	// Outros métodos omitidos.
}

Como usá-lo? Suponha que estamos construindo um managed bean responsável pelas operações de login do usuário (que contém os campos nome e senha). Ele pode ser implementado escrevendo-se o código abaixo:

public class LoginBean extends ManagedBean {
	public LoginBean() {
		// Definindo dois campos para a página de login.
		super.definirParametros("login", "senha");
	}

	public String efetuarLogin() {
		// A classe ApplicationServiceFactory foi apresentada no post anterior.
		Usuario usuario = ApplicationServiceFactory
			// Obtendo o service de usuário, que realizará o login.
			.getUsuarioService()
			// Passando diretamente o Map contendo os campos.
			.efetuarLogin(super.getParametros());

		// Restante do código omitido.
	}
}

Na página JSF correspondente a esse managed bean teríamos controles referenciando os parâmetros da seguinte forma:

<h:inputText value="#{loginBean.parametros['login']}" />
<h:inputText value="#{loginBean.parametros['senha']}" />

O ganho com essa abordagem aparece principalmente quando uma página possui muitos campos. Assim não precisa ficar replicando os atributos da entidade no managed bean, e nem mesmo usar a própria entidade - e se ver obrigado a usar getters e setters que expõem aqueles atributos que não seriam interessante expor. Sem contar que essa forma abre espaço para usar reflection para automatizar a passagem dos valores dos atributos para a entidade correspondente.

Quaisquer sugestões ou dúvidas podem ser apresentadas na seção de comentários.

Até lá!

Anúncios
Usando um Map<String, Object> para armazenar os parâmetros de um Managed Bean

3 comentários sobre “Usando um Map<String, Object> para armazenar os parâmetros de um Managed Bean

  1. Ronualdo Augusto disse:

    Muito interessante a abordagem, acho que inclusive a gente pode utilizar isso pra diminuir o acoplamento entre a camada de visao e a de negócio.

    ps. Po Tarso, não sabia desse seu Blog. Ta de parabéns.

  2. Loco On Line disse:

    Opa, blz? Se ta fazendo isso usando JSF 1.X ou 2.0?

    Estou estudando o 2.0 e estou tendo serias dificuldades em trocar as implementações da 1.X para a 2.0.

    Consegue refazer o tópico para a 2.0?

    Abraços.

Deixe um comentário

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 )

Foto do Google+

Você está comentando utilizando sua conta Google+. 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 )

Conectando a %s