【SpringMVC】10.REST风格的CRUD实战(四)之删除操作

注意!!!


此教程是基于《【SpringMVC】7.REST风格的CRUD实战(一)之前期工作》来讲解的,在阅读前请务必查阅此文章。


一、前情提要


在之前的第一篇文章《【SpringMVC】7.REST风格的CRUD实战(一)之前期工作》中,我们明确了API接口要求

删除操作

  • 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.效果展示

启动tomcat,访问 http://localhost:8080/springmvc-2/index.jsp
点击任意一项的delete超链接(我选择删除1003)

扫描二维码关注公众号,回复: 3633467 查看本文章

这里写图片描述

删除前

这里写图片描述

删除后

猜你喜欢

转载自blog.csdn.net/qq_33596978/article/details/82732966