Spring MVC - Как получить все параметры запроса на карте в контроллере Spring?

Пример URL:

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

Я не знаю имена attr1, att2 и attr4.

Я хотел бы иметь возможность сделать что-то подобное (или подобное, не важно, до тех пор, пока у меня есть доступ к Map of request param name → 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?

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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

Это должно хорошо работать

Ответ 5

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

Ответ 6

Существует два интерфейса

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

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

Напр.:

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

PS Существуют Документы о аргументах, которые могут использоваться как параметры контроллера.

Ответ 7

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

for(String params : Collections.list(httpServletRequest.getParameterNames())) {
    // Whatever you want to do with your map
    // Key : params
    // Value : httpServletRequest.getParameter(params)                
}

Ответ 8

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

 @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 с переменными имен и электронной почты соответственно.

Ответ 9

@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.

Ответ 10

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

Что было бы обязательным для ввода всех параметров пути в карту? Параметры Path не имеют "ключа", когда вы смотрите на URI, эти ключи внутри карты будут взяты из вашей аннотации @Mapping, например:

@GetMapping("/booking/{param1}/{param2}")

С точки зрения маршрута HTTP/REST параметры пути не могут быть проецированы на карту. Все это о гибкости Spring и их желании удовлетворить любые прихоти разработчиков, на мой взгляд.

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