SpringMVC_14_RESTFUL_CRUD(五)实现修改操作PUT

完成了DELETE删除操作,最后我们一鼓作气 完成修改操作吧!

修改操作,点击修改功能的< a>标签后,在handler方法中根据id找到当前Employee的所有数据,放在request域中,转到input.jsp页面中,这样input.jsp就能直接显示原来的数据,而不是之前的注册界面啥内容都没有填写。修改完毕这时提交方法是PUT,需要写一个新的handler方法处理PUT操作,最后重定向到list.jsp即可。那这里需要注意的是,修改的时候不能修改lastName这个属性,所有修改界面不能显示这个text。

一、先写好list.jsp页面中的修改功能的< a>标签 的href和处理方法

<td><a href="emp/${emp.id}">Edit</a></td>  //这里需要当前的id,方便根据id查找

这一步跳转到input.jsp并且是当前Employee的数据,但是不会显示lastName.

//以下这个方法的目的是当你想要修改的时候,显示出原始数据
@RequestMapping(value="/emp/{id}",method = RequestMethod.GET)
public String input(@PathVariable("id") Integer id ,Map<String,Object> map){
    map.put("employee",employeeDao.get(id));
    map.put("departments",departmentDao.getDepartments());
    return "input";
}

二、input.jsp判断为修改还是添加操作

<c:if test="${employee.id==null}">
<!--Path 属性对应html表单标签的name属性值-->
LastName: <form:input path="lastName"/>
</c:if>
<c:if test="${employee.id!=null}">
    <form:hidden path="id"/>
    <%--对于_method 不能使用form:hidden标签,因为modelAtttibute 对应的bean中没有_method这个属性--%>
    <input type="hidden" name="_method" value="PUT"/>
</c:if>

现在的input.jsp

<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <!--
        1.WHY使用form标签呢?
        可以更快速的开发出表单页面,而且可以更方便的进行表单值的回显
        2.注意:
        可以通过modelAttribute属性指定绑定的模型属性,
        则默认为request域对象中读取command的表单的bean.
        如果该属性值也不存在,则会发生错误。
    -->
    <form:form action="${pageContext.request.contextPath}/emp" method="POST" modelAttribute="employee">

        <c:if test="${employee.id==null}">
        <!--Path 属性对应html表单标签的name属性值-->
        LastName: <form:input path="lastName"/>
        </c:if>
        <c:if test="${employee.id!=null}">
            <form:hidden path="id"/>
            <%--对于_method 不能使用form:hidden标签,因为modelAtttibute 对应的bean中没有_method这个属性--%>
            <input type="hidden" name="_method" value="PUT"/>
        </c:if>
        <br>
        Email:<form:input path="email"/>
        <br>
        <%
            Map<String,String> genders = new HashMap<String, String>();
            genders.put("1","Male");
            genders.put("0","Female");

            request.setAttribute("genders",genders);
        %>
        Gender:
        <br>
        <form:radiobuttons path="gender" items="${genders}" delimiter="<br>"/>
        <br>
        Department:<form:select path="department.id"
                                items="${departments}" itemLabel="departmentName" itemValue="id"></form:select>
        <br>
        <input type="submit" value="Submit"/>
    </form:form>

</body>
</html>

三、编写PUT请求的handler方法

@RequestMapping(value = "/emp",method = RequestMethod.PUT)
public String update(Employee employee){
    employeeDao.save(employee);

    return "redirect:/emps";
}

四、@ModelAttribute

如果直接使用这个修改功能,会发现修改后的list.jsp里,修改的那个Employee的id消失了,这是因为修改的时候,是new了一个Employee填入修改后的数据后(修改的时候没有id这个值),放入数据库就覆盖了原来的数据,造成id数据的丢失。

处理方法:使用@ModelAttribute使得修改前首先根据id拿出所有的数据放在Employee中,而不是新new一个,这样修改过后,放回数据库时,本身就携带了id这个数据。

//这个的目的在于完成修改的操作时候,不会丢失id的数据
@ModelAttribute
public void getEmployee(@RequestParam(value="id",required = false) Integer id,
                        Map<String,Object> map){

    if(id!=null){
        map.put("employee",employeeDao.get(id));
    }

}

当前的EmployeeHandler.java

package com.springmvc.crud.handlers;

import com.springmvc.crud.dao.DepartmentDao;
import com.springmvc.crud.dao.EmployeeDao;
import com.springmvc.crud.entities.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@Controller
public class EmployeeHandler {

    @Autowired
    private EmployeeDao employeeDao;

    @Autowired
    private DepartmentDao departmentDao;


    //这个的目的在于完成修改的操作时候,不会丢失id的数据
    @ModelAttribute
    public void getEmployee(@RequestParam(value="id",required = false) Integer id,
                            Map<String,Object> map){

        if(id!=null){
            map.put("employee",employeeDao.get(id));
        }

    }

    @RequestMapping(value = "/emp",method = RequestMethod.PUT)
    public String update(Employee employee){
        employeeDao.save(employee);

        return "redirect:/emps";
    }

    //以下这个方法的目的是当你想要修改的时候,显示出原始数据
    @RequestMapping(value="/emp/{id}",method = RequestMethod.GET)
    public String input(@PathVariable("id") Integer id ,Map<String,Object> map){
        map.put("employee",employeeDao.get(id));
        map.put("departments",departmentDao.getDepartments());
        return "input";
    }

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

    @RequestMapping(value = "/emp",method = RequestMethod.POST)
    public String save(Employee employee){

        employeeDao.save(employee);
        return "redirect:/emps";
    }

    @RequestMapping(value="emp",method = RequestMethod.GET)
        public String input(Map<String,Object> map){
        map.put("departments",departmentDao.getDepartments());
        map.put("employee",new Employee());
        return "input";
    }


    @RequestMapping("/emps")
    public String list(Map<String,Object> map){

        map.put("employees",employeeDao.getAll());
        return "list";
    }

}

当前的input.jsp

<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%--
  Created by IntelliJ IDEA.
  User: 14741
  Date: 2019/1/2
  Time: 20:08
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <!--
        1.WHY使用form标签呢?
        可以更快速的开发出表单页面,而且可以更方便的进行表单值的回显
        2.注意:
        可以通过modelAttribute属性指定绑定的模型属性,
        则默认为request域对象中读取command的表单的bean.
        如果该属性值也不存在,则会发生错误。
    -->
    <form:form action="${pageContext.request.contextPath}/emp" method="POST" modelAttribute="employee">

        <c:if test="${employee.id==null}">
        <!--Path 属性对应html表单标签的name属性值-->
        LastName: <form:input path="lastName"/>
        </c:if>
        <c:if test="${employee.id!=null}">
            <form:hidden path="id"/>
            <%--对于_method 不能使用form:hidden标签,因为modelAtttibute 对应的bean中没有_method这个属性--%>
            <input type="hidden" name="_method" value="PUT"/>
        </c:if>
        <br>
        Email:<form:input path="email"/>
        <br>
        <%
            Map<String,String> genders = new HashMap<String, String>();
            genders.put("1","Male");
            genders.put("0","Female");

            request.setAttribute("genders",genders);
        %>
        Gender:
        <br>
        <form:radiobuttons path="gender" items="${genders}" delimiter="<br>"/>
        <br>
        Department:<form:select path="department.id"
                                items="${departments}" itemLabel="departmentName" itemValue="id"></form:select>
        <br>
        <input type="submit" value="Submit"/>
    </form:form>

</body>
</html>

猜你喜欢

转载自blog.csdn.net/weixin_42036647/article/details/85854073