Valores do form para arraylist

Bom, tenho um form que tem varias vezes um mesmo campo como por exemplo telefone e endereço, tem 5 campos de telefone e 2 de endereço e e eu quero pegar os valores que estão nesses campo e jogar para um arraylist pra depois processar eles no meu controller. Queria que alguem me desse uma luz ae porque não queria usar scriplet pra fazer isso e muito menos assim:

Tel<input type="text" name="clienteTel"/> Tel<input type="text" name="clienteTel"/> Tel<input type="text" name="clienteTel"/> End<input type="text" name="clienteEnd"/> End<input type="text" name="clienteEnd"/>

Dai eu jogo esses valores em um vetor no meu controller e depois passo eles no dao pra poder adicionar no mesmo ID.
Ah, tou usando JSP+SpringMVC pra fazer isso

Obrigado desde já.

É só você receber a lista no controller:

@RequestMapping(value="/teste")
@ResponseBody
public void teste(@RequestParam("endereco") List<String> enderecos) {
   System.out.println(enderecos);
}

E aí no formulário, o name dos inputs fica endereco. Tem algum problema com esta abordagem? Você mencionou que não queria deixar o formulário desta maneira, mas como quer deixar?

Queria saber se daria pra pegar os valores com o jquery por exemplo e colocar numa lista lá e depois jogar essa lista como parametro pro controller.
Meu controller tá assim

@RequestMapping("teste2") public String adiciona(@RequestParam("clienteEnd") List<Contatos> contatos, Contatos cont){ for (int i = 0; i < contatos.size(); i++) { System.out.println(contatos.get(i).getClienteEnd()); cont.setClienteEnd(contatos.get(i).getClienteEnd()); dao.adiciona(cont); } //Mais coisa pra baixo....

Pode ser também.

Javascript:

var data = {
   endereco: ['abc', 'def', 'ghi']
};
					
$.get('teste', data)
   .success(function(data) {
      console.log(data);
   });

Controlador:

@RequestMapping(value="/teste")
@ResponseBody
public String teste(@RequestParam("endereco[]") List<String> enderecos) {
   System.out.println(enderecos);
   return "ok";
}

Hm ;o valeu cara, eu recebo essas duas variaveis que eram pra ir pra mesma lista teria como da um requestparam nas duas por exemplo e mandar pra uma List por exemplo e depois so fazer o for pra poder jogar cada variavel em seu set e tals?

Você pode receber os parâmetros separadamente (usando duas variáveis e anotando com @RequestParam) ou já popular o objeto da maneira que você quer. Algo assim:

@RequestMapping(value="/teste")
@ResponseBody
public void teste(@ModelAttribute Contato contato) {
   System.out.println(contato);
}

public class Contato {
   private List<String> enderecos;
   private List<String> telefones;

   // getters e setters ...
}

E no javascript:

$.ajaxSettings.traditional = true;

var contato = {
   enderecos: ['endereco um', 'endereco dois', 'endereco tres'],
   telefones: ['12345678', '11223344']
   };
						
$.get('teste', contato)
   .success(function(data) {
      console.log(data);
});

Esta configuração (traditional = true) é para o jquery gerar uma url compatível com o spring. Por padrão o jquery faz o seguinte:

minhaurl?enderecos[]=1&enderecos[]=2

Com o traditional = true, estes colchetes não são adicionados na url.

preciso fazer algo semelhante.

quer dizer então que se eu tiver um conjunto de strings no meu bean

private Set<String> tags;

e submeter uma string com os valores separados por vírgula o spring consegue fazer o bind para o meu bean?

Consegue. Acredito que com vírgulas, do modo que você falou, também seja possível. Mas a maneira mais comum, é simplesmente repetir os parâmetros na requisição:

tags=abc&tags=def&tags=ghi

Fiz um teste e realmente dá certo. Quando você repete os parâmetros o broswer automáticamente coloca os valores separados por vírgula, então se você já mandar a string assim dá certo. Tô gostando bastante de trabalhar com o Spring MVC.

Também tou gostando muito de trabalhar com o Spring vou da uma testada aqui, mas muito obrigado Wagner pelas respostas.

Uma coisa que eu não entendi ali foi o seguinte

@RequestMapping(value="/teste") @ResponseBody public void teste(@ModelAttribute Contato contato) { System.out.println(contato); }

Como que eu vou imprimir essa lista ou jogar pro banco sei la? Eu tenho que fazer um for pra percorrer essa lista certo? Mas como que vou fazer ele ?

Você tá persistindo contatos no banco? Tem um DAO pra eles? Depende de como está o seu mapeamento…

Sim tenho um DAO pra eles e tou mandando pro banco, so que como antes eu tava pegando um vetor ou tava jogando numa lista antes eu fazia um for e mandava um por um pro DAO

Vou te colocar meu codigo aqui

Get e Set

private String clienteTel; private List<String> clienteTels; //Get e Set

Dao

stmt.setString(2, contato.getClienteTel());

Controller

@RequestMapping(value="/teste") @ResponseBody public void teste(@ModelAttribute Contato contato) { dao.adicionaContato(contato); }

JSP e o JS

[code]
$.ajaxSettings.traditional = true;

var contato = {
clienteTels: [ clienteTels, clienteTels, clienteTels],

};  

$.get(‘teste’, contato)
.success(function(data) {
console.log(data);
})};

Tel
Tel
Tel [/code]

Isto já não é relacionado ao SpringMVC. Se você analisar frameworks ORM, como o Hibernate, verá que ele pode fazer cascade (ele salva também os relacionamentos do seu objeto).

Neste caso em específico, como aparentemente os telefones e endereços existem somente dentro deste contato (se você informar o mesmo endereço para outro contato ele vai duplicar), acho que você pode tratar tudo dentro do DAO, inclusive o for para persistir cada endereco e telefone.

Agora, se você tivesse uma entidade Endereco (e talvez um EnderecoDAO), seria interessante uma classe Service, para garantir o controle transacional.

Até dei uma olhada no Hibernate mas acabei não estudando muito sobre ele, e o problema de fazer eles separados pra cada um é que vão ser varios campos que se repetem, além de telefone e endereço, por isso fiz uma tabela com Dados Pessoais que são nome e afins que não se repetem e uma outra tabela de contatos com essas outras informações (1-n). Vou da uma olhada se consigo colocar pelo DAO mesmo iterando por lá, senão uso como vetor mesmo e dou o @Requestparam em todos eles heiuheiuhe.
Não sei se tu tá entendendo o que tou falando direito, qualquer coisa te mando o projeto se quiser.

Você certamente consegue iterar a coleção no DAO também, isto não é problema.