SpringBoot2~~~
目录
拦截器与过滤器的区别
异常处理
自定义异常页面
全局异常
自定义异常
注入Servlet、Filter、Listener
使用注解方式注入
@WebServlet
@WebFilter
@WebListener
使用RegisterationBean方式注入
内置Tomcat配置和切换
通过application.yml来配置
通过类来配置
切换WebServer,切换成Undertow
数据库操作
JDBC+HikariDataSource
整合Druid到Spring-Boot
自定义方式
Druid基本使用
Durid监控功能
引入starter方式
整合Mybatis
配置文件
注解解决时间问题
整合Mybatis-Plus
引入依赖
application.yml配置数据源参数
使用德鲁伊数据源
@MapperScan
@TableName
拦截器与过滤器的区别
Servlet可以理解成DispatcherServlet,执行doService()再执行doDispatch()分发
当请求过来,先走过滤器,走doService()方法然后分发,再走拦截器(如果被拦截的话)
过滤器不会处理请求转发(在浏览器内部之间,不会从外部发出)
拦截器会处理请求转发(作为spring的一个组件,除非放行不会处理)
重定向要走过滤器,因为是从浏览器发出请求
异常处理
自定义异常页面
按照状态码来处理
Spring Boot 提供/error(默认)请求转发的方式处理所有错误的映射,会走拦截器
如果浏览器访问不存在的映射,会响应“whitelabel”错误视图
底层默认由DefaultErrorViewResolver处理错误provider:
1、目录下没有指定响应码(404)的错误页面,就是null
在resolveResource方法遍历肯定也找不到页面,最后返回null
2、重新进入resolve方法,查找4xx页面,如果存在,provider不为null,否则为null。
在resolveResource方法遍历查找4xx,如果找不到返回默认的error页面
1、找(/error+具体错误的状态码页面),比如404页面,/error/404
2、找/error/4xx
3、最后找默认的页面显示错误
静态文件 模板引擎
使用模板引擎
存放在request域中,使用Thymeleaf能够在html页面输出错误信息
全局异常
按照java类型来处理
@ControllerAdvice+@ExceptionHandler 处理全局异常
底层是 ExceptionHandlerExceptionResolver 支持的
当发生 ArithmeticException、NullPointerException时,不使用默认异常机制匹配的 xxx.html , 而是显示全局异常机制指定的错误页面
再反射调用处理异常的方法
@COntrollerAdvice会注入到容器@ExceptionHandler为空,处理任何异常
自定义异常
也可以把自定义异常放在全局异常处理器,仍然走全局异常处理机制,按照java异常类型来处理
先走ExceptionHandlerExceptionResolver查看是否有方法处理这个异常 如果没有,就走 DefaultErrorViewResolver的 resolve方法,按照状态码处理
注入Servlet、Filter、Listener
使用注解方式注入
需要使用 @ServletComponentScan指定要扫描的原生组件才会注入到spring容器
@WebServlet
注入的原生的Servlet_ 不会被spring-boot的拦截器拦截,和DispatherServlet是同一级别
原因分析:
一个是tomcat组件,一个是spring组件
请求 Servlet
如果匹配到映射,直接执行doGet或doPost,不会到达 DispatherServlet,不会执行拦截器
如果没有匹配到映射,最后的路径会找 / ,会到达DispatherServlet,执行拦截器
@WebFilter
1、以前通过一个类实现Filter,在web.xml配置url-patern
2、过滤器配置的urlPatterns也会经过Springboot拦截器
3、在servlet匹配全部是/*,在Spring匹配全部是/**
@WebListener
使用RegisterationBean方式注入
将三个注解和@ServletComponentScan去掉
内置Tomcat配置和切换
通过application.yml来配置
比通过类配置更加全面
通过类来配置
切换WebServer,切换成Undertow
数据库操作
JDBC+HikariDataSource
HikariDataSource是springboot2默认数据源
在pom.xml引入data-jdbc-starter
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency>
Spring Boot 不知道项目要操作 Mysql 还是 Oracle , 需要在 pom.xml 指定导入数据库驱动, 并指定对应版本
@SpringBootTest
class SpringbootApplicationTests {
@Resource
private JdbcTemplate jdbcTemplate;
@Test
void t1() {
BeanPropertyRowMapper<Admin> rowMapper =
new BeanPropertyRowMapper<>(Admin.class);
List<Admin> admins = jdbcTemplate.query("select * from `admin`", rowMapper);
for (Admin admin : admins) {
System.out.println(admin);
}
System.out.println("数据源:" + jdbcTemplate.getDataSource().getClass());
}
}
整合Druid到Spring-Boot
自定义方式
Druid基本使用
1、修改pom.xml,引入druid依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.23</version>
</dependency>
2、创建配置类
如果没有dataSource配置,默认是HikanDataSource
Durid监控功能
原本是web.xml文件配置,现在使用配置类
import com.alibaba.druid.support.jakarta.StatViewServlet;
import com.alibaba.druid.support.jakarta.WebStatFilter;
@Configuration
public class Druid {
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource() throws SQLException {
DruidDataSource druidDataSource = new DruidDataSource();
//加入监控功能, 加入sql防火墙监控
//set用来设置DataSource的属性,类似name-value
druidDataSource.setFilters("stat,wall");
return druidDataSource;
}
//配置druid的监控页功能
@Bean
public ServletRegistrationBean statViewServlet() {
StatViewServlet statViewServlet = new StatViewServlet();
ServletRegistrationBean<StatViewServlet> servletRegistrationBean =
// druid监控的访问页面是/druid/*
//配置好之后,访问/druid下的地址的时候都会先登录
new ServletRegistrationBean<>(statViewServlet, "/druid/*");
// 开启监控页面的访问登录账号和密码
servletRegistrationBean.addInitParameter("loginUsername", "druid");
servletRegistrationBean.addInitParameter("loginPassword", "123456");
return servletRegistrationBean;
}
//配置WebStatFilter, 用于采集web-jdbc关联的监控数据
@Bean
public FilterRegistrationBean webStatFilter() {
WebStatFilter webStatFilter = new WebStatFilter();
FilterRegistrationBean<WebStatFilter> filterRegistrationBean =
new FilterRegistrationBean<>(webStatFilter);
//默认对所有的url请求进行监控
filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
//排除指定的url
filterRegistrationBean.addInitParameter
("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
引入starter方式
去掉druid的依赖和配置类
引入druid strater和application.yml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.15</version>
</dependency>
spring:
datasource:
url: jdbc:mysql://localhost:3306/spring_boot?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
#配置druid和监控功能
druid:
stat-view-servlet:
enable: true
login-username: jack
login-password: 666
reset-enable: false
#配置web监控
web-stat-filter:
enable: true
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
整合Mybatis
mapper层加@Mapper
service层加@Service(在实现类上加),装配Xxxmapper xxxmappercontroller层加@Controller,装配XxxService xxxservice
引入mybatis starter、mysql、配置处理器
application.yml设置数据源信息
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
设置与数据库对应的JavaBean
Resource目录下创建mapper目录,新建xxmapper.xml
java目录下创建mapper目录,新建xxmapper接口
配置文件
如果配置比较简单,就直接在application.yml配置即可
如果配置内容比较多,可以考虑单独的做一个mybatis-config.xml
使用mybatis-config.xml
注解解决时间问题
//GMT 就是格林尼治标准时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date birthday;
整合Mybatis-Plus
引入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
引入了mybatis、自动配置、jdbc,不需要重复引入
application.yml配置数据源参数
server:
port: 9090
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot_mybatisplus?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
使用德鲁伊数据源
@Configuration
public class DruidDataSourceConfig {
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource() throws SQLException {
DruidDataSource druidDataSource =
new DruidDataSource();
return druidDataSource;
}
}
创建Bean,比如Monster类
Mapper层
创建xxMapper接口,继承BaseMapper<>
BaseMapper默认提供了很多curd方法,可以直接使用,也可以自定义方法
@Mapper
public interface MonsterMapper extends BaseMapper<Monster> {}
现在可以在测试类中运行
Service层
传统方式:在接口中声明方法,然后使用实现类在mybatis-plus中,可以继承父接口IService,提供了很多crud方法,也可以自定义方法
public interface MonsterService extends IService<Monster> {}
Service层实现类
传统方式:直接实现接口在mybatis-plus中,需要继承ServiceImpl
@Service
public class MonsterServiceImpl
extends ServiceImpl<MonsterMapper, Mapper>
implements MonsterService {}
@MapperScan
可以扫描指定包中的mapper接口,就不需要在每个mapper接口加上@Mapper
@MapperScan(basePackages = {"com.springboot.mybatis.mapper"})
@TableName
类名和表名不一致,一致可以省略
@TableName(value = "monster")
public class Mon {}