Spring MVC - Как получить все параметры запроса на карте в контроллере Spring? - PullRequest
159 голосов
/ 06 сентября 2011

Пример 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?

Ответы [ 10 ]

288 голосов
/ 28 августа 2013

Хотя остальные ответы верны, это, конечно, не «весенний путь» для непосредственного использования объекта HttpServletRequest.Ответ на самом деле довольно прост и того, что вы ожидаете , если вы знакомы с Spring MVC.

@RequestMapping(value = {"/search/", "/search"}, method = RequestMethod.GET)
public String search(
@RequestParam Map<String,String> allRequestParams, ModelMap model) {
   return "viewName";
}
32 голосов
/ 06 сентября 2011

Редактировать

Было отмечено, что существует ( по крайней мере с 3,0 ) механизм чистой Spring MVC, с помощью которогоможно было бы получить эти данные.Я не буду подробно описывать это здесь, так как это ответ другого пользователя.Подробности смотрите в ответе @ AdamGent , и не забудьте высказать его.

В документации по Spring 3.2 этот механизм упоминается как на странице RequestMapping JavaDoc, так и на RequestParamСтраница JavaDoc, но ранее она упоминается только на странице RequestMapping.В документации 2.5 нет упоминания об этом механизме.

Это, вероятно, предпочтительный подход для большинства разработчиков, поскольку он удаляет (по крайней мере, это) привязку к объекту HttpServletRequest, определенному jar servlet-api.

/ Edit

Вы должны иметь доступ к строке запроса запросов через request.getQueryString().

В дополнение к getQueryString параметры запроса также могут быть получены из request.getParameterMap () в виде карты.

13 голосов
/ 06 сентября 2011

Объект HttpServletRequest уже предоставляет карту параметров. См. request.getParameterMap () для более подробной информации.

9 голосов
/ 20 марта 2013

Вы можете просто использовать это:

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

Это должно работать нормально

6 голосов
/ 27 апреля 2014

Есть два интерфейса

  1. org.springframework.web.context.request.WebRequest
  2. org.springframework.web.context.request.NativeWebRequest

Разрешает общий доступ к параметрам запроса, а также доступ к атрибуту request/session, без привязок к собственному сервлету / портлету API .

Ex:.

@RequestMapping(value = "/", method = GET)
public List<T> getAll(WebRequest webRequest){
    Map<String, String[]> params = webRequest.getParameterMap();
    //...
}

P.S. Есть Документы об аргументах, которые можно использовать в качестве параметров контроллера.

6 голосов
/ 31 января 2012

Используйте org.springframework.web.context.request.WebRequest в качестве параметра в методе контроллера, он предоставляет метод getParameterMap(), преимущество в том, что вы не привязываете ваше приложение к сервлетному API, WebRequest является примером объекта контекста шаблона JavaEE.1003 *

5 голосов
/ 29 января 2018

Вот простой пример получения параметров запроса на карте.

 @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 и studentEmail с переменными name и email соответственно.

5 голосов
/ 03 августа 2015

Я могу опоздать на вечеринку, но, насколько я понимаю, вы ищете что-то вроде этого:

for(String params : Collections.list(httpServletRequest.getParameterNames())) {
    // Whatever you want to do with your map
    // Key : params
    // Value : httpServletRequest.getParameter(params)                
}
2 голосов
/ 08 октября 2018
        @SuppressWarnings("unchecked")
        Map<String,String[]> requestMapper=request.getParameterMap();
        JsonObject jsonObject=new JsonObject();
        for(String key:requestMapper.keySet()){
            jsonObject.addProperty(key, requestMapper.get(key)[0]);
        }

// все параметры будут сохранены в jsonObejct

1 голос
/ 27 сентября 2017

Существует принципиальная разница между параметрами запроса и параметрами пути. Это выглядит так: 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 и их желании удовлетворить любые прихоти разработчиков.

Я бы никогда не использовал карту для параметров пути, но она может быть весьма полезна для параметров запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...