目录
2.3新增员工---编写全局异常处理器(全局异常捕获解决异常 ) 22
4.3启用、禁用员工账号---分析页面ajax请求发送过程 33
4.4启用、禁用员工账号---代码开发和功能测试 34 编辑

注:使用Web组件过滤器。SpringMVC中的拦截器。

步骤一:创建自定义过滤器LoginCheckFilter

创建过滤器的的类代码如下:
- package com.itheima.reggie.filter;
-
-
- import lombok.extern.slf4j.Slf4j;
-
- import javax.servlet.*;
- import javax.servlet.annotation.WebFilter;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
-
- /**
- * 检查用户是否已经完成登陆
- */
- @Slf4j
- @WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")//过滤器的名称可以随便命名,
- // 拦截的内容是在urlPatterns中进行设置的。
- public class LoginCheckFilter implements Filter { //因为要实现接口中的方法,所以需要进行接口的实现
-
- @Override
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
- HttpServletRequest request = (HttpServletRequest) servletRequest;//进行一个强制性的类型转换
- HttpServletResponse response = (HttpServletResponse) servletResponse;
- log.info("拦截到请求: {}",request.getRequestURI());//{}表示一个占位符,如果替代参数进行占据位置。是后面request.getRequestURI()的内容
- filterChain.doFilter(request,response);
- }
- }
步骤二:在启动类中添加注解@ServletComponentScan


最后一步如何处理5、未登录则返回未登录结果,实现跳转功能:

然后使用我们公共定义的R类,将code传输为0,则就会实现未登录页面的跳转。
总体代码展示:
- /**
- * 检查用户是否已经完成登陆
- */
- @Slf4j
- @WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")//过滤器的名称可以随便命名,
- // 拦截的内容是在urlPatterns中进行设置的。
- public class LoginCheckFilter implements Filter { //因为要实现接口中的方法,所以需要进行接口的实现
-
- //路径URL匹配器。支持通配符
- public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();//目的是路径进行匹配
- // 使得/backend/index.html和/backend/**的路径信息能够匹配上
- @Override
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
- HttpServletRequest request = (HttpServletRequest) servletRequest;//进行一个强制性的类型转换
- HttpServletResponse response = (HttpServletResponse) servletResponse;
- // log.info("拦截到请求: {}",request.getRequestURI());//{}表示一个占位符,如果替代参数进行占据位置。是后面request.getRequestURI()的内容
- // filterChain.doFilter(request,response);
-
- //1、获取本次请求的URI
- String requestURI = request.getRequestURI();
-
- //定义不需要处理的请求路径
- String[] urls = new String[]{
- "/employee/login",//登陆界面的URL
- "/employee/logout",//登陆退出界面的URL
- "/backend/**",//静态地址中的信息
- "/front/**"//同样也是静态信息的URL
- };
-
- //2、判断本次请求去是否需要处理
- boolean check = check(urls,requestURI);
-
- //3、如果不需要处理,则直接放行
- if(check){
- filterChain.doFilter(request,response);
- return;
- }
- //4、判断登陆状态:如果已经登陆,则放行
- //判断是否已经登陆,使用Session判断这个里面的是否存在字符,如果登陆成功的话会有员工的ID,不为null。
- if (request.getSession().getAttribute("employee") != null){
- filterChain.doFilter(request,response);
- return;
- }
- //5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
- response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));//将数据写回客户端
- return;
-
- }
-
- /**
- * 路径匹配,检查本次请求是否需要放行
- * @param urls
- * @param requestURL
- * @return
- */
- public boolean check (String[] urls,String requestURL){//urls:是前面定义不需要处理的请求路径 requestURL:自己获取的URL
- //对路径信息进行比较
- for (String url : urls) {
- boolean match = PATH_MATCHER.match(url, requestURL);
- if(match){
- return true;
- }
- }
- return false;
- }
- }
也可以直接使用登陆界面的F12进行查看。


点击进行下一步的处理。



目的实现:将在web上添加的数据能够传输到数据库中,并进行保存。

报状态码404的原因:
是因为后台没有写controller,来处理这个请求。
处理前端和后端的解决思路:(根据前端写后端的程序):
首先进入到响应的需要实现的功能下面,然后在该界面下按F12查看页面的数据信息。
第一步:看发送请求的地址是哪里

第二步:看发送请求的数据格式是什么
注:本文的这个是json格式的

该部分主要解决,如果在后台数据新增员工信息,员工的信息重复,怎么办。即解决除了成功保存员工信息外的异常情况。

注:上面有两种解决异常的方法:
方法1:解决的问题有限,不建议使用。
方法2:全局异常捕获
实现全局异常捕获步骤:能大家公用
步骤一:创建全局异常的类

代码:
- package com.itheima.reggie.common;
-
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.ControllerAdvice;
- import org.springframework.web.bind.annotation.ExceptionHandler;
- import org.springframework.web.bind.annotation.ResponseBody;
- import org.springframework.web.bind.annotation.RestController;
-
- import java.sql.SQLIntegrityConstraintViolationException;
-
- /**
- * 全局异常处理
- */
-
- @ControllerAdvice(annotations = {RestController.class, Controller.class})//拦截添加某一类注解的类 比如所EmployeeController类中注解@RestController
- @Slf4j
- @ResponseBody
- public class GlobalExceptionHandleer {
-
-
- /**
- * 异常处理方法
- * @return
- */
- @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
- public R
exceptionHandler(SQLIntegrityConstraintViolationException ex){ -
- log.error(ex.getMessage());
-
- if(ex.getMessage().contains("Duplicate entry")){
- String[] split = ex.getMessage().split(" ");
- String msg = split[2] + "已存在";
- return R.error(msg);
- }
-
-
- return R.error("未知错误!");
- }
- }
步骤二:在controller中添加新增员工操作方法
- /**
- * 新增员工
- * @param employee
- * @return
- */
- @PostMapping
- public R
save(HttpServletRequest request,@RequestBody Employee employee){ - log.info("新增员工,员工信息{}",employee.toString());
- //设置初始密码123456,需要进行md5加密处理
- employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
-
- employee.setCreateTime(LocalDateTime.now());
- employee.setUpdateTime(LocalDateTime.now());
-
- //获得当前登陆用户id
- Long empId = (Long) request.getSession().getAttribute("employee");
-
- employee.setCreateUser(empId);
- employee.setUpdateUser(empId);
-
- employeeService.save(employee);
- return R.success("新增员工成功");
- }

分析数据的流转过程和数据格式:

需求分析:分页条和系统查询的两个功能

问题描述:

其中分页查询会需要使用mybatisplus里面的插件来协助完成 分页查询这个功能。
代码部分:(员工信息分页查询的基本代码框架)
- /**
- * 员工信息分页查询
- * @param page
- * @param pageSize
- * @param name
- * @return
- */
- @GetMapping("/page")
- public R
page(int page,int pageSize,String name){//为什么使用Page这个类,因为在前端获取分页的数据中含有toal和records数据 - // Page类中有所以泛型用page
- log.info("page = {},pageSize = {},name = {}",page,pageSize,name);
- return null;
- }
分页查询代码开发的扩展处理。
- /**
- * 员工信息分页查询
- * @param page
- * @param pageSize
- * @param name
- * @return
- */
- @GetMapping("/page")
- public R
page(int page,int pageSize,String name){//为什么使用Page这个类,因为在前端获取分页的数据中含有total和records数据 - // Page类中有所以泛型用page
- log.info("page = {},pageSize = {},name = {}",page,pageSize,name);
-
- //构造分页构造器
- Page pageInfo = new Page(page,pageSize);
-
- //构造条件构造器
- LambdaQueryWrapper
queryWrapper = new LambdaQueryWrapper(); -
- //添加过滤条件,name不为空才会添加这条内容
- queryWrapper.like(StringUtils.isNotEmpty(name),Employee::getName,name);//StringUtils.isNotEmpty(name):
- // 如果name的字段不为null,则会进行后面的内容
- //Employee::getName根据name字段在Employee类中进行查询。
- //name:查询的内容进行查找
- //添加排序条件
- queryWrapper.orderByDesc(Employee::getUpdateTime);
-
- //执行查询
- employeeService.page(pageInfo,queryWrapper);//这步会在page中自动封装,然后会分解成memberlist中需要total和records数据
- return R.success(pageInfo);
- }
使用debug进行程序的测试处理。










使用这个类可以将json数据格式转换为java格式。 避免精度丢失问题。


本部分的代码:
- /**
- *根据id查询员工信息
- * @param id
- * @return
- */
- @GetMapping("/{id}")
- public R
getById(@PathVariable Long id){ - log.info("根据id查询员工信息");
- Employee employee = employeeService.getById(id);
- if(employee != null){
- return R.success(employee);
- }
- return R.error("没有查询到对应员工信息");
- }