Struts2 - Como Preencher, apartir da página .jsp, uma Collection na classe de action Java

Olá Galera!

bem, eu sei como pegar uma Collection na classe Java e criar uma tabela na página através da tag <s:iterator>
O meu problema não é esse. A questão é como preencher uma Collectiona partir da página.

Por exemplo:

Tenho que dar a possibilidade de adicionar vários Clientes a um Processo. Entao penso em colocar la na tela um botao onde o cara aperta e seleciona um Cliente. Ao selecionar um, o botao ainda pode ser clicado e entao o cara pode add mais um Cliente. A questão é como pegar esse número não pré-definido de Clientes e preencher uma Collection<Cliente> na minha classe de Action

desde ja,

valeu galera!

Utilize o converter do struts 2.

Duas formas, a primeira é com HashMap, você vai precisar de um índice para colocar no seu campo cliente então o name ficaria assim: name=“cliente[0]” e assim por diante, depois basta dar o get da propriedade cliente ( que seria um HashMap, como ja disse) e rodar o Map com Iterator na action.

Não sei como você está fazendo, se é com javascript, mas nesse caso o indice é necessário, então caso seja o javascript que sempre adicione um campo novo para o usuário colocar o cliente, então você tem que se atentar para trazer o index corretamente.

A outra forma é utilizar um List. Nesse caso não precisa de indice e basta os campos possuirem o mesmo nome.

pow Vinicius,

acho q nao entendi bem a tua idéia…
eu fiz o seguinte:

  • Na classe de action tenho o get e set para a Collection: public Collection<Cliente> getClientes(){…}
  • Na página jsp coloquei: <s:textfield name=“clientes[0].nome” />

é +/- isso que você falou?

valeu!

Faz diferente.

Na classe cria get e set para a segunte propriedade:

private Map<Integer, String> clientes = new HashMap<Integer, String>();

no JSP você coloca assim:

<s:textfield name="clientes[0]" /> 
<s:textfield name="clientes[1]" /> 
<s:textfield name="clientes[2]" /> 

Depois, quando você der o Submit, você roda o Iterator assim:

Iterator<Integer> it = getClientes().keySet().iterator();
    while (it.hasNext()) {   
        Integer key = Integer.parseInt(it.next().toString());
        String nomeCliente = getClientes().get(key);
    }

Tenta assim, blz? ai depois você fala se isso serve para o que você quer.

Opa Vinicius,

Nao rolou nao cara… Ele nem entra no método de SET. Ve ai como eu coloquei:

JSP:

	&lt;s:form action="estudo" method="POST"&gt;
		&lt;s:textfield theme="simple" name="pessoas[0]" value="Danilo" /&gt; 
		&lt;s:textfield theme="simple" name="pessoas[1]" value="Elaine" /&gt; 
		&lt;s:textfield theme="simple" name="pessoas[2]" value="Eliane" /&gt; 
		&lt;s:textfield theme="simple" name="pessoas[3]" value="Alexandre" /&gt; 
		&lt;s:submit /&gt;
	&lt;/s:form&gt;

Classe de Action:

	private Collection&lt;PessoaFisica&gt; pessoas;
	
	public Map&lt;Integer, PessoaFisica&gt; getPessoas() {
		Map&lt;Integer, PessoaFisica&gt; pessoas = new HashMap&lt;Integer, PessoaFisica&gt;();
		int indice = 0;
		for (Iterator&lt;PessoaFisica&gt; iterator = this.pessoas.iterator(); iterator.hasNext();) {
			pessoas.put(indice, iterator.next());
			indice += 1;
		}
		return pessoas;
	}
	
	public void setPessoas(Map&lt;Integer, String&gt; pessoas) {
		Collection&lt;PessoaFisica&gt; pessoasList = new HashSet&lt;PessoaFisica&gt;();
		this.pessoas = pessoasList;
	}

Valeu,…

Mas desse jeito não vai funcionar mesmo.
Você não fez exatamente o que eu falei.

Vamos lá,

Cria a propriedade

private Map<Integer, String> pessoas = new HashMap<Integer, String>(); 

ai cria o get e o set simples mesmo, não modifique.

Opa Vinicius,

é isso mesmo. Assim fuciona… a questão é que gostaria de transitar outros atributos e não apenas um (na String). A não ser que eu faça uma gambi básica, por exemplo, na página, antes de submeter o form, eu trate via javascript, por exemplo, a String do Map para ser algo do tipo “nome;idade;sexo”, isso no caso de eu querer passar mais coisas além do nome. Daí lá no método set eu trataria a String para criar o objeto.

o q achas?

bom, gambi por gambi, acho melhor criar um hash pra cada propriedade que você quiser. Depois é só pegar pelo key