繁体   English   中英

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

[英]Spring MVC - How to get all request params in a map in Spring controller?

示例网址:

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

我不知道 attr1、att2 和 attr4 的名称。

我希望能够做类似的事情(或类似的,不在乎,只要我可以访问请求参数名称的 Map -> value:

@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, 您会期望什么

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

编辑

有人指出存在( 至少从 3.0 开始)一种纯 Spring MVC 机制,通过它可以获取这些数据。 这里就不详述了,因为是其他用户的回答。 有关详细信息,请参阅@AdamGent 的回答,不要忘记点赞。

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

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

/编辑

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

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

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

这是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 );
}

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

  • studentName namename
  • email studentEmail email

你可以简单地使用这个:

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

那应该可以正常工作

有两个接口

  1. org.springframework.web.context.request.WebRequest
  2. 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 关于可用作控制器参数的参数的文档。

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

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

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 的灵活性和他们希望容纳任何开发人员的心血来潮。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM