• SpringMVC学习笔记(八)—— RESTFul案例-实现增删改查


    08、RESTFul案例

    8.1、准备工作

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

    1、新建module --> springMVC-rest

    2、配置xml文件

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        <!--配置编码过滤器-->
        <filter>
            <filter-name>CharacterEncodingFilter</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>
            <init-param>
                <param-name>forceResponseEncoding</param-name>
                <param-value>true</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>CharacterEncodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
        <!--配置处理请求方式put和delete的HiddenHttpMethodFilter过滤器-->
        <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>
    
        <!--配置SpringMVC的前端控制器DispatcherServlet-->
        <servlet>
            <servlet-name>DispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springMVC.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>DispatcherServlet</servlet-name>
            <url-pattern>/*</url-pattern>
        </servlet-mapping>
    </web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    springMVC.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    
        <!--扫描组件-->
        <context:component-scan base-package="com.ssm.mvc"></context:component-scan>
    
    
        <!--配置Thymeleaf视图解析器-->
        <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
            <property name="order" value="1"/>
            <property name="characterEncoding" value="UTF-8"/>
            <property name="templateEngine">
                <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
                    <property name="templateResolver">
                        <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
                            <!-- 视图前缀 -->
                            <property name="prefix" value="/WEB-INF/templates/"/>
                            <!-- 视图后缀 -->
                            <property name="suffix" value=".html"/>
                            <property name="templateMode" value="HTML5"/>
                            <property name="characterEncoding" value="UTF-8" />
                        </bean>
                    </property>
                </bean>
            </property>
        </bean>
    </beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    3、准备实体类

    Employee.java

    public class Employee {
        private Integer id;
        private String lastName;
        private String email;
        private Integer gender;//1:male 0:female
    
        public Employee() {
        }
    
        public Employee(Integer id, String lastName, String email, Integer gender) {
            this.id = id;
            this.lastName = lastName;
            this.email = email;
            this.gender = 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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    4、准备dao模拟数据

    EmployeeDAO.java

    @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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    8.2、功能清单

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

    8.3、功能实现

    8.3.1、访问页面

    1、配置view-controller

    springMVC.xml

    <!--配置视图控制器-->
    <mvc:view-controller path="/" view-name="index"></mvc:view-controller>
    
    <!--开启mvc注解驱动-->
    <mvc:annotation-driven/>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、创建页面

    index.html

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>首页</title>
    </head>
    <body>
    <h1>首页</h1>
    <a th:href="@{/employee}">查看员工信息</a>
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    8.3.2、查询所有员工数据

    1、控制器方法

    EmployeeController.java

    @Controller
    public class EmployeeController {
    
        @Autowired
        public EmployeeDAO employeeDAO;
    
        //@GetMapping("/employee")
        @RequestMapping(value = "employee", method = RequestMethod.GET)
        public String getAllEmployee(Model model){
            Collection<Employee> employeeList = employeeDAO.getAll();
            model.addAttribute("employeeList", employeeList);
    
            return "employee_list";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    employee_list.html

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Employee_Info</title>
    </head>
    <body>
        <table border="1" cellspacing="0" cellpadding="0" style="text-align: center">
            <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 href="">delete</a>&nbsp;
                    <a href="">update</a>
                </td>
            </tr>
        </table>
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    3.3.3、删除

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

    <!--超链接只能发送get请求,而我们需要发送delete请求,
                则需要通过HiddenHttpMethodFilter过滤器,而此过滤器需要发送post请求以及"_method"参数
                需要创建表单实现-->
    <!--action未赋值或未写,默认为提交到当前页面-->
    <form id="deleteForm" method="post">
        <input type="hidden" name="_method" value="delete">
    </form>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2、删除超链接绑定点击事件

    (1)引入vue.js

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

    (2)删除超链接

    <a @click="deleteEmployee" th:href="@{'/employee/'+${employee.id}}">delete</a>&nbsp;
    
    • 1

    (3)通过vue处理点击事件

    <script type="text/javascript">
        var vue = new Vue({
            el:"#dataTable",
            methods:{
                deleteEmployee:function (event) {
                    //根据id获取表单元素
                    var deleteForm = document.getElementById("deleteForm");
                    //将触发点击事件的超链接的href属性赋值给表单的action
                    deleteForm.action = event.target.href;
                    //提交表单
                    deleteForm.submit();
                    //取消超链接的默认行为
                    event.preventDefault();
                }
            }
        });
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    3、执行删除

    EmployeeController.java

    @Controller
    public class EmployeeController {
    
        @Autowired
        public EmployeeDAO employeeDAO;
    
        @RequestMapping(value = "/employee/{id}",method = RequestMethod.DELETE)
        public String deleteEmployee(@PathVariable("id") Integer id) {
            System.out.println(id);
            employeeDAO.delete(id);
            return "redirect:/employee";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4、开放对静态资源的访问

    springMVC.xml

    <!--开放对静态资源的访问-->
    <mvc:default-servlet-handler/>
    
    • 1
    • 2

    3.3.4、添加

    1、配置view-controller

    springMVC.xml

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

    2、创建添加页面

    employee_add.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"><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" value="add"><br>
        </form>
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    3、执行添加

    EmployeeController.java

    @Controller
    public class EmployeeController {
    
        @Autowired
        public EmployeeDAO employeeDAO;
    
        @RequestMapping(value = "/employee",method = RequestMethod.POST)
        public String addEmployee(Employee employee) {
            employeeDAO.save(employee);
            return "redirect:/employee";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3.3.5、修改

    1、修改超链接

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

    2、跳转到修改页面

    EmployeeController.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";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3、创建修改页面

    employee_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>
            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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    4、执行更新

    EmployeeController.java

    @Controller
    public class EmployeeController {
    
        @Autowired
        public EmployeeDAO employeeDAO;
    
        @RequestMapping(value = "/employee", method = RequestMethod.PUT)
        public String updateEmployee(Employee employee) {
            employeeDAO.save(employee);
            return "redirect:/employee";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    java中的泛型
    MySQL总结(DQL)
    springboot 常用注解
    [NOIP2003 普及组] 乒乓球
    QT实现可拖动自定义控件
    【Vue面试专题】50+道经典Vue面试题详解!
    Python + Jmeter 实现自动化性能压测
    数据库持久化+JDBC数据库连接
    视觉感知「挑战」天花板,多摄像头环绕方案同比增长近100%
    【Linux:环境变量】
  • 原文地址:https://blog.csdn.net/kuaixiao0217/article/details/125433841