要实现delete和put的约定或者是要实现过滤的条件:
1.请求方式必须为post
2.必须要有隐藏域,并且隐藏域的name属性 = “_method” value = "Delete/put"
一、在web.xml中配置过滤器
<!--配置过滤器-->
<filter>
<filter-name>HiddenHttpMethodFiler</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFiler</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
二、在前端表单设置好约定
要实现delete和put的约定或者是要实现过滤的条件:
1.请求方式必须为post
2.必须要有隐藏域,并且隐藏域的name属性 = “_method” value = "Delete/put"
<form action="handler/select/234" method="get">
<input type="submit" value="查询">
</form>
<form action="handler/update/345" method="post">
<input type="hidden" name="_method" value="DELETE"><%--设置隐藏域,用于实现DELETE方式提交--%>
<input type="submit" value="删除">
</form>
<form action="handler/delete/456" method="post">
<input type="hidden" name="_method" value="PUT"><%--设置隐藏域,用于实现PUT方式提交--%>
<input type="submit" value="修改">
</form>
三、在控制层
@RequestMapping(value = "update/{id}",method = RequestMethod.PUT)
public String update(@PathVariable("id") Integer id){
System.out.println("update:修改"+id);
return "success";
}
@RequestMapping(value = "delete/{id}",method = RequestMethod.DELETE)
public String delete(@PathVariable("id") Integer id){
System.out.println("delete:删除"+id);
return "success";
}
过滤器中 处理put|delete请求的部分源码:
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
HttpServletRequest requestToUse = request;
if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) {
String paramValue = request.getParameter(this.methodParam);
if (StringUtils.hasLength(paramValue)) {
requestToUse = new HttpMethodRequestWrapper(request, paramValue);
}
}
filterChain.doFilter(requestToUse, response);
}
原始请求:request,改请求默认只支持get post header
但是如果 是"POST" 并且有隐藏域 <input type="hidden" name="_method" value="DELETE"/>
则,过滤器 将原始的请求 request加入新的请求方式DELETE,并将原始请求 转为 requestToUse 请求(request+Delete请求)
最后将requestToUse 放入 请求链中, 后续再事情request时 实际就使用改造后的 requestToUse