SpringMVC:学习笔记(3)——REST
了解REST风格
按照传统的开发方式,我们在实现CURD操作时,会写多个映射路径,比如对一本书的操作,我们会写多个URL,可能如下
web/deleteBookById
web/updateBookById
web/addBook
web/getBookById
....
但是由于很难形成统一的URL命名规范,导致了URL命名的混乱。REST是面向资源的,URL的设计只需要将资源通过合理方式暴露出来即可。比如:
web/book
web/dog
....
资源暴露出来了,如何实现传统开发方式的CURD呢?在REST设计规范中,只需将请求方法(GET:查询、POST:新增、PUT:修改、DELETE:删除)进行相对应的设置即可。
GET web/getDogs --> GET web/dogs 获取所有小狗狗
GET web/addDogs --> POST web/dogs 添加一个小狗狗
GET web/editDogs/:dog_id --> PUT web/dogs/:dog_id 修改一个小狗狗
GET web/deleteDogs/:dog_id --> DELETE web/dogs/:dog_id 删除一个小狗
SpringMVC如何识别REST请求
浏览器 form 表单只支持 GET与 POST 请求,而DELETE、PUT 等 method 并不支持。
Spring3.0 添加了一个过滤器,可以将这些请求转换为标准的 http 方法,使得支持 GET、POST、PUT 与DELETE 请求.这个过滤器就是HiddenHttpMethodFilter。过滤器的实现原理大致如下:检测请求参数中是否包含 _method这个参数,如果包含则获取其值,然后判断是哪种操作后继续传递:
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
//methodParam="_method";
String paramValue = request.getParameter(this.methodParam);
if("POST".equals(request.getMethod()) && StringUtils.hasLength(paramValue)) {
String method = paramValue.toUpperCase(Locale.ENGLISH);
HiddenHttpMethodFilter.HttpMethodRequestWrapper wrapper = new HiddenHttpMethodFilter.HttpMethodRequestWrapper(request, method);
filterChain.doFilter(wrapper, response);
} else {
filterChain.doFilter(request, response);
} }
实践
1.配置过滤器HiddenHttpMethodFilter
我们再之前说了,SpringMVC的HiddenHttpMethodFilter过滤器可以把POST请求转换为DELETE或PUT请求,所以我们先配置该过滤器。
2.在表单中携带隐藏域
说明:name="_method',value是具体的请求方法,DELETE、PUT、OPTION等;
3.在控制器中处理请求