spring mvc 把表单中的form转化为标准的http方法
博客专区 > yope 的博客 > 博客详情
spring mvc 把表单中的form转化为标准的http方法
yope 发表于3年前
spring mvc 把表单中的form转化为标准的http方法
  • 发表于 3年前
  • 阅读 213
  • 收藏 0
  • 点赞 0
  • 评论 0
摘要: spring mvc 把表单中的form转化为标准的http方法 ,spring mvc 支持 http 的put和delete方法

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





共有 人打赏支持
粉丝 15
博文 35
码字总数 32773
×
yope
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: