注意!!!
此教程是基于《【SpringMVC】7.REST风格的CRUD实战(一)之前期工作》来讲解的,在阅读前请务必查阅此文章。
一、前情提要
在之前的第一篇文章《【SpringMVC】7.REST风格的CRUD实战(一)之前期工作》中,我们明确了API接口要求
删除操作
- 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>
4.效果展示
启动tomcat,访问 http://localhost:8080/springmvc-2/index.jsp
点击任意一项的delete超链接(我选择删除1003)