Spring MVC – Как получить все параметры запроса на карте в controllerе Spring?
Пример URL:
../search/?attr1=value1&attr2=value2&attr4=value4
Я не знаю имена attr1, att2 и attr4.
Я хотел бы иметь возможность сделать что-то подобное (или подобное, все равно, до тех пор, пока у меня есть доступ к Map of request param name -> value:
- Spring @ExceptionHandler не работает с @ResponseBody
- Кодировка Spring MVC UTF-8
- Как вернуть пользовательский объект из запроса Spring JPA GROUP BY
- Добавление ContextLoaderListener в web.xml в Spring MVC
- 404 перенаправляет ошибку Spring с помощью java config
@RequestMapping(value = "/search/{parameters}", method = RequestMethod.GET) public void search(HttpServletRequest request, @PathVariable Map allRequestParams, ModelMap model) throws Exception {//TODO: implement}
Как я могу достичь этого с помощью Spring MVC?
- jackson 2.0 с весной 3.1
- Как отправлять данные POST JSON с помощью Curl из терминала / командной строки для тестирования Spring REST?
- Можно ли настроить SpringMVC для обработки всех запросов, но исключить каталоги статического содержимого?
- Как запретить людям выполнять XSS в Spring MVC?
- Автообработка двух компонентов, реализующих один и тот же интерфейс - как установить бонус по умолчанию для автоустройства?
- Возrotation сгенерированного pdf с использованием пружины MVC
- spring Exception при запуске приложения в WebSphere с java 8
- Как настроить встроенный Tomcat, интегрированный с Spring, для прослушивания запросов на IP-адрес, кроме localhost?
В то время как другие ответы правильны, это, конечно, не «путь 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 Контекстный объект.
Существует два интерфейса
-
org.springframework.web.context.request.WebRequest
-
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 и их желании удовлетворить любые прихоти разработчиков, на мой взгляд.
Я бы никогда не использовал карту для параметров пути, но это может быть весьма полезно для параметров запроса.