文档章节

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

yope
 yope
发布于 2015/02/27 12:03
字数 816
阅读 221
收藏 0
点赞 0
评论 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
博文 38
码字总数 33640
作品 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

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

Spring中formdata方式提交json对象和file之一

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

亚林瓜子 ⋅ 06/12 ⋅ 0

Spring MVC

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

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

springmvc 基础内容

springmvc 基础内容 1.需要导入的包 commons-logging-1.2.jar spring-aop-4.1.6.RELEASE.jar spring-beans-4.1.6.RELEASE.jar spring-context-4.1.6.RELEASE.jar spring-core-4.1.6.RELEASE......

新年 ⋅ 2016/07/25 ⋅ 0

表单防重复提交

防止表单重复提交 介绍了使用 redirect 技术防止表单提交,但是 redirect 解决不了后退到表单页面时重复提交表单,为了解决这个问题,加入了 token 的机制。如果每个 form 相关的处理方法中都...

NotFoundException ⋅ 2015/09/06 ⋅ 0

SpringMvc表单使用

概述 在低版本的Spring中,你必须通过JSTL或spring:bind将表单对象绑定到HTML表单页面中,对于习惯了Struts表单标签的开发者来说,Spring MVC的这一表现确实让人失望。不过这一情况已经一去不...

小隐隐于市 ⋅ 2014/07/10 ⋅ 1

页面提交表单Form中的字符串数据转化为指定类型

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

云颖 ⋅ 2014/01/21 ⋅ 0

在用 Spring MVC 构建 RESTful API 时进行验证和异常处理

这一部分介绍一下我发现的在 Spring MVC 下进行输入处理以及验证信息反馈方面的一些思路。完整的示例代码见 GitHub。 区别请求对象和实体对象 目前我所构建的 spring boot 的服务都是 REST 风...

eisenxu ⋅ 2017/10/06 ⋅ 0

SpringMVC工作原理

标签: it 上面的是springMVC的工作原理图: 1、客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将...

LYQ1990 ⋅ 2016/05/31 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 22分钟前 ⋅ 0

Java学习路径及练手项目合集

Java学习路径及练手项目合集

颖伙虫 ⋅ 37分钟前 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

MVC——统一报文格式的异常处理响应

在我们写controller层的时候,常常会有这样的困惑,如果需要返回一个数据是,可能为了统一回去构造一个类似下列的数据格式: { status:true, msg:"保存成功!", data:[]} 而且在写...

alexzhu592 ⋅ 昨天 ⋅ 0

android -------- 打开本地浏览器或指定浏览器加载,打电话,打开第三方app

开发中常常有打开本地浏览器加载url或者指定浏览器加载, 还有打开第三方app, 如 打开高德地图 百度地图等 在Android程序中我们可以通过发送隐式Intent来启动系统默认的浏览器。 如果手机本身...

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部