¿Cómo obtener explícitamente datos de publicación en Spring MVC?

81

¿Hay alguna forma de obtener los datos de la publicación? Sé que Spring maneja la vinculación de datos de publicación a objetos java. Pero, dados dos campos que quiero procesar, ¿cómo puedo obtener esos datos?

Por ejemplo, supongamos que mi formulario tiene dos campos:

 <input type="text" name="value1" id="value1"/>
 <input type="text" name="value2" id="value2"/>

¿Cómo haría para recuperar esos valores en mi controlador?

Royhowie
fuente

Respuestas:

135

Si está utilizando una de las instancias de controlador integradas, entonces uno de los parámetros de su método de controlador será el objeto Request. Puede llamar request.getParameter("value1")para obtener el valor de los datos POST (o PUT).

Si está utilizando las anotaciones de Spring MVC, puede agregar un parámetro anotado a los parámetros de su método:

@RequestMapping(value = "/someUrl")
public String someMethod(@RequestParam("value1") String valueOne) {
 //do stuff with valueOne variable here
}
Jacob Mattison
fuente
1
¿Funciona esto con múltiples parámetros de solicitud? ¿No tienes que envolver en un solo objeto? stackoverflow.com/q/12862320/106261
NimChimpsky
1
<3 esto para ocasiones en las que no desea / necesita un formulario respaldado por un modelo (para un formulario de búsqueda o un formulario de contacto, etc.)
Don Cheadle
37

Otra respuesta a la pregunta exacta del OP es establecer el consumestipo de contenido "text/plain"y luego declarar un @RequestBody Stringparámetro de entrada. Esto pasará el texto de los datos POST como la Stringvariable declarada ( postPayloaden el siguiente ejemplo).

Por supuesto, esto supone que su carga útil POST son datos de texto (como dijo el OP).

Ejemplo:

    @RequestMapping(value = "/your/url/here", method = RequestMethod.POST, consumes = "text/plain")
    public ModelAndView someMethod(@RequestBody String postPayload) {    
        // ...    
    }
Simón
fuente
3
Esta es la respuesta que estaba buscando. Por 'los datos de la publicación en sí' entiendo lo mismo. ¡Gracias!
mauromartini
Para múltiples parámetros de publicación (como value1y value2, esto crearía una Cadena para ambos valores. Entonces, ¿necesitaría analizar los valores individuales? ¿Por qué hacer eso cuando puede especificar / obtener cada valor individualmente como en la respuesta aceptada?
Don Cheadle
1
@mmcrae: es simplemente otra forma de resolver el problema, y ​​quizás sea útil para otros usuarios que no tienen varios parámetros POST, sino que solo tienen una gota de texto o datos binarios. Esa era mi situación, y eso es lo que esperaba aprender cuando hice clic en esta pregunta.
Simon
1
Exactamente lo que estaba buscando. También funciona con consumes = "application / json" si publica json.
Manish
Hola. Estoy usando Postman para probar mi API. Postman me ayuda a llenar el cuerpo de POST con datos. El problema es que obtengo 403 cuando uso RequestMethod.POST. Incluso agregué @CrossOrigin(origins = "*")pero sigo obteniendo lo mismo ... No sé qué está pasando ... He usado la misma firma que tu respuesta (excepto que someMethoddevuelve un Stringen mi caso) ...
Kurt Miller
27

Spring MVC se ejecuta sobre la API de Servlet. Entonces, puedes usar HttpServletRequest#getParameter()para esto:

String value1 = request.getParameter("value1");
String value2 = request.getParameter("value2");

El HttpServletRequestya debería estar disponible para usted dentro Spring MVC como uno de los argumentos del método del handleRequest()método.

BalusC
fuente
1
Hai @BalusC, en mi caso tengo más de 20 variables en solicitud. Sin embargo, tengo un bean con todas las variables de parámetros de solicitud. Ahora quiero obtener todos los valores en bean desde la solicitud en lugar de obtener uno por uno. Tenemos esta característica en struts2 usando "ModelDrivenBean". ¿Tenemos alguna característica como esta en el marco de primavera?
vissu
2
Sí, usando la anotación @ModelAttribute y un bean de respaldo de formulario. Este enlace describe muy bien cómo hacerlo: viralpatel.net/blogs/2010/07/spring-3-mvc-handling-forms.html
@vissu si tiene más de 20 variables, realmente debería considerar la simplificación
CodeMonkey
1
Hola BalusC. Siguiendo la respuesta de simmon a continuación, estoy usando Postman para probar mi API. Postman me ayuda a llenar el cuerpo de POST con datos. El problema es que obtengo 403 cuando uso RequestMethod.POST. Incluso agregué, @CrossOrigin(origins = "*")pero sigo recibiendo lo mismo ... No sé qué está pasando ... He usado la misma firma que su respuesta (excepto que someMethoddevuelve un Stringen mi caso) ...
Kurt Miller