java - requestmapping - para que sirve spring mvc
Spring MVC-¿Cómo obtener todos los parámetros de solicitud en un mapa en el controlador de Spring? (9)
Aquí está el ejemplo simple de obtener params de solicitud en un Mapa.
@RequestMapping(value="submitForm.html", method=RequestMethod.POST)
public ModelAndView submitForm(@RequestParam Map<String, String> reqParam)
{
String name = reqParam.get("studentName");
String email = reqParam.get("studentEmail");
ModelAndView model = new ModelAndView("AdmissionSuccess");
model.addObject("msg", "Details submitted by you::
Name: " + name + ", Email: " + email );
}
En este caso, vinculará el valor de studentName y studentEmail con las variables de nombre y correo electrónico, respectivamente.
URL de ejemplo:
../search/?attr1=value1&attr2=value2&attr4=value4
No sé los nombres de attr1, att2 y attr4.
Me gustaría poder hacer algo como eso (o similar, no me importa, siempre que tenga acceso al nombre del mapa del parámetro de solicitud -> valor:
@RequestMapping(value = "/search/{parameters}", method = RequestMethod.GET)
public void search(HttpServletRequest request,
@PathVariable Map<String,String> allRequestParams, ModelMap model)
throws Exception {//TODO: implement}
¿Cómo puedo lograr esto con Spring MVC?
El objeto HttpServletRequest proporciona un mapa de parámetros ya. Ver request.getParameterMap() para más detalles.
Existe una diferencia fundamental entre los parámetros de consulta y los parámetros de ruta. Funciona de la siguiente manera: www.your_domain?queryparam1=1&queryparam2=2
- parámetros de consulta. www.your_domain/path_param1/entity/path_param2
- parámetros de ruta.
Lo que me sorprendió es que en Spring MVC World mucha gente confunde una por la otra. Si bien los parámetros de consulta son más como criterios para una búsqueda, es muy probable que los parámetros de ruta identifiquen un recurso de manera única. Habiendo dicho eso, no significa que no pueda tener múltiples parámetros de ruta en su URI, porque la estructura de recursos puede ser anidada. Por ejemplo, supongamos que necesita un recurso de automóvil específico de una persona específica:
www.my_site/customer/15/car/2
- buscando un segundo automóvil de un 15º cliente.
¿Cuál sería un caso de uso para poner todos los parámetros de ruta en un mapa? Los parámetros de ruta no tienen una "clave" cuando observa un URI, esas claves dentro del mapa se tomarían de su anotación @Mapping, por ejemplo:
@GetMapping("/booking/{param1}/{param2}")
Desde HTTP / REST, los parámetros de la ruta de acceso no se pueden proyectar realmente en un mapa. Se trata de la flexibilidad de Spring y su deseo de adaptarse a cualquier capricho de los desarrolladores, en mi opinión.
Nunca usaría un mapa para los parámetros de ruta, pero puede ser bastante útil para los parámetros de consulta.
Hay dos interfaces
-
org.springframework.web.context.request.WebRequest
-
org.springframework.web.context.request.NativeWebRequest
Permite el acceso genérico a los parámetros de solicitud, así como el acceso a los atributos de request/session
, sin vínculos con la API de Servlet / Portlet nativo .
Ex.:
@RequestMapping(value = "/", method = GET)
public List<T> getAll(WebRequest webRequest){
Map<String, String[]> params = webRequest.getParameterMap();
//...
}
PD: hay documentos sobre argumentos que se pueden usar como parámetros del controlador.
Mientras que las otras respuestas son correctas, ciertamente no es la "forma de primavera" para usar el objeto HttpServletRequest directamente. La respuesta es bastante simple y lo que esperarías si estás familiarizado con Spring MVC.
@RequestMapping(value = {"/search/", "/search"}, method = RequestMethod.GET)
public String search(
@RequestParam Map<String,String> allRequestParams, ModelMap model) {
return "viewName";
}
Puede que llegue tarde a la fiesta, pero según entiendo, estás buscando algo como esto:
for(String params : Collections.list(httpServletRequest.getParameterNames())) {
// Whatever you want to do with your map
// Key : params
// Value : httpServletRequest.getParameter(params)
}
Use org.springframework.web.context.request.WebRequest
como parámetro en su método de controlador, proporciona el método getParameterMap()
, la ventaja es que no ajusta su aplicación a la API de Servlet, WebRequest es un ejemplo de JavaEE patrón Context Object.
simplemente puede usar esto:
Map<String, String[]> parameters = request.getParameterMap();
Eso debería funcionar bien
Editar
Se ha señalado que existe ( al menos a partir de 3.0 ) un mecanismo Spring MVC puro mediante el cual se podrían obtener estos datos. No lo detallaré aquí, ya que es la respuesta de otro usuario. Consulte la respuesta de @ AdamGent para obtener más información y no olvide invitarla a más.
En la documentación de Spring 3.2, este mecanismo se menciona tanto en la página RequestMapping
como en la página RequestParam
, pero anteriormente solo se menciona en la página RequestMapping
. En la documentación 2.5 no hay mención de este mecanismo.
Este es probablemente el enfoque preferido para la mayoría de los desarrolladores, ya que elimina (al menos esto) el enlace al objeto HttpServletRequest
definido por el jar servlet-api.
/Editar
Debería tener acceso a la cadena de consulta de solicitudes a través de request.getQueryString()
.
Además de getQueryString, los parámetros de consulta también se pueden recuperar desde request.getParameterMap() como un mapa.