【SpringMVC】10.REST風格的CRUD實戰(四)之刪除操作
注意!!!
一、前情提要
刪除操作
- URL:emp/{id}
- 請求方式:DELETE
- 刪除後效果:對應記錄從資料表中刪除
二、具體步驟
1.配置HiddenHttpMethodFilter
由於HTML只支援常見的Get
和POST
方法,而DELETE
和PUT
是不能夠直接傳送請求的,所以我們只能通過POST
請求來發送DELETE
請求,於是我們需要在web.xml
配置HiddenHttpMethodFilter
。
<!-- 配置HiddenHttpMethodFilter:把post請求轉變為DELETE、PUT請求 --> <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>
2.在EmployeeHandler
編寫相關的Handler方法
由於兩個全域性變數employeeDao
和departmentDao
在之前的文章已經有被建立了,在這裡重複寫是為了照顧沒有看之前文章的同學,方便理解這個變數是從哪來的,切記不要重複建立這兩個全域性變量了。
package com.springmvc.crud.handlers; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.springmvc.crud.dao.DepartmentDao; import com.springmvc.crud.dao.EmployeeDao; import com.springmvc.crud.entities.Employee; @Controller public class EmployeeHandler { @Autowired private EmployeeDao employeeDao; @Autowired private DepartmentDao departmentDao; @RequestMapping(value = "emp/{id}", method = RequestMethod.DELETE) public String delete(@PathVariable("id") Integer id) { employeeDao.delete(id); return "redirect:/emps"; } }
3.匯入JQuery
由於接下來我們需要用到JQuery,所以我們先把JQuery的相關檔案放到WebRoot/scripts/jquery-1.9.1.min.js
即可。
###2.list.jsp
相關程式碼
因為上面提到我們需要使用POST
方法傳送DELETE
請求,所以我們需要做一個form
表單,form
表單在提交的時候需要按下submit
提交按鈕才能提交,所以我們需要使用jQuery讓form
表單不用點選提交按鈕進行提交。
相關的JQuery程式碼
<!-- Spring MVC 處理靜態資源 1.為什麼會有這樣的問題 優雅的REST風格的資源URL不希望帶.html或.do等字尾 若將DispatcherServlet請求對映配置為/, 則SpringMVC將捕獲WEB容器的所有請求,包括靜態資源的請求,SpringMVC會將他們當成一個普通的請求處理 會因為找不到對應的處理器將導致錯誤 2.解決: 在SpringMVC的配置檔案中配置<mvc:default-servlet-handler/> --> <script type="text/javascript" src="scripts/jquery-1.9.1.min.js"></script> <script type="text/javascript"> $(function(){ $(".delete").click(function(){ var href = $(this).attr("href"); $("form").attr("action",href).submit(); return false; }); }) </script>
相關的form表單
<form action="" method="POST">
<input type="hidden" name="_method" value="DELETE">
</form>
list.jsp
全部程式碼
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'list.jsp' starting page</title>
<!--
Spring MVC 處理靜態資源
1.為什麼會有這樣的問題
優雅的REST風格的資源URL不希望帶.html或.do等字尾
若將DispatcherServlet請求對映配置為/,
則SpringMVC將捕獲WEB容器的所有請求,包括靜態資源的請求,SpringMVC會將他們當成一個普通的請求處理
會因為找不到對應的處理器將導致錯誤
2.解決:
在SpringMVC的配置檔案中配置<mvc:default-servlet-handler/>
-->
<script type="text/javascript" src="scripts/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
$(function(){
$(".delete").click(function(){
var href = $(this).attr("href");
$("form").attr("action",href).submit();
return false;
});
})
</script>
</head>
<body>
<form action="" method="POST">
<input type="hidden" name="_method" value="DELETE">
</form>
<c:if test="${empty requestScope.employees }">
沒有任何員工資訊!
</c:if>
<c:if test="${!empty requestScope.employees }">
<table border="1" cellpadding="10" cellspacing="0">
<tr>
<th>ID</th>
<th>LastName</th>
<th>Email</th>
<th>Gender</th>
<th>Department</th>
<th>Edit</th>
<th>Delete</th>
</tr>
<c:forEach items="${requestScope.employees }" var="emp">
<tr>
<td>${emp.id }</td>
<td>${emp.lastName }</td>
<td>${emp.email }</td>
<td>${emp.gender == 0 ? 'Female':'Male' }</td>
<td>${emp.department.departmentName }</td>
<td><a href="emp/${emp.id }">Edit</a></td>
<td><a class="delete" href="emp/${emp.id }">Delete</a></td>
</tr>
</c:forEach>
</table>
</c:if>
<a href="emp">Add New Employee</a>
</body>
</html>
3.配置<mvc:default-servlet-handler/>
和<mvc:annotation-driven>
我們需要在springmvc.xml
配置<mvc:default-servlet-handler/>
和<mvc:annotation-driven>
,因為優雅的REST風格的資源URL不希望帶.html或.do等字尾,而我們配置了DispatcherServlet
的匹配是/
<servlet>
<servlet-name>springDispatcherServlet</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>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
即是所有的URI都會被響應,然後轉到Handler方法查詢相對應的方法,如果找不到相對應的方法,就會報404錯誤。所以連我們剛配置的JQuery檔案,都會因為找不到相對應的Handler方法而報404錯誤,為了避免這種情況,我們需要在springmvc.xml
配置<mvc:default-servlet-handler/>
和<mvc:annotation-driven>
<!--
default-servlet-handler將在SpringMVC上下文中定義一個DefaultServletHttpRequestHandler,
它會對進入DispatcherServlet的請求進行篩查,如果發現是沒有經過對映的請求,就將該請求交由Web應用伺服器預設的
Servlet處理,如果不是靜態資源的請求,才由DispatcherServlet繼續處理
一般Web應用伺服器的名稱都是default。
若所使用的Web伺服器的預設名稱不是default,則需要通過default-Servlet-name屬性顯示指定。
-->
<mvc:default-servlet-handler/>
<mvc:annotation-driven></mvc:annotation-driven>