当前位置: 首页 > article >正文

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 支持的

当发生 ArithmeticExceptionNullPointerException时,不使用默认异常机制匹配的 xxx.html , 而是显示全局异常机制指定的错误页面

再反射调用处理异常的方法

全局异常优先级大于默认异常处理机制
@COntrollerAdvice会注入到容器
@ExceptionHandler为空,处理任何异常

自定义异常

自定义一个异常 AccessException, 当用户访问某个无权访问的路径时,抛出该异常,显示自定义异常状态码
也可以把自定义异常放在全局异常处理器,仍然走全局异常处理机制,按照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 xxxmapper

controller层加@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 {}


http://www.kler.cn/a/381654.html

相关文章:

  • EasyExcel停更,FastExcel接力
  • Linux系统安装部署xtrabackup
  • Windows 11 安装 Dify 完整指南 非docker环境
  • 12寸半导体厂等保安全的设计思路
  • JavaScript中函数调用时的参数传递
  • Java内存区域进一步详解
  • 什么是区块链中的不可能三角?
  • MySQL数据迁移到SQLServer数据库
  • 数据分析的基本过程
  • 数据中台一键大解析!
  • 《常用深度学习神经网络及其原理与应用场景》
  • [出海记录]开发新手的第 11 个站点上线
  • mysql 和 java 对应数据类型
  • 【java】ArrayList与LinkedList的区别
  • 健身中心运营优化:SpringBoot管理系统
  • 华为HarmonyOS打造开放合规的广告生态 - Banner广告
  • 开源ISP(Infinite-ISP)介绍
  • Rust 力扣 - 2841. 几乎唯一子数组的最大和
  • Ubuntu 20.04 部署向量数据库 Milvus + Attu
  • 【数据结构】哈希思想详解
  • 工作流之Flowable
  • 掌握ElasticSearch(八):聚集、文档间的关系
  • 解决阿里云三个月证书过期 免费SSL证书部署教程
  • Pytest参数详解 — 基于命令行模式!
  • 高级 <HarmonyOS主题课>让您的应用拥有领先的位置服务能力的课后习题
  • 测试自动化如何和业务流程结合?