#java #spring #spring-mvc
#java — язык #весна #spring-mvc #java #spring
Вопрос:
У меня есть сложная HTML-форма, которая динамически создается с помощью Java script.
Я хочу получить карту пар ключ-значение в виде карты в java и сохранить их.
вот мой контроллер для получения отправленных данных.
@RequestMapping(value="/create", method=RequestMethod.POST,
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public String createRole(Hashmap<String, Object) keyVals) {
....
}
но моя карта пуста.
Как я могу получить данные формы в виде сопоставления пар имя-значение в контроллере Spring mvc?
Комментарии:
1. Добавьте
@RequestParam
в аргумент вашего метода.2. Я не знаю, как называется параметр! я нашел решение своей проблемы, опубликованное ниже.
3. Вам не нужно имя параметра, только аннотация.
@RequestParam
на карте типов будут указаны все параметры запроса.4. да, это сработало; Я только что протестировал ваше решение, все в порядке, и оно определенно лучше моего. Но есть проблема, при множественном выборе значений возвращается только первый выбранный элемент! не все выбранные значения!! когда я получаю параметры из HttpServletRequest, мультиселекты работают нормально! есть идеи??
5. Вместо
Map
использованияMultiValueMap
.
Ответ №1:
Вы также можете использовать @RequestBody
с MultiValueMap
, например
@RequestMapping(value="/create",
method=RequestMethod.POST,
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public String createRole(@RequestBody MultiValueMap<String, String> formData){
// your code goes here
}
Теперь вы можете получить имена параметров и их значения.
Многозначная карта находится в пакете Spring utils
Комментарии:
1. Я получаю проблему «Тип контента не поддерживается»
2. Убедитесь, что тип содержимого — application /x-www-form-urlencoded, что избавило от типа содержимого, который не поддерживается.
3. С моей стороны, я застрял, поскольку я перешел на Spring Boot 2.6. В полученной переменной @RequestBody нет данных.
Ответ №2:
Я только что нашел решение
@RequestMapping(value="/create", method=RequestMethod.POST,
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public String createRole(HttpServletRequest request) {
Map<String, String[]> parameterMap = request.getParameterMap();
...
}
таким образом, у меня есть карта представленных параметров.
Ответ №3:
Попробуйте это,
@RequestMapping(value = "/create", method = RequestMethod.POST,
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public String createRole(@RequestParam HashMap<String, String> formData) {
Ответ №4:
Приведенные выше ответы уже правильно указывают на то, что аннотация @RequestParam отсутствует. Просто чтобы добавить, почему это требуется,
Простой запрос GET был бы чем-то вроде :
http://localhost:8080/api/foos?id=abc
В контроллере нам нужно сопоставить параметр функции с параметром в запросе GET. Итак, мы записываем контроллер как
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam String id) {
return "ID: " id;
}
и добавьте @RequestParam для сопоставления параметра «id».
Комментарии:
1. Мне нравится отвечать на вопрос «почему», спасибо за это. ваше объяснение было бы улучшено, если бы оно было в контексте вопроса OP, в частности, запроса POST.