文档章节

spring mvc 把表单中的form转化为标准的http方法

yope
 yope
发布于 2015/02/27 12:03
字数 816
阅读 222
收藏 0

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>&nbsp;
                      <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;
  });});





© 著作权归作者所有

共有 人打赏支持
yope
粉丝 15
博文 40
码字总数 34264
作品 0
厦门
程序员
页面提交表单Form中的字符串数据转化为指定类型

页面提交表单Form中的字符串数据转化为指定类型,例如日期Date、枚举Gender等 1 使用Spring MVC提供的@InitBinder注解(从Spring MVC3.x开始) 2 在Controller中声明一个方法,使用WebDataBi...

云颖
2014/01/21
0
0
spring mvc的表单类型转换(custom property editor)

spring mvc的表单类型转换太强大了,目前用到了两个简单的, 一个是将表单中的file自动映射成byte[],这样文件上传(如果使用blob)就无需写任何代码了。 另一个是将表单中的yyyy-MM-dd格式映...

cyper
2012/10/28
0
2
Spring MVC-表单(Form)标签-复选框集合(Checkboxes)示例(转载实践)

以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_checkboxes.htm 说明:示例基于Spring MVC 4.1.6。 以下示例显示如何使用Spring Web MVC框架在表单中使用多个复选框。...

easonjim
2017/09/03
0
0
Spring MVC-表单(Form)标签-列表框(Listbox)示例(转载实践)

以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_listbox.htm 说明:示例基于Spring MVC 4.1.6。 以下示例显示如何使用Spring Web MVC框架在表单中使用Listbox。首先,...

easonjim
2017/09/04
0
0
Spring MVC

Spring MVC一、什么是 Spring MVC Spring MVC 属于 SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 里面,是一个强大灵活的 Web 框架。Spring MVC 提供了一个 DispatcherServlet ...

任任任任师艳
2017/11/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

No compiler is provided in this environment

maven 编译报错No compiler is provided in this environment 这个是由于maven在编译的过程中回使用到jdk ,它只会在环境变量中去寻找JAVA_HOME,如果没找到JAVA_HOME就会报这个错误。只要重...

优雅的胖子
10分钟前
0
0
(图文)最详细的XAMPP的安装及使用教程

XAMPP的安装及使用教程 1、简介 2、安装运行 3、配置Apache 4、配置MySQL 5、测试 6、修改MySQL默认密码 7、部署 XAMPP的安装及使用教程 1、简介 XAMPP(Apache+MySQL+PHP+PERL)是一个功能强...

梦梦阁
10分钟前
0
0
python 批量JSON数据,插入数据库

newList=[{"link":"https://www.1.com/","ga_tag":"xvideos","image":"http://static.2.mobi/views/images/xvideos.png?x-oss-process=style/120"},{"link":"https://www.3.com/","ga_tag":"......

Liens
13分钟前
0
0
mediarecord

mediarecorder what=268435556 -1007 解决方案 mPreviewSize = mCamera.getParameters().getPreferredPreviewSizeForVideo();...

zdglf
15分钟前
0
0
安装zookeeper和kafaka

安装zookeeper和kafaka http://mirrors.hust.edu.cn/apache/zookeeper/ http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.10/ http://mirrors.hust.edu.cn/apache/zookeeper/zoo......

蜗牛奔跑
16分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部