目录
2.3新增员工---编写全局异常处理器(全局异常捕获解决异常 ) 22
4.3启用、禁用员工账号---分析页面ajax请求发送过程 33
4.4启用、禁用员工账号---代码开发和功能测试 34 编辑
一、完善登陆功能 16
1.1问题分析
注:使用Web组件过滤器。SpringMVC中的拦截器。
1.2代码实现 16
步骤一:创建自定义过滤器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
1.3完善登陆功能—代码开发 17(完善过滤器处理逻辑)
最后一步如何处理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;
}
}
1.4完善登陆功能---功能测试 18
也可以直接使用登陆界面的F12进行查看。
点击进行下一步的处理。
二、新增员工页面设计 19
2.1需求分析
2.2新增员工---梳理程序执行流程(代码开发) 20
目的实现:将在web上添加的数据能够传输到数据库中,并进行保存。
报状态码404的原因:
是因为后台没有写controller,来处理这个请求。
处理前端和后端的解决思路:(根据前端写后端的程序):
首先进入到响应的需要实现的功能下面,然后在该界面下按F12查看页面的数据信息。
第一步:看发送请求的地址是哪里
第二步:看发送请求的数据格式是什么
注:本文的这个是json格式的
2.3新增员工---编写全局异常处理器(全局异常捕获解决异常 ) 22
该部分主要解决,如果在后台数据新增员工信息,员工的信息重复,怎么办。即解决除了成功保存员工信息外的异常情况。
注:上面有两种解决异常的方法:
方法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<String> 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<String> 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("新增员工成功");
}
2.4新增员工---小结 24
分析数据的流转过程和数据格式:
三、员工信息分页查询
3.1需求分析 25
需求分析:分页条和系统查询的两个功能
3.2员工信息分页查询---梳理程序执行过程 26
问题描述:
3.3员工信息分页查询---代码开发 27
其中分页查询会需要使用mybatisplus里面的插件来协助完成 分页查询这个功能。
代码部分:(员工信息分页查询的基本代码框架)
/**
* 员工信息分页查询
* @param page
* @param pageSize
* @param name
* @return
*/
@GetMapping("/page")
public R<Page> page(int page,int pageSize,String name){//为什么使用Page这个类,因为在前端获取分页的数据中含有toal和records数据
// Page类中有所以泛型用page
log.info("page = {},pageSize = {},name = {}",page,pageSize,name);
return null;
}
3.4员工信息分页查询---代码开发2 28
分页查询代码开发的扩展处理。
/**
* 员工信息分页查询
* @param page
* @param pageSize
* @param name
* @return
*/
@GetMapping("/page")
public R<Page> 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<Employee> 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);
}
3.5员工信息分页查询---功能测试 29
使用debug进行程序的测试处理。
四、启用/禁用员工账号 31
4.1需求分析 31
4.2启用、禁用员工账号---分析页面按钮动态效果 32
4.3启用、禁用员工账号---分析页面ajax请求发送过程 33
4.4启用、禁用员工账号---代码开发和功能测试 34
4.5启用、禁用员工账号---代码修复配置消息转换器 35
使用这个类可以将json数据格式转换为java格式。 避免精度丢失问题。
五、编辑员工信息
5.1需求分析 37
5.2编辑员工信息---页面效果分析和代码开发 38
本部分的代码:
/**
*根据id查询员工信息
* @param id
* @return
*/
@GetMapping("/{id}")
public R<Employee> getById(@PathVariable Long id){
log.info("根据id查询员工信息");
Employee employee = employeeService.getById(id);
if(employee != null){
return R.success(employee);
}
return R.error("没有查询到对应员工信息");
}