RESTFul 案例

准备工作

和传统 CRUD 一样,实现对员工信息的增删改查。

  • 搭建环境

  • 准备实体类

public class Employee {

   private Integer id;
   private String lastName;

   private String email;
   //1 male, 0 female
   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) {
      super();
      this.id = id;
      this.lastName = lastName;
      this.email = email;
      this.gender = gender;
   }

   public Employee() {
   }
}
  • 准备 DAO 模拟数据
@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);
   }
}

功能清单

功能URL 地址请求方式
访问首页/GET
查询全部数据/employeeGET
删除/employee/{id}DELETE
跳转到添加数据页面/toAddGET
执行保存/employeePOST
跳转到更新数据页面/employee/{id}GET
执行更新/employeePUT

具体功能:访问首页

controller

@RequestMapping("/")
public String index(){
    return "index";
}

创建首页

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8" >
    <title>Index</title>
</head>
<body>
    <h1>Hello</h1>
    <a th:href="@{/employee}">访问员工信息</a>
</body>
</html>

具体功能:查询员工数据

controller

@GetMapping("/employee")
public String getAllEmployees(Model model){
    EmployeeDao employeeList = new EmployeeDao();
    model.addAttribute("employeeList", employeeList.getAll());
    return "employee_list";
}

employee_list

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Employees</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>


<form id="delete_form" method="post">
    <input type="hidden" name="_method" value="delete"/>
</form>

<table border="1" cellpadding="0" cellspacing="0" style="text-align: center;" id="dataTable">
  <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 : ${employeeList}">
        <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 id="delete_button" @click="deleteEmployee" th:href="@{'/employee/'+${employee.id}}">delete</a>
        </td>
    </tr>




    <script type="text/javascript">
        var vue = new Vue({
            el: '#dataTable',
            methods:{
                deleteEmployee: function (event){
                    var delete_form = document.getElementById("delete_form");

                    delete_form.action = event.target.href;


                    delete_form.submit();

                    event.preventDefault();
                }
            }
        });
    </script>

</table>
</body>
</html>

具体功能:删除

创建处理 delete 请求方式的表单

<form id="delete_form" method="post">
    <input type="hidden" name="_method" value="delete"/>
</form>

删除超连接绑定点击事件

  • 引入vue.js
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  • 删除超连接
<a @click="deleteEmployee" th:href="@{'/employee/'+${employee.id}}">delete</a>
  • 通过 vue 处理点击事件
<script type="text/javascript">
    var vue = new Vue({
        el: '#dataTable',
        methods:{
            deleteEmployee: function (event){
                var delete_form = document.getElementById("delete_form");

                delete_form.action = event.target.href;


                delete_form.submit();

                event.preventDefault();
            }
        }
    });
</script>
  • 控制器方法
@DeleteMapping("/employee/{id}")
public String deleteEmployee(@PathVariable("id") Integer id){
    EmployeeDao employeeList = new EmployeeDao();
    employeeList.delete(id);

    return "redirect:/employee";
}

具体功能:跳转到添加数据页面

controller

@RequestMapping("/toAdd")
public String add(){
    return "employee_add";
}

employee_add

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Add</title>
</head>
<body>

<form th:action="@{/employee}" method="post">
    <input type="hidden" name="id" value="">
    Name:<input type="text" name="lastName"><br>
    Email:<input type="text" name="email"><br>
    gender:<input type="radio" name="gender" value="1">male<input type="radio" name="gender" value="0">female<br>
    <input type="submit">
</form>
</body>
</html>

具体功能:执行保存

controller

@PostMapping("/employee")
public String addEmployee(Employee employee){
    EmployeeDao employeeList = new EmployeeDao();
    employeeList.save(employee);
    return "redirect:/employee";
}

具体功能:跳转到更新数据页面

controller

@GetMapping("/employee/{id}")
public String updataEmployee(@PathVariable("id") Integer id, Model model){
    EmployeeDao employeeList = new EmployeeDao();

    Employee employee = employeeList.get(id);
    model.addAttribute("employee", employee);

    return "employee_updata";
}

employee_updata

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Updata</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}">
    Name:<input type="text" name="lastName" th:value="${employee.lastName}"><br>
    Email:<input type="text" name="email" th:value="${employee.email}"><br>
    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="updata">
</form>

</body>
</html>

具体功能:执行更新

@PutMapping("/employee")
public String updataEmployee(Employee employee){
    EmployeeDao employeeList = new EmployeeDao();
    employeeList.save(employee);

    return "redirect:/employee";
}