zoukankan      html  css  js  c++  java
  • spring mvc 坑之PUT,DELETE方法接收不到请求参数

    https://www.cnblogs.com/roobtyan/p/9576685.html

    原因:

     Tomcat处理参数的问题:

       1.将请求体中的数据,封装成一个map
        2.request.getParameter("id")就会从这个map中取值
        3.SpringMvc封装POJO对象的时候, 会把POJO中每个属性的值进行request.getParamter();
        4.AJAX发送PUT,DELETE请求引发的PUT,DELETE请求,请求体中的数据,request.getParamter()拿不到
       Tomcat一看是PUT,DELETE就不会封装请求体中的数据为map,只有POST形式的请求才封装请求为map。

    解决方案

    这个问题有两种解决方案,第一种比较复杂,第二种比较简单,正常我们肯定是使用第二种的,当然并不排除使用第一种方式的场景.

    方案一

    • 配置web.xml文件
    • 将POST请求转发为put/delete请求
    <!--使用Rest风格的URI-->
    <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

      

    在发送Ajax请求的时候,使用如下的格式:

    $.ajax({
        url: "${pageContext.request.contextPath}/emp/" + id,
        type: "POST",
        data: $("#app form").serialize() +"&_method=PUT",
        success: function (result) {
            alert("操作成功!");
        }
    });
    

      

    可以看到不同的地方,首先配置HiddenHttpMethodFilter,这个类可以把POST转换成对应的_method=?的?号中的内容,从而实现请求.当然每次写Ajax请求的时候,都需要协商method字段,便于解析.

    方案二

    方案二就比较简单了.只需要一个简单的web.xml的配置.

    <!--配置SpringMVC,把PUT或者DELETE请求转换成POST-->
    <filter>
        <filter-name>HttpPutFormContentFilter</filter-name>
        <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HttpPutFormContentFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

      

    或者

    <!-- 解决ajax put delete请求过滤 -->
        <filter>
    		<filter-name>HiddenHttpMethodFilter</filter-name>
    		<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    	</filter>
     
    	<filter-mapping>
    		<filter-name>HiddenHttpMethodFilter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    

      

    然后就可以很自然的使用Ajax请求而不需要做任何的处理.

    $.ajax({
        url: "${pageContext.request.contextPath}/emp/" + id,
        type: "PUT",
        data: $("#app form").serialize(),
        success: function (result) {
            alert("操作成功!");
        }
    });
    

      

  • 相关阅读:
    perl学习笔记之:正则表达式
    POJ 3436 ACM Computer Factory (拆点+输出解)
    POJ 3436 ACM Computer Factory (拆点+输出解)
    POJ 1637 Sightseeing tour ★混合图欧拉回路
    POJ 1637 Sightseeing tour ★混合图欧拉回路
    POJ 1149 PIGS ★(经典网络流构图)
    POJ 1149 PIGS ★(经典网络流构图)
    HDU 4571 Travel in time ★(2013 ACM/ICPC长沙邀请赛)
    HDU 4571 Travel in time ★(2013 ACM/ICPC长沙邀请赛)
    UPC 2224 Boring Counting ★(山东省第四届ACM程序设计竞赛 tag:线段树)
  • 原文地址:https://www.cnblogs.com/achengmu/p/11062073.html
Copyright © 2011-2022 走看看