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>