Skip to content

08.RESTful 案例

1、准备工作

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

  • 搭建环境
  • 准备实体类
java
package com.atguigu.mvc.bean;

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 模拟数据
java
package com.atguigu.mvc.dao;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import com.atguigu.mvc.bean.Employee;
import org.springframework.stereotype.Repository;


@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
查询全部数据 √/employeeGET
删除 √/employee/2DELETE
跳转到添加数据页面 √/toAddGET
执行保存 √/employeePOST
跳转到更新数据页面 √/employee/2GET
执行更新 √/employeePUT

3、具体功能:访问首页

a>配置 view-controller

xml
<mvc:view-controller path="/" view-name="index"/>

b>创建页面

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

4、具体功能:查询所有员工数据

a>控制器方法

java
@RequestMapping(value = "/employee", method = RequestMethod.GET)
public String getEmployeeList(Model model){
    Collection<Employee> employeeList = employeeDao.getAll();
    model.addAttribute("employeeList", employeeList);
    return "employee_list";
}

b>创建 employee_list.html

html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="UTF-8" />
    <title>Employee Info</title>
    <script type="text/javascript" th:src="@{/static/js/vue.js}"></script>
  </head>
  <body>
    <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(<a th:href="@{/toAdd}">add</a>)</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 class="deleteA" @click="deleteEmployee" th:href="@{'/employee/'+${employee.id}}">delete</a>
          <a th:href="@{'/employee/'+${employee.id}}">update</a>
        </td>
      </tr>
    </table>
  </body>
</html>

5、具体功能:删除

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

html
<!-- 作用:通过超链接控制表单的提交,将post请求转换为delete请求 -->
<form id="delete_form" method="post">
  <!-- HiddenHttpMethodFilter要求:必须传输_method请求参数,并且值为最终的请求方式 -->
  <input type="hidden" name="_method" value="delete" />
</form>

b>删除超链接绑定点击事件

引入 vue.js

html
<script type="text/javascript" th:src="@{/static/js/vue.js}"></script>

删除超链接

html
<a class="deleteA" @click="deleteEmployee" th:href="@{'/employee/'+${employee.id}}">delete</a>

通过 vue 处理点击事件

html
<script type="text/javascript">
  var vue = new Vue({
    el: '#dataTable',
    methods: {
      //event表示当前事件
      deleteEmployee: function (event) {
        //通过id获取表单标签
        var delete_form = document.getElementById('delete_form')
        //将触发事件的超链接的href属性为表单的action属性赋值
        delete_form.action = event.target.href
        //提交表单
        delete_form.submit()
        //阻止超链接的默认跳转行为
        event.preventDefault()
      },
    },
  })
</script>

c>控制器方法

java
@RequestMapping(value = "/employee/{id}", method = RequestMethod.DELETE)
public String deleteEmployee(@PathVariable("id") Integer id){
    employeeDao.delete(id);
    return "redirect:/employee";
}

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

a>配置 view-controller

xml
<mvc:view-controller path="/toAdd" view-name="employee_add"></mvc:view-controller>

b>创建 employee_add.html

html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="UTF-8" />
    <title>Add Employee</title>
  </head>
  <body>
    <form th:action="@{/employee}" method="post">
      lastName:<input type="text" name="lastName" />

      email:<input type="text" name="email" />

      gender:<input type="radio" name="gender" value="1" />male <input type="radio" name="gender" value="0" />female

      <input type="submit" value="add" />
    </form>
  </body>
</html>

7、具体功能:执行保存

a>控制器方法

java
@RequestMapping(value = "/employee", method = RequestMethod.POST)
public String addEmployee(Employee employee){
    employeeDao.save(employee);
    return "redirect:/employee";
}

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

a>修改超链接

html
<a th:href="@{'/employee/'+${employee.id}}">update</a>

b>控制器方法

java
@RequestMapping(value = "/employee/{id}", method = RequestMethod.GET)
public String getEmployeeById(@PathVariable("id") Integer id, Model model){
    Employee employee = employeeDao.get(id);
    model.addAttribute("employee", employee);
    return "employee_update";
}

c>创建 employee_update.html

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}" />

      email:<input type="text" name="email" th:value="${employee.email}" />

      <!--
        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

      <input type="submit" value="update" />
    </form>
  </body>
</html>

9、具体功能:执行更新

a>控制器方法

java
@RequestMapping(value = "/employee", method = RequestMethod.PUT)
public String updateEmployee(Employee employee){
    employeeDao.save(employee);
    return "redirect:/employee";
}

Released under the MIT License.