mvc mkyong formulario form ejemplo docs java spring data-binding collections spring-mvc

java - mkyong - Enlazando una lista en @RequestParam



spring mvc formulario ejemplo (6)

Cambiar el valor del campo oculto con la casilla de verificación alternar como a continuación ...

HTML:

<input type=''hidden'' value=''Unchecked'' id="deleteAll" name=''anyName''> <input type="checkbox" onclick="toggle(this)"/> Delete All

Guión:

function toggle(obj) {`var $input = $(obj); if ($input.prop(''checked'')) { $(''#deleteAll'').attr( ''value'',''Checked''); } else { $(''#deleteAll'').attr( ''value'',''Unchecked''); } }

Estoy enviando algunos parámetros de un formulario de esta manera:

myparam[0] : ''myValue1'' myparam[1] : ''myValue2'' myparam[2] : ''myValue3'' otherParam : ''otherValue'' anotherParam : ''anotherValue'' ...

Sé que puedo obtener todos los parámetros en el método del controlador agregando un parámetro como

public String controllerMethod(@RequestParam Map<String, String> params){ .... }

Quiero vincular los parámetros myParam [] (no los otros) a una lista o matriz (todo lo que mantiene el orden de los índices), así que lo he intentado con una sintaxis como:

public String controllerMethod(@RequestParam(value="myParam") List<String> myParams){ .... }

y

public String controllerMethod(@RequestParam(value="myParam") String[] myParams){ .... }

pero ninguno de ellos vincula los myParams. Incluso cuando agrego un valor al mapa, no puedo vincular los parámetros:

public String controllerMethod(@RequestParam(value="myParam") Map<String, String> params){ .... }

¿Hay alguna sintaxis para vincular algunos parámetros a una lista o matriz sin tener que crear un objeto como @ModelAttribute con un atributo de lista en él?

Gracias


Las matrices en @RequestParam se usan para enlazar varios parámetros del mismo nombre:

myparam=myValue1&myparam=myValue2&myparam=myValue3

Si necesita vincular parámetros indexados de @ModelAttribute - @ModelAttribute , supongo que necesita @ModelAttribute todos modos.


O podrías hacerlo de esa manera:

public String controllerMethod(@RequestParam(value="myParam[]") String[] myParams){ .... }

Eso funciona, por ejemplo, para formularios como este:

<input type="checkbox" name="myParam[]" value="myVal1" /> <input type="checkbox" name="myParam[]" value="myVal2" />

Esta es la solución más simple :)


Simplemente complementando lo que dijo Donal Fellows, puede usar List con @RequestParam

public String controllerMethod(@RequestParam(value="myParam") List<ObjectToParse> myParam){ .... }

¡Espero eso ayude!


Suscribiendo lo que basil dijo en un comentario a la pregunta en sí, si method = RequestMethod.GET entonces puedes usar @RequestParam List groupVal.

Entonces, llamar al servicio con la lista de parámetros es tan simple como:

API_URL?groupVal=kkk,ccc,mmm


Una forma de lograr esto (de manera hackosa) es crear una clase contenedora para la List . Me gusta esto:

class ListWrapper { List<String> myList; // getters and setters }

Entonces su firma de método de controlador se vería así:

public String controllerMethod(ListWrapper wrapper) { .... }

No es necesario utilizar la anotación @RequestParam o @ModelAttribute si el nombre de la colección que pasa en la solicitud coincide con el nombre del campo de la colección de la clase contenedora, en mi ejemplo, los parámetros de su solicitud deberían tener este aspecto:

myList[0] : ''myValue1'' myList[1] : ''myValue2'' myList[2] : ''myValue3'' otherParam : ''otherValue'' anotherParam : ''anotherValue''