1. 程式人生 > >【SpringMVC】10.REST風格的CRUD實戰(四)之刪除操作

【SpringMVC】10.REST風格的CRUD實戰(四)之刪除操作

注意!!!

一、前情提要

刪除操作

  • URL:emp/{id}
  • 請求方式:DELETE
  • 刪除後效果:對應記錄從資料表中刪除

二、具體步驟

1.配置HiddenHttpMethodFilter

由於HTML只支援常見的GetPOST方法,而DELETEPUT是不能夠直接傳送請求的,所以我們只能通過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方法

由於兩個全域性變數employeeDaodepartmentDao在之前的文章已經有被建立了,在這裡重複寫是為了照顧沒有看之前文章的同學,方便理解這個變數是從哪來的,切記不要重複建立這兩個全域性變量了。

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>

4.效果展示

這裡寫圖片描述

刪除前

這裡寫圖片描述

刪除後