簡體   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