REST
1、简单介绍
REST:即 Representational State Transfer,(资源)表现层状态转化。是目前最流行的一种互联网软件架构,它结构清晰、符合标准、易于理解、扩展方便,正得到越来越多的网站的使用。
它是面向资源的,而资源通过URI进行暴露。
URI 的设计只要负责把资源通过合理方式暴露出来就可以了。对资源的操作与它无关,操作是通过 HTTP动词来体现,所以REST 通过 URI 暴露资源时,会强调不要在 URI 中出现动词。
2、REST中四种表示操作方式的动词
GET 用来获取资源
POST 用来新建资源(也可以用于更新资源),
PUT 用来更新资源,
DELETE 用来删除资源
3、URI示例
- /orders HTTP/GET (列表页)
- /order/1 HTTP GET:得到id=1的order (回显页)
- /order/1 HTTP DELETE:删除id=1的order (执行删除)
- /order/1 HTTP PUT:更新id=1的order (执行更新)
- /order HTTP POST:新增oder (执行插入)
- /order HTTP GET:新增order的表单页面 (打开新增页面)
4、Spring MVC过滤器
HiddenHttpMethodFilter:浏览器的form表单只支持GET和POST请求,不支持PUT、DELETE请求。spring添加了一个过滤器,可以将这些请求转换为标准的http方法,支持POST、GET、DELETE和PUT请求。
HiddenHttpMethodFilter必须作用于dispatcher前,所以需要在web.xml配置文件中设置:
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<!--
/* 所有的请求都过滤
/ 除了.jsp文件不过滤,其他都过滤
-->
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:doFilterInternal方法只对method为post的表单进行过滤,所以在页面中必须进行如下设置:
<form action="..." method="post">
<input type="hidden" name="_method" value="put" />
......
</form>
其中,name属性的值必须为_method,才能生效。
4、创建restful应用程序示例
1)配置过滤器(web.xml页面中)
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<!--
/* 所有的请求都过滤
/ 除了.jsp文件不过滤,其他都过滤
-->
<url-pattern>/*</url-pattern>
</filter-mapping>
2)实现delete提交
controller层:
@Controller
@RequestMapping("/user")
public class RestController {
@RequestMapping("/restForm")
public String restForm(){
return "restful";
}
/*rest风格的delete请求的发送*/
@RequestMapping("/delete/{id}")
public String deleteTest(@PathVariable("id") Integer id){
System.out.println("id:"+id);
System.out.println("delete……");
return "redirect:/user/restForm";
}
}
jsp页面:
<form action="delete/2" method="post" id="deleteForm">
<input type="hidden" name="_method" value="delete">
</form>
<a href="javascript:void(0)" onclick="deleteFun()">delete请求</a>
<script>
function deleteFun() {
document.getElementById("deleteForm").submit();
}
</script>
3)实现put提交
controller层:
@Controller
@RequestMapping("/user")
public class RestController {
@RequestMapping("/restForm")
public String restForm(){
return "restful";
}
/*rest风格的delete请求的发送*/
@RequestMapping("/delete/{id}")
public String deleteTest(@PathVariable("id") Integer id){
System.out.println("id:"+id);
System.out.println("delete……");
return "redirect:/user/restForm";
}
}
jsp页面:
<form action="put/1" method="post" id="myForm">
<input type="hidden" name="_method" value="put">
</form>
<a href="javascript:void(0)" onclick="updateFun()">put请求</a>
<script>
function updateFun() {
document.getElementById("myForm").submit();
}
</script>