Spring MVC – Как получить все параметры запроса на карте в controllerе 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 allRequestParams, ModelMap model) throws Exception {//TODO: implement} 

Как я могу достичь этого с помощью Spring MVC?

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

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

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

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

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

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

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

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

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

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

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

 Map parameters = request.getParameterMap(); 

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

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

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

  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 getAll(WebRequest webRequest){ Map params = webRequest.getParameterMap(); //... } 

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

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

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

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

  @RequestMapping(value="submitForm.html", method=RequestMethod.POST) public ModelAndView submitForm(@RequestParam Map 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 с переменными имен и электронной почты соответственно.

Существует фундаментальное различие между параметрами запроса и параметрами пути. Это www.your_domain?queryparam1=1&queryparam2=2 следующим образом: www.your_domain?queryparam1=1&queryparam2=2 – параметры запроса. www.your_domain/path_param1/entity/path_param2 – параметры пути.

То, что я нашел удивительным, это то, что в весеннем мире MVC многие люди путают друг друга. Хотя параметры запроса больше похожи на критерии поиска, параметры пути, скорее всего, однозначно идентифицируют ресурс. Сказав это, это не означает, что вы не можете иметь несколько параметров пути в своем URI, потому что структура ресурсов может быть вложенной. Например, предположим, что вам нужен конкретный автомобильный ресурс конкретного человека:

www.my_site/customer/15/car/2 – ищет второй автомобиль 15-го клиента.

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

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

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

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

  • @RequestParam vs @PathVariable
  • Как ответить с ошибкой HTTP 400 в методе Spring MVC @ResponseBody, возвращающем String?
  • Получить кодировку параметров
  • Регистрация фаз (прототип) во время выполнения весной
  • Spring: namespace vs contextConfigИнтересные параметры размещения в web.xml
  • Преобразование типа Spring MVC: PropertyEditor или Converter?
  • Нет типов Spring WebApplicationInitializer, обнаруженных на пути к classам
  • Spring web, security + web.xml + mvc dispatcher + Bean создается дважды
  • Возвращает только строковое сообщение от Spring MVC 3 Controller
  • Как включить js и CSS в JSP с помощью Spring MVC
  • CharacterEncodingFilter не работает вместе с Spring Security 3.2.0
  • Давайте будем гением компьютера.