昨日回顾
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层都有自己的命名规则
规范
Session登录的原理
1、服务端如何知道用户是否登录的?
User user = (User)request.getSession().getAttirubet("user");
if(user == null){
}
2、Session是原理是怎样的?
登录成功给session中保存了用户的信息,下次过去后从session中获取,能拿到就说明用户已经登录了。
JWT
利用JWT可以生成一个Token,可以给Token揉入一些数据,也可以给Token设置过期时间。
它生成的token就是一个字符串。
JWTtoken由三部分组成,头。载荷,签名。
头部:加密算法
载荷:用户数据
签名:用户名签名的数据
JWT生成的Token不安全,可以被工具给解开,所以不能给JWT中揉入铭感数据。
作业
1、项目出现异常后,所有的异常必须统一的处理。
2、要实现登录功能,所有接口必须要携带token才能访问。
3、访问每个接口需要做token校验
4、DeptCRUD也要完成