RESTFul
1、什么时RESTFul?
RESTFul是一种软件架构的风格,风格就是一种格式,一种代码格式,在开发中RESTFul是用的最多的。
2、RESTFul简介
REST:Representational State Transfer,表现层资源状态转移
表现层包括
a>资源
资源是一种看待服务器的方式,即将服务器看作是由很多离散的资源组成,每个资源是服务器上一个可命名的抽象概念,因为资源是一个抽象的概念,所以它不仅仅能代表服务器文件系统中的一个文件、数据库中的一张表等等具体的东西,也可以是其他更抽象的东西。
b>资源的表述
资源的表述是一段对于资源你的在某个特定时刻的状态的描述。可以在客户端-服务器之间转移(交换),资源的表述可以有多种格式,例如HTML/XML/JSON/纯文本/图片/视频/音频等等。资源的表述可以通过协商机制来确定。请求-响应的表述格式可以通过协商机制来确定,请求-响应方向的表述通常使用不同的格式。
c>状态转移
状态转义说的是:在客户端和服务器之间转移(transfer)代表资源状态的表述,通过转移和操作资源的表述,来简介实现操作资源的目的。
3、RESTFul的实现
具体的说,就是HTTP协议里,四个表示操作动作的动词:GET、POST、PUT、DELETE。
它们分别对应四种基本操作:GET用来获取资源、POST用来新建资源、PUT用来更新资源、DELETE用来删除资源。
REST风格提倡URL地址使用统一的风格设计,从前到后各个单词使用斜杠分开,不使用问号键值对的方式携带请求参数,而是将要发送给服务器的数据作为URL地址的一部分,以保证整体风格的一致性。
| 操作 | 传统方式 | REST风格 |
|---|---|---|
| 查询操作 | getUserById?id=1 | user/1–>GET请求方式 |
| 保存操作 | saveUser | user–>POST请求方式 |
| 删除操作 | deleteUser?id=1 | user/1–>DELETE请求方式 |
| 更新操作 | updateUser | user–>PUT请求方式 |
RESTFul模拟实现用户的查询和添加
由于浏览器本身就支持post和get请求,所以我们可以直接使用。
@RequestMapping(value = "/user",method = RequestMethod.GET)
public String getAllUser(){
System.out.println("查询所有用户信息");
return "success";
}
@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
public String getUserById(){
System.out.println("根据id查询用户信息");
return "success";
}
@RequestMapping(value = "/user",method = RequestMethod.POST)
public String addUser(String username, String password){
System.out.println("添加用户信息:"+username+","+password);
return "success";
}
<a th:href="@{/user}">查询所有用户信息</a><br>
<a th:href="@{/user/1}">根据id查询用户信息</a><br>
<form th:action="@{/user}" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="添加用户信息"><br>
</form>
<form th:action="@{/user}" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="修改用户信息"><br>
</form>
4、HiddenHttpMethodFilter
由于浏览器只支持POST和GET方式的请求,那么该怎么发送PUT和DELETE请求呢?
SpringMVC提供了HiddenHttpMethodFilter帮助我们将POST请求转换为DELETE或PUT请求
HiddenHttpMethodFilter处理PUT和DELETE请求的条件:
- 当前请求的请求方式必须为POST
- 当前请求必须传输请求参数method
这里暂时只演示修改用户信息,删除留到后面的案例中演示。
@RequestMapping(value = "/user",method = RequestMethod.PUT)
public String updateUser(String username, String password){
System.out.println("修改用户信息:"+username+","+password);
return "success";
}
<form th:action="@{/user}" method="post">
<input type="hidden" name="_method" value="put">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="修改用户信息"><br>
</form>
**注意:**这里的html中需要设置一个隐藏的input域,名为_method,值为你需要转换到的请求方式。这里是用put方式,所以值为put。
RESTFul案例
1、准备工作
-
搭建环境
-
实体类
package Rest.Bean; public class Employee { private Integer id; private String lastName; private String email; //1 male 0female private Integer gender; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Integer getGender() { return gender; } public void setGender(Integer gender) { this.gender = gender; } public Employee(Integer id, String lastName, String email, Integer gender) { this.id = id; this.lastName = lastName; this.email = email; this.gender = gender; } public Employee() { } } -
dao模拟数据
package Rest.dao; import Rest.Bean.Employee; import org.springframework.stereotype.Repository; import java.util.Collection; import java.util.HashMap; import java.util.Map; @Repository public class EmployeeDao { private static Map<Integer, Employee> employees = null; static{ employees = new HashMap<Integer, Employee>(); employees.put(1001, new Employee(1001, "E-AA", "aa@163.com", 1)); employees.put(1002, new Employee(1002, "E-BB", "bb@163.com", 1)); employees.put(1003, new Employee(1003, "E-CC", "cc@163.com", 0)); employees.put(1004, new Employee(1004, "E-DD", "dd@163.com", 0)); employees.put(1005, new Employee(1005, "E-EE", "ee@163.com", 1)); } private static Integer initId = 1006; public void save(Employee employee){ if(employee.getId() == null){ employee.setId(initId++); } employees.put(employee.getId(), employee); } public Collection<Employee> getAll(){ return employees.values(); } public Employee get(Integer id){ return employees.get(id); } public void delete(Integer id){ employees.remove(id); } }
2、需要实现的功能
| 功能 | URL 地址 | 请求方式 |
|---|---|---|
| 访问首页√ | / | GET |
| 查询全部数据√ | /employee | GET |
| 删除√ | /employee/2 | DELETE |
| 跳转到添加数据页面√ | /toAdd | GET |
| 执行保存√ | /employee | POST |
| 跳转到更新数据页面√ | /employee/2 | GET |
| 执行更新√ | /employee | PUT |
3、访问首页
<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
4、查询全部数据
@RequestMapping("/employee")
public ModelAndView getEmpList(ModelAndView mav){
Collection<Employee> empList = employeeDao.getAll();
mav.addObject("empList",empList);
mav.setViewName("emp_list");
return mav;
}
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Employee Info</title>
<script type="javascript" th:src="@{static/js/vue.global.js}"></script>
</head>
<body>
<table id="dataTable" border="1" cellpadding="0" cellspacing="0" style="text-align: center;margin: 0 auto;">
<tr>
<th colspan="5">Employee Info</th>
</tr>
<tr>
<th>id</th>
<th>lastName</th>
<th>email</th>
<th>gender</th>
<th>options</th>
</tr>
<tr th:each="employee : ${empList}">
<td th:text="${employee.id}"></td>
<td th:text="${employee.lastName}"></td>
<td th:text="${employee.email}"></td>
<td th:text="${employee.gender}"></td>
<td>
<a @click="deleteEmp" th:href="@{'/employee/'+${employee.id}}">delete</a>
<a href="">update</a>
</td>
</tr>
</table>
<form id="deleteform" method="post">
<input type="hidden" name="_method" value="delete">
</form>
</body>
</html>
重新部署后

5、删除
vue代码
<script type="javascript">
var vue = new Vue({
el:"#dataTable",
methods:{
deleteEmp:function(event){
//通过id获取表单标签
var deleteform = document.getElementById("delete_form");
//将触发事件的超链接的href属性为表单的action属性赋值
deleteform.actions = event.target.href;
//提交表单
deleteform.submit();
//阻止超链接的默认跳转行为
event.preventDefault();
}
}
});
</script>
控制器方法
@RequestMapping("/employee/{id}")
public String getEmpList(@PathVariable("id") Integer id){
employeeDao.delete(id);
return "redirect:/employee";
}
**注意:**需要在SpringMVC.xml中开放对静态资源的访问
6、跳转到添加数据页面
<th>options(<a th:href="@{/toAdd}">add</a>)</th>
Controller方法
@RequestMapping("/toAdd")
public String toAdd(){
return "to_add";
}
7、执行保存
to_add页面表单
<form th:action="@{/employee}" method="post">
lasstName:<input type="text" name="lastName"/><br>
email :<input type="email" name="email"/><br>
gender :<input type="radio" name="gender" value="1"/>男<input type="radio" name="gender" value="0"/>女<br>
<input type="submit" value="添加员工">
</form>
Controller方法
@RequestMapping(value = "/employee",method = RequestMethod.POST)
public String saveEmp(Employee employee){
employeeDao.save(employee);
return "redirect:/employee";
}
8、跳转到更新数据页面
<a th:href="@{'/employee/'+${employee.id}}">update</a>
emp_update.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Update Employee</title>
</head>
<body>
<form th:action="@{/employee}" method="post">
<input type="hidden" name="_method" value="put">
<input type="hidden" name="id" th:value="${employee.id}">
lastName:<input type="text" name="lastName" th:value="${employee.lastName}"><br>
email:<input type="text" name="email" th:value="${employee.email}"><br>
<!--
th:field="${employee.gender}"可用于单选框或复选框的回显
若单选框的value和employee.gender的值一致,则添加checked="checked"属性
-->
gender:<input type="radio" name="gender" value="1" th:field="${employee.gender}">male
<input type="radio" name="gender" value="0" th:field="${employee.gender}">female<br>
<input type="submit" value="update"><br>
</form>
</body>
</html>
9、执行更新
@RequestMapping(value = "/employee",method = RequestMethod.PUT)
public String updateEmp(Employee employee){
employeeDao.save(employee);
return "redirect:/employee";
}

RESTFul是一种Web服务设计风格,强调资源的表示和状态转移。它利用HTTP协议的GET、POST、PUT、DELETE等方法进行资源的操作。本文介绍了RESTFul的基本概念,如资源、表述和状态转移,并展示了如何在SpringMVC中实现RESTFul接口,包括查询、添加、删除和更新用户信息。此外,还提到了如何通过HiddenHttpMethodFilter处理PUT和DELETE请求,以及在前端使用Vue.js实现模拟的RESTFul操作。

710

被折叠的 条评论
为什么被折叠?



