2013-12-24 2 views
0

Короче говоря, у меня есть проект Spring 3.1 MVC, и мой контроллер не отвечает на запрос POST, когда я нажимаю кнопку отправки.Контроллер Spring MVC не отвечает на POST из формы

Нет ошибки, просто нет ответа. Метод контроллера не вызывается. У меня есть журнал в методе, который отображает сообщение INFO, и ничего не отображается (отображаются другие сообщения INFO). MVC работает (по крайней мере, частично), потому что я получаю ответ от «домашней» JSP-страницы, но ничего не делает для POST.

Я включаю вещи, которые кажутся важными; скажите, есть ли что-то, что вы хотели бы видеть. Класс

Контроллер:

@Controller 
@RequestMapping("/register") 
public class EditorController { 
... 

    @RequestMapping(method = RequestMethod.POST) 
    public String addEditorFromForm(@Valid Editor editor, 
      BindingResult bindingResult) throws ClassNotFoundException, 
      IOException { 

     if (LOG.isInfoEnabled()) { 
      LOG.info("In addEditorFromForm()"); 
     } 

     // Form did not validate 
     if (bindingResult.hasErrors()) { 
      return "register/first_time"; 
     } 

     getEditorDao().saveEditor(editor); 

     // New editor still needs to login 
     return "home"; 
    } 

} 

WEB-INF/просмотров/регистрация/first_time.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<link rel="stylesheet" type="text/css" href="<c:url value='/resources/css/base.css' />"> 
<title>Register for DIY Doctrine</title> 
</head> 
<body class="center"> 

<h2>Sign up for DIY Doctrine</h2> 

<sf:form method="POST" modelAttribute="editor"> 
<fieldset> 
    <table cellspacing="0"> 
     <tr> 
      <th><label for="username">Username:</label></th> 
      <td><sf:input path="username" size="30" id="username"/></td> 
     </tr> 

     <tr> 
      <th><label for="user_password">Password:</label></th> 
      <td><sf:password path="password" size="30" showPassword="false" 
       id="user_password"/> 
     </td> 
     </tr> 
    </table> 
</fieldset> 
<input type="submit" value="Submit Registration" /> 
</sf:form> 
</body> 
</html> 

Вы получаете register/first_time.jsp от этого метода в контроллере:

@RequestMapping(value = "first_time") 
    public String displayForm(Model model) { 
     if (LOG.isInfoEnabled()) { 
      LOG.info("In displayForm()"); 
     } 
     model.addAttribute(new Editor()); 
     return "register/first_time"; 
    } 

Это заголовки, возвращенные при нажатии кнопки отправки в.:

Request URL:http://localhost:8080/doctrine/register/first_time 
Request Method:POST 
Status Code:200 OK 
Request Headersview source 
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8,sl;q=0.6 
Cache-Control:max-age=0 
Connection:keep-alive 
Content-Length:34 
Content-Type:application/x-www-form-urlencoded 
Cookie:JSESSIONID=08209E778F63429CFA031A1DB53491DD 
Host:localhost:8080 
Origin:http://localhost:8080 
Referer:http://localhost:8080/doctrine/register/first_time 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.41 Safari/537.36 
Form Dataview sourceview URL encoded 
username:ngeorgewitz 
password:1234 
Response Headersview source 
Content-Language:en-US 
Content-Length:950 
Content-Type:text/html;charset=ISO-8859-1 
Date:Tue, 24 Dec 2013 20:28:19 GMT 
Server:Apache-Coyote/1.1 
+0

Где находится URL-адрес на странице JSP, введите url? – Zeus

+0

@zeus Если вы не указали атрибут 'action', POST будет отправлен на текущий URL-адрес. –

+1

Да ... и я предполагаю, что проблема в том, что на этой странице есть текущий URL-адрес чего-то типа/home. Если это так, то решение должно указать атрибут действия. –

ответ

2

Если изменить этот

@RequestMapping(value = "first_time") 

в

@RequestMapping(value = "first_time", method = RequestMethod.GET) 

вы получите 405 Method Not Allowed при подаче формы.

Если не указать атрибут action к <form> элементу, как вы делаете здесь

<sf:form method="POST" modelAttribute="editor"> 

браузер обычно сделает запрос на то, что URL он сделал свой предыдущий запрос.

Вы сделали свой предыдущий запрос, а достают,

some-host:[some-port]/your-context/first_time 

При отправке формы, браузер делает запрос POST снова

some-host:[some-port]/your-context/first_time 

Поскольку вы не указали method на @RequestMapping, он обрабатывает все типы методов запроса и, следовательно, обрабатывает этот POST.

Простым решением является указание атрибута action на <form>.

+0

Мне потребовалось некоторое время, чтобы выяснить, какой атрибут действия должен быть, но я приземлился на 'action =" update "и в методе' addEditorFromForm() ' , '@RequestMapping (value =" update ", method = RequestMethod.POST)'. Оказывается, действие дает мне URL-адрес 'http: // my_host: 8080/my_context/register/update', который я хотел, чтобы мой метод мог находиться в классе EditorController. – ksnortum

Смежные вопросы