Spring MVC – 如何在Spring控制器中获取地图中的所有请求参数?

示例url:

../search/?attr1=value1&attr2=value2&attr4=value4 

我不知道attr1,att2和attr4的名字。

我想能够做类似的事情(或类似的,不在乎,只要我有访问请求参数名称 – >值的地图:

 @RequestMapping(value = "/search/{parameters}", method = RequestMethod.GET) public void search(HttpServletRequest request, @PathVariable Map<Spring,Spring> allRequestParams, ModelMap model) throws Exception {//TODO: implement} 

我如何用Spring MVC实现这一点?

虽然其他答案是正确的,但直接使用HttpServletRequest对象并不是“spring的方式”。 答案其实很简单,如果你熟悉Spring MVC, 你会期望什么 。

 @RequestMapping(value = {"/search/", "/search"}, method = RequestMethod.GET) public String search( @RequestParam Map<String,String> allRequestParams, ModelMap model) { return "viewName"; } 

编辑

有人指出,存在( 至less3.0 )一个纯粹的Spring MVC机制,人们可以得到这些数据。 我不会在这里详细说明,因为这是另一个用户的答案。 有关详细信息,请参阅@ AdamGent的答案 ,不要忘记加注。

在Spring 3.2文档中,在RequestMapping JavaDoc页面和RequestParam JavaDoc页面上都提到了这种机制,但是之前只在RequestMapping页面中提到过。 在2.5文档中没有提到这种机制。

对于大多数开发人员来说,这可能是首选的方法,因为它会删除(至less是这个)绑定到由servlet-api jar定义的HttpServletRequest对象。

/编辑

您应该可以通过request.getQueryString()访问请求查询string。

除了getQueryString之外,查询参数也可以从request.getParameterMap()中作为Map来检索。

HttpServletRequest对象已经提供了一个参数图。 有关更多详细信息,请参阅request.getParameterMap() 。

你可以简单地使用这个:

 Map<String, String[]> parameters = request.getParameterMap(); 

这应该工作得很好

使用org.springframework.web.context.request.WebRequest作为你的控制器方法中的一个参数,它提供了方法getParameterMap() ,其优点是你不会把你的应用程序紧缩到Servlet API中,WebRequest是JavaEE的一个例子模式上下文对象。

有两个接口

  1. org.springframework.web.context.request.WebRequest
  2. org.springframework.web.context.request.NativeWebRequest

允许通用请求参数访问以及request/session属性访问, 而不与本地Servlet / Portlet API绑定

例:

 @RequestMapping(value = "/", method = GET) public List<T> getAll(WebRequest webRequest){ Map<String, String[]> params = webRequest.getParameterMap(); //... } 

PS 有关于参数的Docs可以用作Controller params。

我可能会晚到晚会,但根据我的理解,你正在寻找这样的事情:

 for(String params : Collections.list(httpServletRequest.getParameterNames())) { // Whatever you want to do with your map // Key : params // Value : httpServletRequest.getParameter(params) } 

查询参数和path参数之间有根本的区别。 它是这样的: www.your_domain?queryparam1=1&queryparam2=2 – 查询参数。 www.your_domain/path_param1/entity/path_param2 – path参数。

我觉得惊奇的是,在Spring MVC世界里,很多人都把它们混为一谈。 尽pipe查询参数更像search条件,但path参数很可能会唯一标识资源。 话虽如此,这并不意味着你的URI中不能有多个path参数,因为资源结构可以嵌套。 例如,假设您需要特定人员的特定汽车资源:

www.my_site/customer/15/car/2 – 寻找第15位顾客的第二辆车。

将所有path参数放入地图的用例是什么? path参数在查看URI本身时没有“键”,那么映射中的这些键将从@Mapping注释中获取,例如:

 @GetMapping("/booking/{param1}/{param2}") 

从HTTP / RESTangular度来看,path参数不能真正映射到地图上。 这是关于Spring的灵活性和他们的愿望,以适应任何开发人员的兴奋,在我看来。

我永远不会使用path参数的地图,但它可以是非常有用的查询参数。