(1)第一种:ajax发post请求,HiddenHttpMethodFilter再将其转化成put请求。
配置HiddenHttpMethodFilter过滤器
<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>
jsp页面
$(document).on('click',"#user_update_btn",function(){
//1 验证输入的信息是否合法
//alert($("#update_user_modal form").serialize());//获取表单数据失败
console.log("表单数据为:"+$("#update_user_modal form").serialize()+",下面发送put请求");
//2 使用ajax发送put请求
$.ajax({
url:"${pageContext.request.contextPath}/user/"+$(this).attr("edit_id")+".do",
type:"post",
data:$("#update_user_modal form").serialize(),//输出修改模态框中表单的序列化结果:+"&_method=PUT"
success:function(result){
alert(result.msg);
//关闭对话框
//回到本页面
},
error:function(result){
console.log("请求失败");
}
})
})
控制器处理请求
/**
* 前端发送ajax-PUT请求,
* 要在web.xml中配置HttpPutFormContentFilter过滤器,
* 因为tomcat容器只能把post或get请求封进map,而springMVC的HttpPutFormContentFilter进行了增强,可以把其他类型(如put)的请求加进map
* @param user
* @return
*/
@RequestMapping(value="/user/{id}",method=RequestMethod.PUT)
@ResponseBody
public JasonMsg updateUser(User user,HttpServletRequest request){
System.out.println("请求方式_method:"+request.getParameter("_method"));
System.out.println("服务端接受的ajax_put传来的用户数据:"+user);//用户名跟密码都是null
userService.updateUser(user);
return JasonMsg.success();
}
模态框下的表单
mybatis映射文件中的update语句
<update id="updateUserByPrimaryKeySelective" parameterType="cn.hdu.entity.User">
update user set password=#{password} where id=#{id}
</update>
结果显示
(2)第二种:ajax直接发送put请求,让HttpPutFormcontentFilter识别它(推荐使用第二种ajax直接发送put请求)
配置httpPutFormcontentFilter过滤器
<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>
jsp页面ajax请求
表单
剩下的controller,sql等部分都不变
结果图
(3)最后总结一下注意事项:
使用jquery的serialize()序列化表单数据,虽然很方便,很直接的拿到表单所有数据,别忘了要序列化的值必须有name属性。
点击,查看serialize()方法详细说明文档