示例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<String,String> allRequestParams, ModelMap model)
throws Exception {//TODO: implement}
我如何实现这与Spring MVC?
Edit
有人指出,存在一种纯Spring MVC机制(至少在3.0版本),通过这种机制可以获取这些数据。我不会在这里详细说明,因为这是另一个用户的答案。详情请看@AdamGent的回答,别忘了给它投票。
在Spring 3.2文档中,RequestMapping JavaDoc页面和RequestParam JavaDoc页面都提到了这种机制,但在此之前,它只在RequestMapping页面中提到。在2.5的文档中没有提到这种机制。
对于大多数开发人员来说,这可能是首选的方法,因为它删除了(至少这个)到servlet-api jar所定义的HttpServletRequest对象的绑定。
/编辑
你应该可以通过request.getQueryString()访问请求查询字符串。
除了getQueryString,查询参数还可以作为Map从request.getParameterMap()中检索。
有两个接口
org.springframework.web.context.request.WebRequest
org.springframework.web.context.request.NativeWebRequest
允许通用请求参数访问以及请求/会话属性访问,而不需要绑定到本机Servlet/Portlet API。
Ex.:
@RequestMapping(value = "/", method = GET)
public List<T> getAll(WebRequest webRequest){
Map<String, String[]> params = webRequest.getParameterMap();
//...
}
附注:有一些文档是关于可以用作控制器参数的参数的。
查询参数和路径参数有本质区别。它是这样的:
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的灵活性和他们满足任何开发人员心血来潮的愿望。
我从来不会使用映射作为路径参数,但是它对于查询参数非常有用。
下面是一个在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 );
}
在这种情况下,它将绑定值:
带name的studentName
studentEmail与email