Я пытаюсь подключить форму к другой странице с помощью 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;
}
}
Метод запроса "POST" не поддерживается
эта ошибка весны бросает, когда что-то не так:
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"
не требуется, поскольку вы не используете загрузку файлов и т.д.
enctype="multipart/form-data"
вам необходимо зарегистрировать компонент CommonsMultipartResolver
и необходимые файлы CommonsMultipartResolver
которые также должны быть доступны в CLASSPATH для связывания многокомпонентных данных.
если вы используете return "redirect:/" + GameController.PAGE_NAME; к другому контроллеру, а затем указан полный URL-адрес этого контроллера. Прямо сейчас вы перенаправляетесь на тот же контроллер, а не на другой контроллер.
Я думаю, что вы перенаправляете URL-адрес с контроллера handleNext, используя метод post, но целевой контроллер (тот, на который перенаправлено сообщение) имеет только метод Get, поэтому измените сообщение, чтобы опубликовать его в Game Control и повторите попытку. дайте мне знать по любым вопросам.
GameController.PAGE_NAME
иPAGE_NAME
вhandleBasicGet()
совпадают? а с какого контроллера GET методindex.jsp
?