ChatGPT解决这个技术问题 Extra ChatGPT

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

示例网址:

../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 实现这一目标?


A
Adam Gent

虽然其他答案是正确的,但直接使用 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<String, String>
谢谢你。您也可以对标头执行相同的操作:stackoverflow.com/a/19556291/2599745
这仅在请求方法为 GET 或 POST 时有效。它不适用于 PUT、DELETE 等请求方法。
不要忘记添加 import org.springframework.ui.ModelMap;
@typelogic ModelMap 不需要将所有请求参数作为映射;这只是特定于 OP 代码的细节。
C
Community

编辑

已经指出存在 (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<String,String> 上使用 @RequestParam 来检索所有查询字符串参数。另外,请不要对您在此处看到的答案感到如此...他们不是 不好 :) static.springsource.org/spring/docs/3.1.x/javadoc-api/org/…
我认为它存在于 3.1 中,但不是 JavaDoced。我并没有说我厌恶,而是对 @RequestParam Map<> 方法没有完成感到震惊。我对我见过的许多现代项目感到有点烦恼 Spring MVC(spring 3.1 及更高版本)他们会将 HttpServletRequest 和 HttpServletResponse 放在每个方法上。这似乎是因为初级开发人员使用 StackOverflow 和谷歌而不是查看文档。这使得 Spring 项目很难从 servlet api 切换到 Netty API。 JAX-RS 有类似的滥用问题,但程度要小得多。
它是 JavaDoced in 3.1 只是不是在所有正确的地方:“此外,@RequestParam 可用于 Map 或 MultiValueMap 方法参数以获得对所有请求参数的访问。 ”。事实上,它一直追溯到 3.0 版(我知道我在 3.1 之前使用过它)。我的烦恼仍然在于人们没有费心做研究:)
ℛɑƒæĿᴿᴹᴿ

下面是一个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 );
}

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

学生姓名与姓名

带有电子邮件的学生电子邮件


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

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


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

你可以简单地使用这个:

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

那应该可以正常工作


A
Aniket Kulkarni

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


A
Aniket Kulkarni

有两个接口

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();
    //...
}

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


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

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

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

K
Krzysztof Atłasik
@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 中。


y
yuranos

查询参数和路径参数之间存在根本区别。它是这样的: www.your_domain?queryparam1=1&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 的灵活性和他们适应任何开发人员的愿望有关。

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