(7)ajax发送put请求问题

ajax发送post请求,服务器警告: Request method ‘POST’ not supported。
这里写图片描述
为什么会就不能像发送get请求那样,舒舒服服的得到预期的效果呢?

(1)下面往下看

1 给出jsp页面发送ajax请求的代码

$(document).on('click',"#user_update_btn",function(){
        //1 验证输入的信息是否合法
        alert('修改中...');
        //2 使用ajax发送put请求
        $.ajax({
            url:"${pageContext.request.contextPath}/user/"+$(this).attr("edit_id")+".do",
            type:"POST",
            data:$("#update_user_model from").serialize(),//输出修改模态框中表单的序列化结果:
            success:function(result){
                alert(result.msg);
                //关闭对话框

                //回到本页面
            }
        })
    })

2 controller中处理的请求代码

@RequestMapping(value="/user/{id}",method=RequestMethod.PUT)
    @ResponseBody
    public JasonMsg updateUser(User user,HttpServletRequest request){
        System.out.println("请求体中的password值:"+request.getParameter("password"));
         System.out.println(user);//用户名跟密码都是null
         userService.updateUser(user);
         return JasonMsg.success();
    }

3 web.xml中的过滤器配置


    <filter> 
        <filter-name>HiddenHttpMethodFilter filter-name> 
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class> 
    filter> 
    <filter-mapping>
        <filter-name>HiddenHttpMethodFilter filter-name> 
        <url-pattern>*.dourl-pattern>
    filter-mapping>

4 当我在加上_method=put,发送的post请求就可以被成功响应了

$(document).on('click',"#user_update_btn",function(){
        //1 验证输入的信息是否合法
        alert('修改中...');
        //2 使用ajax发送put请求
        $.ajax({
            url:"${pageContext.request.contextPath}/user/"+$(this).attr("edit_id")+".do",
            type:"POST",
            data:$("#update_user_model from").serialize()+"&_method=PUT",//输出修改模态框中表单的序列化结果:
            success:function(result){
                alert(result.msg);
                //关闭对话框

                //回到本页面
            }
        })
    })

contoller处理请求代码与上面给出的一样,但是输出却让我大失所望呀

这里写图片描述
请求体中的password值:null
User [id=5, username=null, password=null],

另外,还赠送给我一个Exception:
这里写图片描述
明明我的mybatis映射文件的sql写的好好的

id="updateUserByPrimaryKeySelective" parameterType="cn.hdu.entity.User">
        update user into password=#{password} where id=#{id}
    

于是乎,就有疑问了:
发送ajax请求的时候,data里面的数据是正常,而controller却拿不到这个数据(除了路径中的数据id),这是谁在搞鬼呢?
(2)当直接发送ajax的put请求时
jsp页面

$.ajax({
            url:"${pageContext.request.contextPath}/user/"+$(this).attr("edit_id")+".do",
            type:"PUT",
            data:$("#update_user_model from").serialize(),//输出修改模态框中表单的序列化结果:
            success:function(result){
                alert(result);
            }
        })

运行之后,服务器报错

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'into password=null where id=5' at line 1

除了id之外,服务器接收的其他数据权威null,所以sql语句会报错。
总之,问题是:
直接发送ajax=put请求,请求体中有数据,
但是User对象封装不上数据,导致controller得到除了id不为null,其他字段全是null的数据,
然后根据id给非空的字段password赋值为null,数据库就当然不愿意了
update user into password=null where id=#{id}
(3)接着就来分析原因
罪魁祸首就是tomcat了。
tomcat首先将请求体中的数据存进map里,然后服务器可以利用request.getParameter(“”)拿到map中的数据,但是这只对get或post请求有效
而springMVC封装POJO的时候,只是调用tomcat的request对象,使用request.getParameter(“”)拿到数据,而经过我测试,还是得不到我从jsp页面传来的参数,所以得出结论:tomcat识别不了put请求,就不存在存数据到map中的过程。
(4)那怎么办呢?

配置HttpPutFormContentFilter过滤器


    <filter> 
        <filter-name>HttpPutFormContentFilter filter-name> 
        <filter-class>org.springframework.web.filter.HttpPutFormContentFilterfilter-class> 
    filter> 
    <filter-mapping>
        <filter-name>HttpPutFormContentFilter filter-name> 
        <url-pattern>*.dourl-pattern>
    filter-mapping> 

你可能感兴趣的:(前端基础)