核心配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--注解扫描-->
<context:component-scan base-package="my"></context:component-scan>
<!-- 注解支持-->
<context:annotation-config></context:annotation-config>
<!-- mvc注解支持-->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 配置thymeleaf视图解析器(其实内部对thymeleaf引擎进行了封装)-->
<bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver" id="viewResolver">
<property name="characterEncoding" value="UTF-8"></property>
<!-- 设置优先级(因为可能有多个解析器)-->
<property name="order" value="1"></property>
<property name="templateEngine">
<!-- 配置引擎-->
<bean class="org.thymeleaf.spring5.SpringTemplateEngine" id="templateEngine">
<!-- 配置解析器-->
<property name="templateResolver">
<bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!-- 提前设置解析的前缀-->
<property name="prefix" value="/WEB-INF/templates/"></property>
<!-- 提前设置解析的后缀-->
<property name="suffix" value=".html"></property>
<!-- 设置要解析的模板的模型-->
<property name="templateMode" value="HTML5"></property>
<!-- 设置编码-->
<property name="characterEncoding" value="UTF-8"></property>
</bean>
</property>
</bean>
</property>
</bean>
<!-- 视图控制器 显示首页-->
<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
<!-- 开启静态资源访问的默认Servlet-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
</beans>
实体类
/**
* @Classname Employee
* @author: 我心
* @Description:
* @Date 2022/2/12 20:07
* @Created by Lenovo
*/
public class Employee {
private Integer id;
private String lastName;
private String email;
private Integer gender;//性别,1是男,0是女
public Employee() {
}
public Employee(Integer id, String lastName, String email, Integer gender) {
this.id = id;
this.lastName = lastName;
this.email = email;
this.gender = gender;
}
public Employee(String lastName, String email, Integer gender) {
this.lastName = lastName;
this.email = email;
this.gender = gender;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", lastName='" + lastName + '\'' +
", email='" + email + '\'' +
", gender=" + gender +
'}';
}
}
dao
public interface EmployeeDao {
//添加员工
int addEmployee(Employee employee);
//删除员工
int deleteEmployee(Integer id);
//修改员工
int updateEmployee(Employee employee);
//查询员工
Employee getEmployee(Integer id);
//返回全部员工
List<Employee> getEmployeeList();
}
dao实现类
/**
* @Classname EmployeeDaoImpl
* @author: 我心
* @Description:用于测试的dao实现类,在内部定义数据即可
* @Date 2022/2/12 20:11
* @Created by Lenovo
*/
@Repository
public class EmployeeDaoImpl implements EmployeeDao{
private static Map<Integer,Employee> map;
private static Integer initId=1005;//自动生成id
//初始化数据
static {
map=new HashMap<Integer,Employee>();
map.put(1001,new Employee(1001,"白小纯","fdsafd@qq.com",1));
map.put(1002,new Employee(1002,"王林","fds2341afd@qq.com",1));
map.put(1003,new Employee(1003,"许清","fdsagsrgrfsgfd@qq.com",0));
map.put(1004,new Employee(1004,"李清照","hellofdsafd@qq.com",0));
map.put(1005,new Employee(1005,"李逍遥","lixiaofdsafd@qq.com",1));
}
public static Map<Integer, Employee> getMap() {
return map;
}
@Override
public int addEmployee(Employee employee) {
if(employee!=null){
//自动设置id
if (employee.getId()==null)
employee.setId(++initId);
this.map.put(employee.getId(), employee);
return 1;
}
return 0;
}
@Override
public int deleteEmployee(Integer id) {
Employee remove = map.remove(id);
if (remove!=null)
return 1;
return 0;
}
@Override
public int updateEmployee(Employee employee) {
if(employee!=null){
map.put(employee.getId(),employee);
}
return 0;
}
@Override
public Employee getEmployee(Integer id) {
return map.get(id);
}
@Override
public List<Employee> getEmployeeList() {
Collection<Employee> values = map.values();
List<Employee> list=new ArrayList(values);
return list;
}
}
Service接口
public interface EmployeeService {
//添加员工
boolean addEmployee(Employee employee);
//删除员工
boolean deleteEmployee(Integer id);
//修改员工
boolean updateEmployee(Employee employee);
//查询员工
Employee getEmployee(Integer id);
//判断员工是否存在
boolean isExist(Integer id);
//返回全部员工
List<Employee> getEmployeeList();
}
service实现类
/**
* @Classname EmployeeServiceImpl
* @author: 我心
* @Description:
* @Date 2022/2/12 20:27
* @Created by Lenovo
*/
@Service
public class EmployeeServiceImpl implements EmployeeService{
public EmployeeDao getEmployeeDao() {
return employeeDao;
}
public void setEmployeeDao(EmployeeDao employeeDao) {
this.employeeDao = employeeDao;
}
//注入dao实现类
@Autowired
private EmployeeDao employeeDao;
@Override
public boolean addEmployee(Employee employee) {
//如果当前用户不存在
if (!isExist(employee.getId())){
int i = employeeDao.addEmployee(employee);
if (i>=1)
return true;
}
return false;
}
@Override
public boolean deleteEmployee(Integer id) {
//判断是否存在
if(isExist(id)){
int i = employeeDao.deleteEmployee(id);
if (i>=1)
return true;
}
return false;
}
@Override
public boolean updateEmployee(Employee employee) {
if(isExist(employee.getId())){
int i = employeeDao.updateEmployee(employee);
if (i>=1)
return true;
}
return false;
}
@Override
public Employee getEmployee(Integer id) {
return employeeDao.getEmployee(id);
}
@Override
public boolean isExist(Integer id) {
Employee employee = employeeDao.getEmployee(id);
if (employee!=null)
return true;
return false;
}
@Override
public List<Employee> getEmployeeList() {
return employeeDao.getEmployeeList();
}
}
Controller层
/**
* @Classname EmployeeController
* @author: 我心
* @Description:
* @Date 2022/2/12 23:06
* @Created by Lenovo
*/
@Controller
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private EmployeeService service;
// 获取员工信息
@RequestMapping(value = "/",method = RequestMethod.GET)
public String showAllEmployees(Map<String,Object> context, HttpServletRequest request){
String baseStr=request.getScheme()+"://"+
request.getServerName()+":"+request.getServerPort()
+request.getContextPath()+"/";
request.getSession().setAttribute("baseStr",baseStr);//将当前工程路径写入session域中
List<Employee> employeeList = service.getEmployeeList();
context.put("employeeList",employeeList);
return "show";
}
//删除员工信息
@DeleteMapping("/{id}")
public String delete(HttpServletResponse response,@PathVariable("id") String id) throws IOException {
service.deleteEmployee(new Integer(id));
return "redirect:/employee/";//重定向回所有员工页面
}
//添加员工
@PostMapping("/")
public String add(Employee employee, Model model){
service.addEmployee(employee);
System.out.println("添加成功!");
//将当前状态传给请求视图的上下文对象
return "redirect:/employee/";//重定向回首页页面
}
// 修改员工信息
@PutMapping("/")
public String update(Employee employee,Model model){
System.out.println(employee);
service.updateEmployee(employee);
String state="update";
return "redirect:/employee/"+state+"/put";//重定向回首页页面
}
//查询单个员工信息
@GetMapping("/{id}")
public String getEmployee(@PathVariable("id") String id,HttpServletResponse response) throws IOException {
Employee employee = service.getEmployee(new Integer(id));
Gson gson=new Gson();
String employeeJson = gson.toJson(employee, Employee.class);
//响应
response.getWriter().write(employeeJson);
return null;
}
// 带状态的重定向展示列表的控制方法
@RequestMapping(value = "/{form_state}/{_method}",method = RequestMethod.GET)
public String showState(@PathVariable("form_state") String form_state,@PathVariable("_method") String _method,Model model,HttpServletRequest request){
model.addAttribute("form_state",form_state);
model.addAttribute("_method",_method);
//转发
return "forward:/employee/";
}
}
需要的html页面
index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<a th:href="@{/employee/}">查看所有员工信息</a>
</body>
</html>
show.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>员工信息</title>
</head>
<script type="text/javascript" src="http://localhost:8080/Spring_mvc_rest_war/static/script/jquery-1.7.2.js" ></script>
<script>
$(function () {
$("#f_state").attr("text","当前表单状态为:无");
//删除监听
$(".delete").click(function () {
//获取表单
var form = $("#form_req");
//修改action
form.attr("action",$(this).attr("href"));
//修改_method参数值
$("#requestMethod").attr("value","delete");
//提交表单
form.submit();
return false;
});
//修改点击监听
$(".update").click(function () {
//获取信息
var t=$(this).parent().parent().children(".id").text();//获取当前要更新的id
var dataUrl=$("#baseStr").val()+"employee/"+t;//拼接url
var baseStr=$("#baseStr").val();//工程路径
//异步请求回显数据
$.ajax({
url: dataUrl,
type:"get",
dataType: "json",
success:function (data) {
//data是规定要写的一个参数,用来存放响应的数据
//回显数据
$("#updateEmail").attr("value",data.email);
// $("#updateEmail").attr("readonly","");
$("#updateId").attr("value",data.id);
$("#updateGender").attr("value",data.gender);
$("#updatelastName").attr("value",data.lastName);
}
})
//修改表单提交路径
$("#form_req").attr("action",baseStr+"employee/");
//修改_method参数值
$("#requestMethod").attr("value","put");
$("#f_state").attr("text","当前表单状态为:update")
//修改提交按钮
$("#req_submit").attr("value","确认修改");
return false;
});
//添加员工
$("#add").click(function () {
//获取表单
var form=$("#form_req");
var submitUrl= $("#baseStr").attr("value")+"employee/";
//修改表单提交地址
form.attr("action",submitUrl);
//修改请求方式
$("#requestMethod").attr("value","post");
//修改提交按钮value
$("#req_submit").attr("value","添加该员工");
//修改id框为空
$("#updateId").attr("value","");
return false;
});
})
</script>
<body>
<input type="hidden" id="baseStr" th:value="${session.baseStr}">
<input type="hidden" name="date" id="date" value="">
<table bgcolor="#00ffff" border="1">
<tr><th colspan="4">员工信息</th></tr>
<tr>
<td>id</td>
<td>lastName</td>
<td>email</td>
<td>gender</td>
<td colspan="2">操作</td>
</tr>
<!-- 设置Thymeleaf解析循环-->
<tr th:each="employee: ${employeeList}">
<td th:text="${employee.id}" class="id"></td>
<td th:text="${employee.lastName}" class="lastName"></td>
<td th:text="${employee.email}" class="email"></td>
<td th:text="${employee.gender}" class="gender"></td>
<td><a th:href="${session.baseStr}+'employee/'+${employee.id}" id="delete" class="delete">删除</a></td>
<td><a th:href="${session.baseStr}+'employee/'+${employee.id}" id="update" class="update">更新</a></td>
</tr>
</table>
<a href="" id="add">添加员工</a>
<!--用于提交的表单:修改或者添加的地址都一样,只是请求方式不一样,也可以用于删除-->
<form id="form_req" method="post" >
<table>
<input type="hidden" name="_method" id="requestMethod" >
<input type="text" name="id" value="" id="updateId" hidden="hidden">
<tr>
<td>LastName</td>
<td> <input type="text" name="lastName" value="" id="updatelastName" ><br></td>
</tr>
<tr>
<td>Email</td>
<td> <input type="text" name="email" value="" id="updateEmail"></td>
</tr>
<tr>
<td>Gender</td>
<td> <input type="text" name="gender" value="" id="updateGender" ></td>
</tr>
<tr><td colspan="2"> <input type="submit" id="req_submit" value="提交"></td></tr>
</table>
</form>
</body>
</html>
在web.xml中的配置
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<display-name>Archetype Created Web Application</display-name>
<!-- 前端控制器-->
<servlet>
<servlet-name>DispatcherServlet</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>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 编码过滤器-->
<filter>
<filter-name>encodeFilter</filter-name>
<filter-class>my.filter.EncodeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encodeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 修改请求过滤器-->
<filter>
<filter-name>alterRequest</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>alterRequest</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>