Spring MVC – 如何在Spring控制器中获取地图中的所有请求参数?
示例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<Spring,Spring> allRequestParams, ModelMap model) throws Exception {//TODO: implement}
我如何用Spring MVC实现这一点?
虽然其他答案是正确的,但直接使用HttpServletRequest对象并不是“spring的方式”。 答案其实很简单,如果你熟悉Spring MVC, 你会期望什么 。
@RequestMapping(value = {"/search/", "/search"}, method = RequestMethod.GET) public String search( @RequestParam Map<String,String> allRequestParams, ModelMap model) { return "viewName"; }
编辑
有人指出,存在( 至less3.0 )一个纯粹的Spring MVC机制,人们可以得到这些数据。 我不会在这里详细说明,因为这是另一个用户的答案。 有关详细信息,请参阅@ AdamGent的答案 ,不要忘记加注。
在Spring 3.2文档中,在RequestMapping
JavaDoc页面和RequestParam
JavaDoc页面上都提到了这种机制,但是之前只在RequestMapping
页面中提到过。 在2.5文档中没有提到这种机制。
对于大多数开发人员来说,这可能是首选的方法,因为它会删除(至less是这个)绑定到由servlet-api jar定义的HttpServletRequest
对象。
/编辑
您应该可以通过request.getQueryString()
访问请求查询string。
除了getQueryString之外,查询参数也可以从request.getParameterMap()中作为Map来检索。
HttpServletRequest对象已经提供了一个参数图。 有关更多详细信息,请参阅request.getParameterMap() 。
你可以简单地使用这个:
Map<String, String[]> parameters = request.getParameterMap();
这应该工作得很好
使用org.springframework.web.context.request.WebRequest
作为你的控制器方法中的一个参数,它提供了方法getParameterMap()
,其优点是你不会把你的应用程序紧缩到Servlet API中,WebRequest是JavaEE的一个例子模式上下文对象。
有两个接口
-
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 有关于参数的Docs可以用作Controller params。
我可能会晚到晚会,但根据我的理解,你正在寻找这样的事情:
for(String params : Collections.list(httpServletRequest.getParameterNames())) { // Whatever you want to do with your map // Key : params // Value : httpServletRequest.getParameter(params) }
查询参数和path参数之间有根本的区别。 它是这样的: www.your_domain?queryparam1=1&queryparam2=2
– 查询参数。 www.your_domain/path_param1/entity/path_param2
– path参数。
我觉得惊奇的是,在Spring MVC世界里,很多人都把它们混为一谈。 尽pipe查询参数更像search条件,但path参数很可能会唯一标识资源。 话虽如此,这并不意味着你的URI中不能有多个path参数,因为资源结构可以嵌套。 例如,假设您需要特定人员的特定汽车资源:
www.my_site/customer/15/car/2
– 寻找第15位顾客的第二辆车。
将所有path参数放入地图的用例是什么? path参数在查看URI本身时没有“键”,那么映射中的这些键将从@Mapping注释中获取,例如:
@GetMapping("/booking/{param1}/{param2}")
从HTTP / RESTangular度来看,path参数不能真正映射到地图上。 这是关于Spring的灵活性和他们的愿望,以适应任何开发人员的兴奋,在我看来。
我永远不会使用path参数的地图,但它可以是非常有用的查询参数。
- Spring @PostConstruct与init-method属性
- 为什么我会使用Java / Spring的Scala / Lift?
- Spring中的BeanPostProcessor和init / destroy方法有什么区别?
- Spring MVC – 向表单提交多个button
- 有没有可能使空的RequestParam值使用defaultValue?
- 在多个项目/模块中使用多个属性文件(通过PropertyPlaceholderConfigurer)
- 无论如何,@Autowire需要构造函数参数的bean?
- 如何防止Spring 3.0 MVC @ModelAttributevariables出现在URL中?
- Spring Java Config:如何用运行时参数创build一个原型范围的@Bean?