在学习SpringMVC的时候,基于REST风格的代码在方便我们开发的同时,也带来了许多的坑。最典型的坑就是在写基于Springmvc CRUD的更新操作时,前台表单通过POST请求提交数据给后台,后台基于REST风格的代码是需要接受PUT请求的,所以不处理POST请求转变为PUT请求,后台控制器会出现null值的情况。下面总结一下将POST请求转化为PUT请求的解决方案。
1)借助HiddenHttpMethodFilter,来讲POST请求转化为PUT请求
在web.xml中添加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>
然后在前端form表单中,只需要添加如下关键代码,即可通过HiddenHttpMethodFilter来讲POST请求转化为PUT请求,即可满足基于REST风格的URI。
<input type="hidden" name="_method" value="PUT"/>
后台代码控制器中,就可避免出现null值的问题了。
@RequestMapping(value="/xxx", method=RequestMethod.PUT)
public String update(Vo vo){
...
return "xxx";
}
2)(使用jquery的ajax请求)type为post
在ajax请求中,可以这样将POST请求转化为PUT请求,这一转化过程还是要借助于HiddenHttpMethodFilter。
$.ajax({
url:xxx,
type:"POST",
data:xxx+"&_method=PUT",
success:function(result){
xxx
}
});
3)(使用jquery的ajax请求)type为put
需要使用新的filter;在web.xml中添加如下filter:
<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({
url:xxx,
type:"PUT",
data:xxx,
success:function(result){
xxx
}
});