Метод сообщения не поддерживается

1

Я пытаюсь подключить форму к другой странице с помощью POST, но я продолжаю получать ошибку:

Request method 'POST' not supported

Мой метод handleNext в контроллере выглядит следующим образом:

@RequestMapping(value = PAGE_NAME, method = RequestMethod.POST)
public String handleNext(ModelMap map, HttpServletRequest request,
    @ModelAttribute("indexBacking") IndexBacking bo, BindingResult result) {
    return "redirect:/" + GameController.PAGE_NAME;

}

Метод GET на игровом контроллере выглядит так:

@RequestMapping(value = PAGE_NAME, method = RequestMethod.GET)
public String handleBasicGet(ModelMap map, HttpServletRequest request) {


    return MODEL_NAME;
}

Мой Web.xml выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.htm</url-pattern>
</servlet-mapping>
<session-config>
    <session-timeout>
        30
    </session-timeout>
</session-config>
<welcome-file-list>
    <welcome-file>redirect.jsp</welcome-file>
</welcome-file-list>
</web-app>

Любые идеи были бы замечательными.

ОБНОВЛЕНИЕ Индекс.jsp имеет следующую ссылку на вспомогательный объект

<form:form action="index.htm" enctype="multipart/form-data"
           method="post" commandName="indexBacking" accept-charset="UTF-8">
      <table id="main">
          ${page_contents}
          <tr>
              <td></td>
              <td>
                  <spring:bind path="name">     
                      <form:input path="name" value="Name" />
                      <form:errors cssClass="vmessage"
                                   element="div" path="name" />
                  </spring:bind>
              </td>
              <td>
                  <input type="submit" value="Submit" />
              </td>
              <td></td>
          </tr>
      </table>
  </form:form>

и фоновый объект, похоже, не задает здесь поля имени:

public class IndexBacking {
private String name;

/**
 * @return the name
 */
public String getName() {
    return name;
}

/**
 * @param name the name to set
 */
public void setName(String name) {
    this.name = name;
}

}
  • 0
    Значения GameController.PAGE_NAME и PAGE_NAME в handleBasicGet() совпадают? а с какого контроллера GET метод index.jsp ?
  • 0
    Моя форма JSP предназначена для перехода к «index.htm», который является PAGE_NAME indexController, что он и делает. PAGE_NAME в GameController - это game.htm, но он не будет вызываться unitl и перенаправлять в IndexController.
Теги:
spring
spring-mvc
jstl

3 ответа

2
Лучший ответ

Метод запроса "POST" не поддерживается

эта ошибка весны бросает, когда что-то не так:

  • Действие формы HTML имеет некоторый URL-адрес с методом POST и у вас нет каких-либо методов контроллера для обработки запроса POST на этот URL-адрес.
  • отсутствует или недействителен @ModelAttribute в методе обработчика POST.

подходит к

объект backing, похоже, не задает здесь поля имени:

внутри <spring:bind вы должны использовать status объект, например:

  • status.value : получить фактическое значение компонента или свойства.
  • status.expression : выражение, которое использовалось для извлечения компонента или свойства.
  • status.errorMessages : массив сообщений об ошибках, возникающих в результате проверки

И не нужно использовать <spring:bind.. когда вы используете <form:form.., оба почти выполняют одно и то же задание, а <spring:bind.. используется для выполнения некоторых настраиваемых операций. Поэтому выберите один из <form:sorm.. & <spring:bind..

в вашем случае вы можете исправить вашу проблему, используя <spring:bind.. like:

<c:url value="/indexBackingUrl" var="pstUrl"/>
<form action="${pstUrl}"  method="post" >
      <table id="main">          
          <tr>
              <td></td>
              <td>Name: 
              <spring:bind path="indexBacking.name">                
                  <input type="text"
                        name="${status.expression}"                                                         
                            value="${status.displayValue}"/>                      
                            <c:if test="${status.error}">
                                Error codes:
                                <c:forEach items="${status.errorMessages}" var="error">
                                    <c:out value="${error}"/>
                                </c:forEach>
                            </c:if>
                </spring:bind>
              </td>
              <td>
                  <input type="submit" value="Submit" />
              </td>
              <td></td>
          </tr>
      </table>
  </form>

ПРИМЕЧАНИЕ: атрибут name важен во входном элементе, потому что пружина связывает значение свойства bean с использованием имени элемента ввода.

ИЛИ используя <form:form.. без <spring:bind.. подобный:

<form:form action="${pstUrl}" method="post" modelAttribute="indexBacking">  
    <form:label path="name">Name:</form:label>
    <form:input path="name"/>
    <form:errors path="name" element="div"/>
</form:form>

и в методе обработчика GET контроллера добавьте IndexBacking компонента IndexBacking с ключом как indexBacking чтобы сделать работу <spring:bind.. in jsp like:

@RequestMapping(value="/indexBackingUrl", method = RequestMethod.GET)
    public String handleNext(Model model) {
        model.addAttribute("indexBacking", new IndexBacking("Jon"));
        return "indexBacking";

    }

и метод обработчика POST в контроллере будут выглядеть так:

@RequestMapping(value="/indexBackingUrl", method = RequestMethod.POST)
    public String handleNextPost(ModelMap map, HttpServletRequest request,
            @ModelAttribute("indexBacking") IndexBacking bo, BindingResult result) {

        System.out.println(bo);
        return "redirect:/someOtherUrl";
    }

Изменить: когда вы используете enctype="multipart/form-data" в форме, вам необходимо зарегистрировать CommonsMultipartResolver bean, а commons-io-xxjar & commons-fileupload-xxxjar должен быть доступен для работы с привязкой к весне, иначе вы получите null значение. В вашем случае enctype="multipart/form-data" не требуется, поскольку вы не используете загрузку файлов и т.д.


Смотрите также:
  • 0
    Brilliant! Благодарю. Проблема была с заголовком формы. Все, что я сделал, это удалил биты enctype и accept-charset, и это сработало! Все остальное тоже самое. Не уверен, почему это может вызвать проблемы у вас?
  • 0
    @Jon, когда ваша форма использует enctype="multipart/form-data" вам необходимо зарегистрировать компонент CommonsMultipartResolver и необходимые файлы CommonsMultipartResolver которые также должны быть доступны в CLASSPATH для связывания многокомпонентных данных.
Показать ещё 1 комментарий
2

если вы используете return "redirect:/" + GameController.PAGE_NAME; к другому контроллеру, а затем указан полный URL-адрес этого контроллера. Прямо сейчас вы перенаправляетесь на тот же контроллер, а не на другой контроллер.

  • 0
    Да, потому что я хочу поработать с текущим контроллером, прежде чем перемещать игровой контроллер. Он прекрасно подходит для метода POST, но, похоже, игнорирует установщик в объекте поддержки. Получатель вызывается при загрузке страницы, но не установщик.
2

Я думаю, что вы перенаправляете URL-адрес с контроллера handleNext, используя метод post, но целевой контроллер (тот, на который перенаправлено сообщение) имеет только метод Get, поэтому измените сообщение, чтобы опубликовать его в Game Control и повторите попытку. дайте мне знать по любым вопросам.

  • 0
    Спасибо, это была хорошая идея, теперь она входит в игровой контроллер, но не сохраняет поле имени (см. Обновление к вопросу). Вы знаете, почему это будет? +1
  • 0
    когда вы используете spring: bind, зачем снова связывать ru с именем пути, используйте его только один раз, как показано ниже <spring: bind path = "name"> <input type = "text" value = "Name" /> </ spring: bind> <form: errors cssClass = "vmessage" element = "div" path = "name" />
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню