示例网址:
../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 实现这一目标?
虽然其他答案是正确的,但直接使用 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";
}
编辑
已经指出存在 (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 检索查询参数。
@RequestParam
很乐意将 Map
作为参数(请参阅我的答案)。
Map<String,String>
上使用 @RequestParam
来检索所有查询字符串参数。另外,请不要对您在此处看到的答案感到如此...他们不是 不好 :) static.springsource.org/spring/docs/3.1.x/javadoc-api/org/…
@RequestParam Map<>
方法没有完成感到震惊。我对我见过的许多现代项目感到有点烦恼 Spring MVC(spring 3.1 及更高版本)他们会将 HttpServletRequest 和 HttpServletResponse 放在每个方法上。这似乎是因为初级开发人员使用 StackOverflow 和谷歌而不是查看文档。这使得 Spring 项目很难从 servlet api 切换到 Netty API。 JAX-RS 有类似的滥用问题,但程度要小得多。
下面是一个在 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 );
}
在这种情况下,它将绑定值:
学生姓名与姓名
带有电子邮件的学生电子邮件
HttpServletRequest 对象已经提供了参数映射。有关详细信息,请参阅 request.getParameterMap()。
你可以简单地使用这个:
Map<String, String[]> parameters = request.getParameterMap();
那应该可以正常工作
在你的控制器方法中使用org.springframework.web.context.request.WebRequest
作为参数,它提供了方法getParameterMap()
,优点是你的应用程序不会紧贴Servlet API,WebRequest是JavaEE模式Context Object的一个例子。
有两个接口
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,val2
或 key=val1&key=val2
这样的值数组(如果我没记错的话 spring 支持这两种表示法)所以你会得到一个包含 2 个元素的数组
我可能迟到了,但根据我的理解,你正在寻找这样的东西:
for(String params : Collections.list(httpServletRequest.getParameterNames())) {
// Whatever you want to do with your map
// Key : params
// Value : httpServletRequest.getParameter(params)
}
@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
中。
查询参数和路径参数之间存在根本区别。它是这样的: 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 的灵活性和他们适应任何开发人员的愿望有关。
我永远不会将映射用于路径参数,但它对于查询参数非常有用。
@RequestParam MultiValueMap<String, String>
import org.springframework.ui.ModelMap;
。ModelMap
不需要将所有请求参数作为映射;这只是特定于 OP 代码的细节。