昨日回顾

Git客户端

小乌龟可以通过鼠标的方式操作git。

SpringBoot

Spring:Bean的创建

SpringMVC:它是对Servlet的一个封装,对Web的支持。

SpringBoot:Spring提供用来快速构建Spring应用程序的。

1、概念

快速构建Spring应用程序的,解决SSM配置文件过多的问题,

简化配置,提高开发效率,自动装配

2、怎么简化配置了?怎么提高开发效率?

从导入依赖来讲只需要导入一个spring-boot-straetr-xxxx或者xxxx-boot-starter依赖,其他的依赖都会传递过来。

从配置信息上来讲,所有的配置你不配,多会有一套默认的配置。

自动装配:项目启动会去扫描依赖,就会做这个依赖相关的注入。

内置的tomcat,可以直接使用。

3、SPringBoot工程结构

它也是基于maven俩构建的

Boot常用注解

1、@Value:读取配置文件的信息

2、@Configuration:专门用来修饰配置类

3、@SpringBootApplication:表示主启动类

4、@ConfigurationProperties:批量的读取配置文件,赋值到具体的对象中

5、@Bean:把方法的返回值放到IOC容器里面

6、@ComponentScan:配置包扫描

7、@MappScanner:扫描Mapper接口的

Boot配置文件

applicaiton.properties,键值对的

applicaiton.yml,它有严格的格式要求,属性和属性之间使用冒号,属性名和属性值之间要有空格。

MP

MP是MyBatis的一个插件,它只是在MyBatis之上做了增强,不做改变。

MP的好处就可以自动的完成一些操作,全部靠ORM来完成,通过注解的方式来完成ORM。

1、通用的CRUD接口

2、查询条件

3、分页插件

4、主键生成策略

今日内容

拦截器

拦截器是SpringMVC中的组件,它是用来拦截所有的请求。

1、定义拦截器

package com.qf.application.interceptor;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class UserInterceptor implements HandlerInterceptor {

    // controller调用之前执行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("UserInterceptor.preHandle");
        return true;
    }

    // controller调用之后执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("UserInterceptor.postHandle");
    }

    // 视图渲染完成之后
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("UserInterceptor.afterCompletion");
    }
}

2、配置拦截器

package com.qf.application.config;

import com.qf.application.interceptor.UserInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMVCConfig implements WebMvcConfigurer {


    @Autowired
    private UserInterceptor userInterceptor;
    /**
     * 添加拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(userInterceptor)
                .addPathPatterns("/**") // 配置需要被拦截的路径
                .excludePathPatterns("/hello"); // 配置忽略的路径
    }
}

SpringBoot如何配置全局异常

1、全局异常概念

如果每个接口都去处理各自的异常,那代码就会变的非常臃肿了,后期维护起来也非常的麻烦。

异常的处理有两种方式,要么抛出,要么处理。

大部分异常全部的从接口中抛出,全部到抛某一个地方来做统一的处理,这就是我们的全局异常管理器。

为什么 大部分异常而不是所有异常?

资源相关的异常需要就地解决,出现异常后需要资源的释放。

比如:IO,连接数据库,连接Reids。

2、定义全局异常管理器

package com.qf.application.exception;

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.lang.reflect.MalformedParameterizedTypeException;
import java.util.HashMap;
import java.util.Map;

/**
 * 定义全局异常管理器
 */
@RestControllerAdvice // 返回的JSON格式
public class GlobalExceptionHandler {

    // 系统系统
    @ExceptionHandler(Exception.class) // 如果抛出的异常是Exception的子类就会进入这个方法
    public Map<String, Object> systemException(Exception e) {
        System.out.println("GlobalExceptionHandler.systemException");
        Map<String, Object> map = new HashMap<>();
        map.put("code", 500); // 500是服务端错误
        map.put("msg", "系统正在维护,请稍后再试");
        return map;
    }

    // 业务异常 --》自定义的异常
    @ExceptionHandler(RuntimeException.class) // 如果抛出的异常是Exception的子类就会进入这个方法
    public Map<String, Object> systemException2(RuntimeException e) {
        System.out.println("GlobalExceptionHandler.systemException2");
        Map<String, Object> map = new HashMap<>();
        map.put("code", 500); // 500是服务端错误
        map.put("msg", "运行时异常");
        return map;
    }
}

项目作业添加功能

1、项目出现异常后,所有的异常必须统一的处理。

2、要实现登录功能,所有接口必须要携带token才能访问。

3、访问每个接口需要做token校验

4、Dept也要完成

Restful风格

学习的时候一定去虐自己。

它是一种新的软件架构风格。

之前都是怎么干的?

添加 POST  http://localhost:8080/emp/save
查询全部 GET  http://localhost:8080/emp/list
查询单个 GET  http://localhost:8080/emp/info?id=10
删除     GET http://localhost:8080/emp/delete?id=10
修改    POST http://localhost:8080/emp/update

有了RestFul风格后

资源定位:URL,从URL中得知用户访问的是那个资源?

资源操作:METHOD,从METHOD得知对这个资源做一个什么样的操作。

​ a)GET 查询

​ b)POST 添加

​ c)PUT 修改

​ d)DELTE 删除

满足以上的要求称为RestFul风格。

添加    POST  http://localhost:8080/emp
查询全部 GET  http://localhost:8080/emp
查询单个 GET  http://localhost:8080/emp/10
删除    DELETE http://localhost:8080/emp/10
修改    PUT  http://localhost:8080/emp
method (@RequestBody Employee employee){

}

@RequestBody表示后面传入的数据形式为Json.

service层和mapper层都有自己的命名规则

规范

image-20231024141907074

Session登录的原理

1、服务端如何知道用户是否登录的?

User user = (User)request.getSession().getAttirubet("user");
if(user == null){
    
}

2、Session是原理是怎样的?

​ 登录成功给session中保存了用户的信息,下次过去后从session中获取,能拿到就说明用户已经登录了。

image-20231024152026080

JWT

利用JWT可以生成一个Token,可以给Token揉入一些数据,也可以给Token设置过期时间。

它生成的token就是一个字符串。

JWTtoken由三部分组成,头。载荷,签名。

头部:加密算法

载荷:用户数据

签名:用户名签名的数据

JWT生成的Token不安全,可以被工具给解开,所以不能给JWT中揉入铭感数据。

image-20231024160307432

作业

1、项目出现异常后,所有的异常必须统一的处理。

2、要实现登录功能,所有接口必须要携带token才能访问。

3、访问每个接口需要做token校验

4、DeptCRUD也要完成