Может ли Spring MVC обрабатывать запросы из HTML-форм, отличных от POST и GET? - PullRequest
10 голосов
/ 06 декабря 2010

Spring 3 MVC поддерживает все 4 метода RESTful: GET, POST, PUT и DELETE. Но поддерживает ли его технология представления их в формах? Если нет, то как в действительности используется атрибут method в теге form:form?

Я пытался использовать метод PUT в форме:

<form:form action="/myaction" method="PUT">
   ...
</form:form>

Сгенерированный HTML был:

<form id="command" action="/myaction" method="post">
   <input type="hidden" name="_method" value="PUT"/>
   ...
</form>

Это понятно, поскольку большинство браузеров не поддерживают другие методы, кроме GET и POST . Но Spring может обработать это с помощью дополнительного input с именем _method и значением METHOD_NAME. Является ли?

Когда я отправляю указанную форму в метод контроллера, помеченный

@RequestMapping(method=RequestMethod.PUT)

заявляет, что метод запроса POST не поддерживается. Но почему POST, а не PUT? Что на самом деле происходит под капотами?

1 Ответ

18 голосов
/ 06 декабря 2010

Использование «скрытого параметра», называемого _method, не относится к библиотеке тегов Spring MVC, но также используется некоторыми другими клиентскими платформами. Весна просто следует соглашению, как оно есть.

Чтобы использовать это правильно, вам необходимо добавить фильтр к вашему web.xml, (HiddenHttpMethodFilter, см. javadoc ), который превращает параметр _method в «настоящий» HTTP Метод представления в HttpServletRequest. Это сделано в качестве фильтра, чтобы подчеркнуть тот факт, что отсутствие PUT и DELETE является проблемой браузера - API сервлета это прекрасно поддерживает.

Так что, если вы хотите использовать эти методы в своей форме, вам нужно добавить этот фильтр.

P.S. Причина, по которой вы получаете сообщение «POST не поддерживается», заключается в том, что ваша форма использует POST, а ваш обработчик помечен PUT, поэтому он не совпадает. Поскольку фильтр не определен, параметр _method игнорируется.

...