Vincular o value de um campo de formulário JSF a uma casa de um vetor ao invés de a uma variável

Olá!

Estou com o problema pré-apresentado acima: eu tenho um formulário com muitos campos. Consequentemente eu gostaria de achar uma forma mais fácil de efetuar o cadastro dos dados. Uma forma mais tranquila do que utilizar 30 variáveis com seus 30 get e 30 set respectivos. Gostaria de minimizar pelo menos a questão das variáveis utilizando um vetor. Ou seja, eu um campo do tipo:

<h:inputText value="#{bean.value}" />

Eu gostaria de saber se é possível fazer algo como:

<h:inputText value="#{bean.vetor[3]}" />[/code] ou [code]<h:inputText value="#{bean.vetor[2]}" />

Alguém sabe se é possível fazer algo deste tipo?!

Use um Map<String, Object>!

&lt;h:inputText value="#{bean.campos['login']}" /&gt; &lt;h:inputText value="#{bean.campos['senha']}" /&gt;Abraços

Hum! Esta é uma boa ideia! Eu acho que nunca cheguei a usar explicitamente o Map. Aliás, isso é uma interface, correto?! HashMap implementa tal interface né?! Seria essa a ideia?! Usar algo como uma tabela hash?! Seria possível disponibilizar algum trecho de código?!

Desde já, muito obrigado pela colaboração!

Caraca, eu tava pra postar essa dúvida hoje mesmo!
Adorei a sugestão do Map, vou implementa-la e ver se funciona.

Abraços!

[quote=Valdemar Neto]Hum! Esta é uma boa ideia! Eu acho que nunca cheguei a usar explicitamente o Map. Aliás, isso é uma interface, correto?! HashMap implementa tal interface né?! Seria essa a ideia?! Usar algo como uma tabela hash?! Seria possível disponibilizar algum trecho de código?!

Desde já, muito obrigado pela colaboração![/quote]
Uma idéia é fazer seus managed beans herdarem da seguinte classe:

[code]public abstract class MappedBean {
private Map<String, Object> parametros;

protected MappedBean(String... campos) {
    parametros = new HashMap<String, Object>();

    for (String campo: campos) {
        parametros.put(campo, null);
    }
}

public Map<String, Object> getParametros() {
    return this.parametros;
}

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

}[/code]
Aí seu managed bean de usuários poderia ficar assim:

[code]public class UsuarioBean extends MappedBean {
public UsuarioBean() {
super(“login”, “senha”);
}

// Action 1

// Action 2

}[/code]
Aí nas páginas é só referenciar assim:

<h:inputText value="#{bean.parametros['login']}" /> <h:inputSecret value="#{bean.parametros['senha']}" />
Mas atenção: procurem verificar as desvantagens de utilizar essa solução.

Cara, desde já agradeço muito pela ajuda porque realmente esta é uma abordagem de solucionar o problema que eu não pensaria.
Mas eu não sei se entendi bem como funciona esta solução ou se na verdade ela não se aplica exatamente ao meu contexto.

O meu contexto é o seguinte: (acho que eu não expliquei muito claramente).

Eu tenho uma camada de apresentação (ou interface ou visão - sinônimos no meu contexto) que efetua um cadastro. Este cadastro possui cerca de 30 campos. Mas cada um destes campos, na lógica do negócio, funcionam como atributos de um determinado objeto. No entanto, eu não gostaria de utilizar 30 variáveis diferentes, uma para cada campo. Gostaria de vincular por exemplo:

Nome ---------> vetor[0]
Endereço ---------> vetor[1]
Telefone ----------> vetor[2]
.
.
.

Porque a forma como você apresentou aí eu entendi que você estava fazendo uma associação do tipo: vetor[0] -------------------> vetor[1]. Algo mais como
um registro de um banco de dados, algo assim. Eu não quero algo do tipo: dado um login(id), a senha é devolvida. Eu queria algo do tipo:

<h:inputText value="#{bean.vetor[0]}".

De qualquer forma talvez eu que não consegui visualizar. Se eu fizer algo do tipo:


public class UsuarioBean extends MappedBean {   
    public UsuarioBean() {   
        super("nome", vetor[0]);   
    }   
  

Esta referência vai funcionar?!

De qualquer forma, obrigado pela ideia!

[quote=Valdemar Neto]Porque a forma como você apresentou aí eu entendi que você estava fazendo uma associação do tipo: vetor[0] -------------------> vetor[1]. Algo mais como
um registro de um banco de dados, algo assim. Eu não quero algo do tipo: dado um login(id), a senha é devolvida.[/quote]
Não cara, veja só. A solução que você precisa, conforme você falou, é a seguinte:

Nome ---------> vetor[0]
Endereço ---------> vetor[1]
Telefone ----------> vetor[2]

Ou seja, você precisa associar um atributo a um elemento de um vetor.
A solução que eu propus é a seguinte:

Nome ---------> parametros[‘nome’]
Endereço ---------> parametros[‘endereco’]
Telefone ----------> parametros[‘telefone’]

Ou seja, você associa um atributo a um elemento de um Map. Para obter o valor que o usuário digitou, use no managed bean:
Object valor = parametros.get(“nomeDoCampo”);

[quote=Valdemar Neto]De qualquer forma talvez eu que não consegui visualizar. Se eu fizer algo do tipo:


public class UsuarioBean extends MappedBean {   
    public UsuarioBean() {   
        super("nome", vetor[0]);   
    }   
  

Esta referência vai funcionar?![/quote]
Não, não funciona. Como já falei, a solução proposta substitui a associação de um atributo a um índice numérico, oferecendo a possibilidade de associar um atributo a um nome.

Qualquer dúvida, posta aí.