文档章节

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

yope
 yope
发布于 2015/02/27 12:03
字数 816
阅读 224
收藏 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中formdata方式提交json对象和file之一

问题 想使用vue-resource表单提交方式到spring,这个表单中包含json对象和file对象。 思路 将json对象和file对象都放到表单提交方式里面的中,并在中指定内容格式。 步骤 Spring实现和配置 ...

亚林瓜子
06/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mac OS 最强鼠标改键软件:BetterAndBetter

官网: http://www.better365.cn 话不多说,先上你们最喜欢的软件界面截图。 通用: 触摸板: 鼠标: 键盘: 情景模式: 文本跳窗(自动跳窗): 四角触发: 工具箱: 脚本: 关于: 说下我目...

故国有明
39分钟前
16
0
Hbase Schema 模型设计注意事项及示例

一、Hbase 数据模型概述 HBase的数据模型也是由表组成,每一张表里也有数据行和列,但是在HBase数据库中的行和列又和关系型数据库的稍有不同。 表(Table): HBase会将数据组织成一张表,表名必...

PeakFang-BOK
今天
6
0
Blockathon(2018)上海竞赛项目成果今天揭晓

开幕式现场 10月19日,Blockathon(2018)上海在黄浦区P2联合创业办公社举行,本次活动由50名区块链开发者组成9支参赛队伍,来自国内外优秀区块链开发团队的20名技术专家担任导师及裁判。9支队...

HiBlock
今天
6
0
微信小程序开发系列六:微信框架API的调用

微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发...

JerryWang_SAP
今天
12
0
5 个用 Python 编写 web 爬虫的方法

大家在读爬虫系列的帖子时常常问我怎样写出不阻塞的爬虫,这很难,但可行。通过实现一些小策略可以让你的网页爬虫活得更久。那么今天我就将和大家讨论这方面的话题。 我刚整理了一套2018最新...

糖宝lsh
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部