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

Posted

技术标签:

【中文标题】Spring MVC - 如何在 Spring 控制器的地图中获取所有请求参数?【英文标题】:Spring MVC - How to get all request params in a map in Spring controller? 【发布时间】:2011-11-10 20:43:51 【问题描述】:

示例网址:

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

我不知道 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

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

【问题讨论】:

【参考方案1】:

虽然其他答案是正确的,但直接使用 HttpServletRequest 对象肯定不是“Spring 方式”。如果您熟悉 Spring MVC,答案实际上是 quite simple and what you would expect。

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

【讨论】:

如果您要处理列表值,例如来自一组具有相同名称的复选框,请使用:@RequestParam MultiValueMap&lt;String, String&gt; 谢谢。你也可以对标题做同样的事情:***.com/a/19556291/2599745 这仅在请求方法为 GET 或 POST 时有效。它不适用于 PUT、DELETE 等请求方法。 别忘了加import org.springframework.ui.ModelMap; @typelogic ModelMap 不需要将所有请求参数作为映射;这只是一个特定于 OP 代码的细节。【参考方案2】:

编辑

已经指出存在 (at least as of 3.0) 一种纯 Spring MVC 机制,通过它可以获取这些数据。我不会在这里详细说明,因为它是另一个用户的答案。详情请见@AdamGent's answer,别忘了点赞。

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

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

/编辑

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

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

【讨论】:

我怀疑有人对这个答案投了反对票,只是因为 getQueryString 返回的是字符串而不是地图。该操作正在寻找参数映射。我在您的答案中添加了 getParameterMap 以帮助使其更正确:) +1 不,我投了反对票,因为它不是 Spring MVC 的做法。 @RequestParam 很乐意将Map 作为参数(请参阅我的回答)。 @AdamGent 这个问题是在 Spring 3.2 尚未发布的时候提出的。返回并查看 3.1 的 JavaDoc,您会注意到没有提到在 Map&lt;String,String&gt; 上使用 @RequestParam 来检索所有查询字符串参数。另外,请不要对您在此处看到的答案感到如此...他们不是 糟糕 :) static.springsource.org/spring/docs/3.1.x/javadoc-api/org/… 我认为它存在于 3.1 中,但不是 JavaDoced。我并没有说我厌恶,而是对@RequestParam Map&lt;&gt; 的方式没有完成感到震惊。我对我见过的许多现代项目感到有点烦恼 Spring MVC(spring 3.1 及更高版本)他们会将 HttpServletRequest 和 HttpServletResponse 放在每个方法上。这似乎是因为初级开发人员使用 *** 和谷歌而不是查看文档。这使得 Spring 项目很难从 servlet api 切换到 Netty API。 JAX-RS 也有类似的滥用问题,但程度要小得多。 它是JavaDoced in 3.1 只是不在所有正确的地方:“此外,@RequestParam 可以用于 Map 或 MultiValueMap 方法参数访问所有请求参数。"。事实上,它一直追溯到 3.0 版(我知道我在 3.1 之前使用过它)。我的烦恼仍然在于人们没有费心做研究:)【参考方案3】:

这是一个Map 中获取requestParams 的简单示例:

@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 );

在这种情况下,它将绑定值:

studentNamename studentEmailemail

【讨论】:

我真的很喜欢这个答案,但 Map 似乎有问题,因为某些参数可能有多个值。我猜 Map 左右更有意义。【参考方案4】:

HttpServletRequest 对象已经提供了参数映射。详情请见request.getParameterMap()。

【讨论】:

获取参数映射也将包含来自 POST 请求的表单数据。如果用户不知道查询字符串中的键,那么他们如何区分来自查询字符串的内容和来自 POST 正文的数据? 您是在告诉我您要处理表单帖子,但您不知道实际的表单参数是什么? 问题表明他不知道参数名称是什么。另外,我也不知道它们是什么。 ;) 对不起,我觉得这个前提有点荒谬。 这在数据驱动的应用程序中很有意义。一种请求路径和查询字符串可以由客户端组成,然后应用程序服务器将通过使用这些路径和查询字符串作为键来查找相应的值(来自任何类型的数据源)。【参考方案5】:

你可以简单地使用这个:

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

应该没问题

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

有两个接口

    org.springframework.web.context.request.WebRequest 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();
    //...

附: There are 关于可用作控制器参数的参数的文档。

【讨论】:

谢谢它有效。请问,String[] 作为值有什么意义?我必须将其索引为 0 才能获得值。 可以有一个像key=val1,val2key=val1&amp;key=val2这样的值数组(如果我没记错的话spring支持这两种表示法)所以你会得到一个包含2个元素的数组【参考方案8】:

我可能会迟到, 但据我了解,您正在寻找这样的东西:

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

【讨论】:

【参考方案9】:
@SuppressWarnings("unchecked")
Map<String,String[]> requestMapper=request.getParameterMap();
JsonObject jsonObject=new JsonObject();
for(String key:requestMapper.keySet())
    jsonObject.addProperty(key, requestMapper.get(key)[0]);

所有参数都将存储在jsonObject

【讨论】:

【参考方案10】:

查询参数和路径参数有根本的区别。它是这样的: www.your_domain?queryparam1=1&amp;queryparam2=2 - 查询参数。 www.your_domain/path_param1/entity/path_param2 - 路径参数。

令我惊讶的是,在 Spring MVC 世界中,很多人混淆了两者。 虽然查询参数更像是搜索条件,但路径参数很可能唯一地标识资源。话虽如此,但这并不意味着您的 URI 中不能有多个路径参数,因为资源结构可以嵌套。例如,假设您需要特定人的特定汽车资源:

www.my_site/customer/15/car/2 - 正在寻找第 15 位客户的第二辆车。

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

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

从 HTTP/REST 角度来看,路径参数不能真正投影到地图上。在我看来,这完全取决于 Spring 的灵活性以及他们希望满足任何开发人员突发奇想的愿望。

我永远不会将映射用于路径参数,但它对于查询参数可能非常有用。

【讨论】:

以上是关于Spring MVC - 如何在 Spring 控制器的地图中获取所有请求参数?的主要内容,如果未能解决你的问题,请参考以下文章

org.springframework.beans.NullValueInNestedPathException:Spring MVC 3.2.8 中的自动增长嵌套属性路径

spring mvc 如何配置最简洁的

spring mvc中如何读取数据库

spring3 mvc的service如何在类中的中的怎么样使用

如何在 Spring-MVC 中添加“必需”属性 [重复]

如何在带有注解配置的spring mvc中使用spring数据