一、什么是Restful风格?
Restful是一种描述资源资源定位及资源操作的风格,相比于传统的url描述更加简单明了。
特点:
- 认为每一个操作都是针对一个资源。而固定到资源上的操作可以用 HTTP 协议⾥⾯,四个表示操作⽅式的动词: GET 、POST 、PUT 、DELETE 。它们分别对应四种基本操作:GET ⽤来获取资源,POST ⽤来新建资 源,PUT ⽤来更新资源,DELETE ⽤来删除资源。 详细见下面 Restful风格和传统风格对比。
- 结构清晰、符合标准、易于理解、扩展方便。
二、Restful风格和传统风格对比
传统风格:
- http://localhost:8080/user/queryUserById.action?id=3
- url中定义了动作(操作),参数具体锁定到操作的是谁
Restful风格:
- http://localhost:8080/user/3
- 锁定id为3的那个⽤户记录(资源)
- 而get请求对应的就是查询操作
三、springmvc中的使用
-
创建springmvc工程,引入相关的依赖,配置web.xml和springmv.xml文件,创建对应的controller层,详情见springmvc的基本使用
-
前端jsp界面的设计
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <div> <h2>SpringMVC对Resrful风格url的支持</h2> <fieldset> <p>测试用例:SpringMVC对Resrful风格url的支持</p> <a href="/demo/handle/15">rest_get测试</a> <form method="post" action="/demo/handle"> <input type="text" name="username"> <input type="submit" value="提交rest_post请求"> </form> <form method="post" action="/demo/handle/15/lisi"> <input type="hidden" name="_method" value="put"> <input type="submit" value="提交rest_put请求"> </form> <form method="post" action="/demo/handle/15"> <input type="hidden" name="_method" value="delete"> <input type="submit" value="提交rest_delete请求"> </form> </fieldset> </div> <hr/> </body> </html>
界面样式:
-
后台Hnadler方法测试,注意,此处只测试是否由前端的请求能传递到后端对应操作的方法上,并不实际操作数据库
-
当输入中文时,会出现中文乱码,需要在web.xml中添加springmvc支持的filter过滤器
<!--配置springmvc提供的编码过滤器--> <filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
查询 对应 http中get:
测试代码,注意:@PathVariable 注解获取 RESTful ⻛格的请求 URL中的路径变量。
@RequestMapping(value = "/handle/{id}", method = {RequestMethod.GET}) public void handleGet(@PathVariable("id") Integer id){ System.out.println(id); }
测试结果
-
增加 对应 http中post:
测试代码:
@RequestMapping(value = "/handle", method = {RequestMethod.POST}) public void handlePost(String username){ System.out.println(username); }
测试结果
-
对应修改和增加操作在请求方式上仍然是post,但会增加一个隐藏的属性:
<input type="hidden" name="_method" value="put"/>
-
web.xml中配置请求⽅式过滤器(将特定的post请求转换为put和delete请求)
<!--配置springmvc提供的过滤器,检查请求参数中是否有_method参数,有则按照制定的请求方式转化--> <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>
-
修改 对应 http中put:
User实体类:
public class User { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
测试代码:
@RequestMapping(value = "/handle/{id}/{name}", method = {RequestMethod.PUT}) public void handlePut(User user){ System.out.println(user); }
测试结果
-
增加 对应 http中delete:
测试代码:
@RequestMapping(value = "/handle/{id1}", method = {RequestMethod.DELETE}) public void handleDelete(@PathVariable("id1") Integer id){ System.out.println(id); }
测试结果
注意:
- 重新debug启动了服务,执行delete操作,会卡在delete对应的方法上,注意到url路径和get请求是一样的,通过请求方法区分。
- @PathVariable使用url路径中的参数名称,可将参数传递到对应标注的形参上,当请求参数名 和 传入形参参数名不一致时,即可如此使用。
-
总结
restful风格采用了资源定位的方式,需要操作的方法定义在http的请求中,url中只有要操作的资源,结构清晰,易于理解。