(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中的过滤器配置

<!-- 使用restful风格的url,这里将普通页面的post请求转为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>*.do</url-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写的好好的

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

于是乎,就有疑问了:
发送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过滤器

<!-- 处理put等请求 -->
    <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>*.do</url-pattern>
    </filter-mapping> 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值