spring 环境下,在修改用户页面时,提交到action 中post方法请求失败
如下为报错的部分提示:
org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodResolver.resolveHandlerMethod(AnnotationMethodHandlerAdapter.java:665)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:431)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
然后发现在controller中是用put接收的
@RequestMapping(value="/user/{id}/update",method = RequestMethod.PUT)
如果在controller改为post自然也是可以的,不过为了跟后面学习的REST挂钩,不建议使用post,那么问题就来了
浏览器本身只支持get和post方法,而DELETE、PUT等method并不支持,因此需要使用_method这个隐藏字段来告知spring这是一个put请求。所以type是不能变动的,否则浏览器不支持。 spring3.0添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持GET、POST、PUT与DELETE请求。
下面是我的解决方法
1.配置viewspace-servlet.xml
<!--
浏览器不支持put,delete等method,由该filter将xxx?_method=delete 或 xxx?_method=put 转换为标准的
http delete、put 方法
-->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<servlet-name>viewspace</servlet-name>
</filter-mapping>
2.在对应的Controller中,添加对应的请求注解
/** 显示 */
@RequestMapping(value="/{id}")
/** 编辑 */
@RequestMapping(value="/{id}/edit")
/** 保存新增 */
@RequestMapping(method=RequestMethod.POST)
/** 保存更新 */
@RequestMapping(value="/{id}",method=RequestMethod.PUT)
/** 删除 */
@RequestMapping(value="/{id}",method=RequestMethod.DELETE)
/** 批量删除 */
@RequestMapping(method=RequestMethod.DELETE)
3.请求页面
相信查询请求和更新请求都没什么问题,不过注意更新的时候使用PUT,添加时候使用POST
需要说说为什么?好呗,本来想简单讲一下,但是后来发现我的建议只是个编程习惯的样子。
现笔者推荐一篇PUT和POST讲解的文章,不是很明白的可点下方链接查看下
PUT 还是 POST ?
添加时:
<form action="${context}/user/save.html" method="post">
<table border="1px">
<tr>
……
</tr>
<tr>
<td align="center">
<input type="submit" value="保存">
<input type="reset" value="重置">
<input type="hidden" name="_method" value="POST">
</td>
</tr>
</table>
</form>
删除时:
<table border="1px">
<tr>
<td>序号</td><td>用户名</td><td>最后登录时间</td><td>操作</td>
</tr>
<c:forEach var="u" items="${userList}" varStatus="status">
<form id="form${status.count}" action="${context}/user/${u.userId}/delete.html" method="post">
<tr>
<td>${status.index+1}</td>
<td>
<a href="<c:url value="/user/${u.userId}.html"/>">${u.userName}</a>
</td>
<td>${u.lastVisit}</td>
<td>
<a href="<c:url value="/user/${u.userId}/edit.html"/>">编辑</a>
<a href="javascript:document.getElementById('form${status.count}').submit();">删除</a>
</td>
</tr>
<input type="hidden" name="_method" value="DELETE" />
</form>
</c:forEach>
</table>
备注:删除时注意也同样使用action
当我使用列表组件的时候,table中的内容都不是我写的,而我只是从后台调用了json数据,那么现在又怎么实现
DRY jQuery for RESTful PUT/DELETE links
呢?
Html
<a href="${context}/user/[userId]/edit.do" class="put" >编辑</a>
<a href="${context}/user/[userId]/delete.do" class="delete" >删除</a>
jQuery
$(document).ready(function() {
$(document).on("click",".delete",function(){
if(confirm('Are you sure?')) {
var f = document.createElement('form');
$(this).after($(f).attr({
method: 'post',
action: $(this).attr('href')
}).append('<input type="hidden" name="_method" value="DELETE" />'));
$(f).submit();
}
return false;
});
$(document).on("click",".put",function(){
var f = document.createElement('form');
$(this).after($(f).attr({
method: 'post',
action: $(this).attr('href')
}).append('<input type="hidden" name="_method" value="PUT" />'));
$(f).submit();
return false;
});});