Вопрос:
В моем приложении Spring я делаю вот так..
Будет отправлена форма клика гиперссылки формы Jsp.
<form:form action=»user» modelAttribute=»NAME»> <a href=»href_form1″ onclick=»onClick_Save()» class=»save»>Save</a> </fomr:form> <script> function onClick_Save() { $(«#NAME»).attr(«action», $(‘.save’).attr(«href»)); $(«#NAME»).submit(); }); </script>
В моем классе контроллера я написал метод.
@RequestMapping(value = «href_form1», method = RequestMethod.POST) public @ResponseBody String href_form1(UserForm userForm,Model model)throws Exception { //Database code here. model.addAttribute(«NAME», userForm); return «User Updated»; }
EDIT1:
WARNING: Request method ‘GET’ not supported
и я получаю страницу с ошибкой.
HTTP Status 405 — Request method ‘GET’ not supported
ИЗМЕНИТЬ: после изменения кода, как показано ниже
<script> $(function() { $(‘.save’).on(«click»,function(e) { e.preventDefault(); $(«#NAME»).attr(«action», $(this).attr(«href»)).attr(«method»,»POST»); $(«#NAME»).submit(); }); }); </script>
Но моя форма не дойдет до моего метода контроллера.
Что-то не так в моем коде? Я также пробовал method=»POST» в теге формы.
Лучший ответ:
Вот причина, по которой вы получаете ошибку
Ссылка href вызывает контроллер при нажатии, потому что вы не отменяете действие по умолчанию ссылки
Таким образом, код выполняет следующие
- пытается установить действие формы в href ссылки
- пытается отправить указанную форму с помощью POST – это то, что я понимаю, чего вы хотите достичь.
- независимо от того, удастся ли это сделать, браузер сразу же следует за href ссылки, которая попытается вызвать контроллер с GET, поскольку ссылка будет делать, если onclick не прекратит это действие. Даже если код преуспел в POSTing форме, этот запрос будет убит новым запросом, который заканчивает выполнение GET
По-моему, у вас есть следующие возможности: некоторые из них, по-видимому, лучше других, чем другие.
Не-javascript
- Имейте параметр, который содержит идентификацию того, что вы хотите сохранить, и форму для каждого параметра
- измените свой метод spring на
method = { RequestMethod.GET, RequestMethod.POST} или
method = RequestMethod.GET – GET позволит вам избавиться от формы и просто иметь следующую ссылку (после обновления кода spring, конечно)
<a href=»href_link?user=user1″>Save User1</a>
если вы пожелаете
Поддержка JavaScript
Имейте параметр в форме, которая содержит идентификацию того, что вы хотите сохранить, установите ЭТО с помощью JavaScript и выполните ОБЯЗАТЕЛЬНО return false или preventDefault, чтобы отменить ссылку:
<!— this is an example of the rendered form —> <form action=»href_form1″ id=»NAME» method=»POST»> <input type=»hidden» name=»saveItem» id=»saveItem» value=»» /> </form> <a href=»#» class=»saveLink» data-save=»save item 1″>Save item 1</a> <a href=»#» class=»saveLink» data-save=»save item 2″>Save item 2</a> <a href=»#» class=»saveLink» data-save=»save item 3″>Save item 3</a>
Обратите внимание: у меня нет ссылки в href, чтобы не запрашивать что-то
jQuery для этого процесса:
$(function() { // assuming form ID=»NAME» $(«.saveLink»).on(«click»,function(e) { e.preventDefault(); // do not follow link $(«#saveItem»).val($(this).data(«save»)); // set the hidden field $(«#NAME»).submit(); }); });
Вот вам более интересный способ, предполагая, что ваши контроллеры spring подключены для обработки ваших запросов:
$(function() { $(‘.save’).on(«click»,function(e) { // passing event e.preventDefault(); // jQuery will normalise it for all modern browsers // post the href of the link to the server and return the result in a // container with ID result $.post($(this).attr(«href»), function(data) { // or $.get if you want $(‘#result’).html(data); }); }); Ответ №1
Вам нужно указать method в теге form. И да, ваша гиперссылка игнорирует форму. Поэтому установите атрибут action в форме на href_form1 и измените свою гиперссылку на ввод или (и я бы не рекомендовал этого), чтобы изменить вашу гиперссылку, чтобы сделать представление JavaScript. На данный момент у вас есть настройка onclick и href. Ниже приведена наилучшая практика.
<form:form action=»href_form1″ modelAttribute=»NAME» method=»POST»> <input type=»submit» value=»Save» />
Также ваш селектор jQuery $(«#NAME») не находит ничего, потому что вы не установили атрибут id в форме, которую хотите получить.
Ответ №2
Попробуйте что-то вроде этого
<form:form action=»href_form1″ modelAttribute=»NAME» method=»POST»> <input type=»submit»/> </form:form> @RequestMapping(value = «href_form1», method = RequestMethod.POST) public @ResponseBody String href_form1(UserForm userForm,Model model)throws Exception { //Database code here. model.addAttribute(«NAME», userForm); return «User Updated»; }
В принципе очень простая форма submit. Как только вы начнете работать, вы знаете, что ваша форма и контроллер настроены правильно. После этого, если вы хотите использовать тег привязки для отправки формы, вернитесь к более ранним предложениям, preventDefault и затем отправьте форму.
Надеюсь, что это поможет.
Ответ №3
Метод http по умолчанию для отправки формы – GET. Поскольку вы хотите POST, пожалуйста, укажите это, и он будет работать liek method=»POST»
Также я не вижу корректного отображения URL-кода в коде. Не могли бы вы подтвердить его правильность.