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

MDb*_*MDb 168 java spring spring-mvc

示例网址:

../search/?attr1=value1&attr2=value2&attr4=value4
Run Code Online (Sandbox Code Playgroud)

我不知道attr1,att2和attr4的名称.

我希望能够做类似的事情(或类似的,不关心,只要我有权访问请求参数名称的地图 - >值:

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

如何使用Spring MVC实现这一目标?

Ada*_*ent 293

虽然其他答案是正确的,但它肯定不是直接使用HttpServletRequest对象的"Spring方式".答案实际上非常简单,如果你熟悉Spring MVC,你会期待什么.

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

  • 如果您要处理列表值,例如来自一组具有相同名称的复选框,请使用:`@RequestParam MultiValueMap <String,String>` (41认同)
  • 这仅在请求方法为GET或POST时有效.它不适用于PUT,DELETE等请求方法. (2认同)

nic*_*ild 34

编辑

已经指出存在(至少截至3.0)纯Spring MVC机制,通过该机制可以获得该数据.我不会在这里详述,因为它是另一个用户的答案.有关详细信息,请参阅@ AdamGent的答案,不要忘记对其进行投票.

在Spring 3.2文档中,RequestMappingJavaDoc页面和RequestParamJavaDoc页面都提到了这种机制,但之前只在RequestMapping页面中提到过.在2.5文档中没有提到这种机制.

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

/编辑

您应该有权访问请求查询字符串request.getQueryString().

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

  • 我怀疑有人因为getQueryString返回String而不是Map而对这个答案进行了低估.操作系统正在寻找参数图.我在你的答案中添加了getParameterMap以帮助它更正确:) +1 (11认同)

Kev*_*vin 13

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

  • 它在数据驱动的应用程序中是有意义的.一个请求路径和查询字符串可由客户端组成,然后应用程序服务器将使用这些路径和查询字符串作为键来查找相应的值(来自任何类型的数据源). (11认同)
  • 问题表明他不知道参数名称是什么.而且,我也不知道它们是什么.;) (2认同)

Big*_*ava 9

你可以简单地使用这个:

Map<String, String[]> parameters = request.getParameterMap();
Run Code Online (Sandbox Code Playgroud)

这应该工作正常


Die*_*tas 7

使用org.springframework.web.context.request.WebRequest在您的控制器方法的参数,它提供的方法getParameterMap(),优点是,你不紧张你的应用程序和Servlet API中,WebRequest的是JavaEE模式语境对象的实例.


kat*_*uro 6

有两个接口

  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();
    //...
}
Run Code Online (Sandbox Code Playgroud)

PS 关于可以用作控制器参数的参数的文档.


Shr*_*ale 6

以下是在Map获取请求参数的简单示例.

 @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 );
       }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它将分别将studentName和studentEmail的值与名称和电子邮件变量绑定.

  • 我真的很喜欢这个答案,但 Map&lt;String, String&gt; 似乎有问题,因为某些参数可能有多个值。我想 Map&lt;String, ?&gt; 左右更有意义。 (2认同)

小智 5

我可能参加聚会晚了,但是据我了解,您正在寻找类似这样的东西:

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