VRAPTOR - Passando list por parametro para meu controller

Pessoal.

Chega uma List na minha página JSP, chamada minhaListaLis. Uso ela para popular as linhas de uma tabela. Cada linha corresponde a um usuário e seus dados. Essa list foi montada com o JOIN entre 4 tabelas diferentes.

Cenário: Mudo o status ativo de um usuário na tabela HTML através de um checkbox, e quero submeter essa tabela, com a alteração feita, ou seja, uma linha da minha tabela, que corresponde a um usuário, foi desativado.

Como passar essa lista inteira de volta para o Controller, para fazer a atualização no banco?
Qual a melhor forma de fazer isso?

Obrigado

Você quer saber a maneira mais usual de fazer, ou a mais perfumada?

A usual você pode submeter os dados como um formulário normal, porém recebendo no parametro do seu método um List. A forma mais perfumada pode ser um jquery fazendo o update via ajax do registro.

O que você acha?

hahaha

perfumada foi hilário :stuck_out_tongue:

bom, gostaria da forma mais simples no momento, porém aprecio aprender JQuery prq ainda não conheço o framework.

Poderia me dar exemplos dos 2?

ps: eu tentei passar List e não consegui. Como deve estar o formulário para que ele pegue esse parametro “magicamente”?
heheh

aqui vai como está meu formulário, espero que ajude:

<c:forEach items="${entrevistadorPesquisaList}" var="epList"> <tr> <td> <input type="checkbox" name="selecionado" <c:if test="${epList.selecionado eq 1}">checked</c:if>> </td> <td> ${epList.entrevistador.usuario.nome } </td> <td> ${epList.entrevistador.nivelEntrevistador.descricao} </td> <td> ${epList.mensagemResposta} </td> </tr> </c:forEach>

valeu garcia-jj

o nome do checkbox tem que ser algo como:

entrevistaPesquisaList[${s.index}].entrevistador.ativo

o s.index vem do foreach:

<c:forEach items="${entrevistadorPesquisaList}" var="epList" varStatus="s">

daí vc recebe na lógica uma List chamada entrevistadorPesquisaList

vc pode trocar o nome da lista se quiser

Lucas, aproveitando a pergunta.

Estou querendo algo parecido, mas ao invés de um List quero receber um Map.
Tem algo assim no VRaptor? Procurei na documentação e não encontrei.

se eu não me engano o vraptor não suporta maps nos parâmetros… mas preciso confirmar

Lucas, obrigado pela resposta.
Mas não consegui fazer da forma que queria e vc sugeriu.
Veja bem

Tenho meu form:

<tr> <td> <fieldset id="field2"> <legend><input type="checkbox" name="nivel[2]" onChange="setCheckbox('2', this.checked);" />Aprendiz</legend> <table id="nivel2"> <tr> <td><input type="checkbox" id="e2" name="entrevistador[2]"></td> <td>Jose</td> </tr> <tr> <td><input type="checkbox" id="e3" name="entrevistador[3]"></td> <td>Joao</td> </tr> </table> </fieldset> </td> </tr>

Tenho alguns fieldsets, com vários checkbox dentro, dividido em niveis, onde cada fieldset é um nivel

Pois bem, quero mandar email para todos os Entrevistadores selecionados, onde cada entrevistador possui id=“id${entrevistadorList.id}”.

Logo, preciso passar a lista de entrevistadores que eu acabei de selecionar, para meu controller, para depois eu enviar um email para eles.

Pode perceber que o name deles está da forma que vc me sugeriu, com um index entre os colchetes.
Não consegui ainda pegar a list no meu controller, quando tentei deu o seguinte erro:

br.com.caelum.vraptor.VRaptorException: Unable to find converter for br.com.nemda.bean.vraptor.Entrevistador
	at br.com.caelum.vraptor.core.DefaultConverters.to(DefaultConverters.java:67)
	at br.com.caelum.vraptor.http.ognl.VRaptorConvertersAdapter.convertValue(VRaptorConvertersAdapter.java:51)
	at ognl.ArrayPropertyAccessor.setProperty(ArrayPropertyAccessor.java:112)
	at br.com.caelum.vraptor.http.ognl.ArrayAccessor.setProperty(ArrayAccessor.java:78)
	at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2225)
	at ognl.ASTProperty.setValueBody(ASTProperty.java:127)
	at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
	at ognl.SimpleNode.setValue(SimpleNode.java:279)
	at ognl.ASTChain.setValueBody(ASTChain.java:227)
	at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
	at ognl.SimpleNode.setValue(SimpleNode.java:279)
	at ognl.Ognl.setValue(Ognl.java:737)
	at ognl.Ognl.setValue(Ognl.java:783)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createViaOgnl(OgnlParametersProvider.java:133)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:108)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:90)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.getParametersFor(ParametersInstantiatorInterceptor.java:83)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:68)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:45)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:62)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Thread.java:619)

Conto com sua ajuda, obrigado =)

Se seu método no Controller recebe uma Lista chamada entrevistadorPesquisaList, coloque no name dos seus checkbox entrevistadorPesquisaList[0] e entrevistadorPesquisaList[1]

sim zinho

Olha o erro que deu (STACKTRACE) acima, quando eu tentei das seguintes formas

o nome dos checkboxes deve ser parecido com: entrevistadores[2].algumaPropriedade…

no caso, qual propriedade do entrevistador o checkbox representa?
suponha que seja a propriedade ativo, então vc vai precisar fazer:

<input type="checkbox" name="entrevistadores[${s.index}].ativo" value="true" />
<input type="hidden" name="entrevistadores[${s.index}].id" value="${epList.id}"/>

e receber na lógica

public void enviarEmail(List<Entrevistador> entrevistadores) {...}