Як явно отримати дані про публікації у Spring MVC?


82

Чи є спосіб отримати самі дані пошти? Я знаю, що Spring обробляє прив’язку даних поштових скриньок до об’єктів Java. Але, з огляду на два поля, які я хочу обробити, як я можу отримати ці дані?

Наприклад, припустимо, моя форма мала два поля:

 <input type="text" name="value1" id="value1"/>
 <input type="text" name="value2" id="value2"/>

Як я можу отримати ці значення у своєму контролері?

Відповіді:


135

Якщо ви використовуєте один із вбудованих екземплярів контролера, то одним із параметрів методу вашого контролера буде об’єкт Request. Ви можете зателефонувати, request.getParameter("value1")щоб отримати значення даних POST (або PUT).

Якщо ви використовуєте анотації Spring MVC, ви можете додати анотований параметр до параметрів вашого методу:

@RequestMapping(value = "/someUrl")
public String someMethod(@RequestParam("value1") String valueOne) {
 //do stuff with valueOne variable here
}

1
це працює з кількома параметрами запитів, це правильно? Вам не потрібно загортати в один предмет? stackoverflow.com/q/12862320/106261
ним Чімпскі

1
<3 це для випадків, коли ви не хочете / не потребуєте форми з підтримкою моделі (для форми пошуку, форми для контактів тощо)
Дон Чідл,

38

Іншою відповіддю на точне запитання OP є встановлення consumesтипу вмісту, "text/plain"а потім декларування @RequestBody Stringвхідного параметра. Це передасть текст даних POST як оголошену Stringзмінну ( postPayloadу наступному прикладі).

Звичайно, це передбачає, що ваше корисне навантаження POST - це текстові дані (як було зазначено в ОП).

Приклад:

    @RequestMapping(value = "/your/url/here", method = RequestMethod.POST, consumes = "text/plain")
    public ModelAndView someMethod(@RequestBody String postPayload) {    
        // ...    
    }

3
Це відповідь, яку я шукав. Під "даними пошти" я розумію те саме. Дякую!
mauromartini

Для кількох параметрів постів (таких як value1і value2, це створило б один рядок для обох значень? Тоді вам потрібно було б проаналізувати окремі значення? Навіщо це робити, коли ви можете вказати / отримати кожне значення окремо, як у прийнятій відповіді?
Дон Чідл

1
@mmcrae - це просто ще один спосіб вирішити проблему, і, можливо, корисний іншим користувачам, які не мають декількох параметрів POST, а натомість просто мають крапку тексту або двійкові дані. Це була моя ситуація, і це те, про що я сподівався дізнатися, коли натиснув на це питання.
simon

1
Саме те, що я шукав. Він також працює з Consumes = "application / json", якщо публікує json.
Маніш

Привіт. Я використовую Postman для тестування свого API. Листоноша допомагає мені заповнити тіло для POST даними. Проблема в тому, що я отримую 403, коли використовую RequestMethod.POST. Я навіть додав, @CrossOrigin(origins = "*")але все одно отримую те саме ... Не знаю, що відбувається ... Я використав той самий підпис, що і ваша відповідь (за винятком того, що someMethodповертає a Stringу моєму випадку) ...
Курт Міллер

27

Spring MVC працює поверх API сервлетів. Отже, ви можете використовувати HttpServletRequest#getParameter()для цього:

String value1 = request.getParameter("value1");
String value2 = request.getParameter("value2");

Файл HttpServletRequestвже повинен бути доступний для вас у Spring MVC як один із аргументів handleRequest()методу.


1
Хай @BalusC, у моєму випадку у мене є понад 20 змінних у запиті. Однак у мене є компонент з усіма змінними параметра parameter. Тепер я хочу отримати всі значення в bean із запиту, а не отримувати одне за одним. Ми маємо цю функцію в struts2 за допомогою "ModelDrivenBean". Чи є у нас така функція у весняних рамках.
vissu

2
Так, за допомогою анотації @ModelAttribute та компонента, що підтримує форму. Це посилання чудово описує, як це зробити: viralpatel.net/blogs/2010/07/spring-3-mvc-handling-forms.html

@vissu, якщо у вас більше 20 змінних, вам слід поглянути на спрощення
CodeMonkey

1
Привіт BalusC. Після відповіді Сімона нижче, я використовую Postman для тестування свого API. Листоноша допомагає мені заповнити тіло для POST даними. Проблема в тому, що я отримую 403, коли використовую RequestMethod.POST. Я навіть додав, @CrossOrigin(origins = "*")але все одно отримую те саме ... Не знаю, що відбувається ... Я використав той самий підпис, що і ваша відповідь (за винятком того, що someMethodповертає a Stringу моєму випадку) ...
Курт Міллер

0

Ви можете просто передати потрібний атрибут без будь-яких анотацій у своєму контролері:

@RequestMapping(value = "/someUrl")
public String someMethod(String valueOne) {
 //do stuff with valueOne variable here
}

Працює з GET та POST

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.