Spring+SpringMVC复习资料(超详细)建议收藏

文章目录

初识Spring

简介:Spring框架是一个开放源代码J2EE应用程序框架,由[Rod Johnson](https://baike.baidu.com/item/Rod Johnson/1423612)发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于J2EE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC

Spring boot 是在基础上加速开发的

Spring Framework 是基础框架

Spring Cloud 分布式开发

创建Spring项目

  • 先建立maven项目

  • 导入坐标Spring-context 坐标

     <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.2.10.RELEASE</version>
            </dependency>
        
    
  • 创建applicationContext.xml 文件即ioc容器管理bean

    id:相当于创建对象的名称,class是要创建对象实现类的位置
        property 配置 所要创建对象里面的属性赋值
    <bean id = "BookService" class="com.itheima.service.impl.BookServiceImpl">
            <property name="bookDao" ref="bookdaoimpl"/>
        </bean>
       
    
  • 在主程序中创建spring容器

    public static void main(String[] args) {
            ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
           /* BookDao bookdaoimpl = (BookDao) ctx.getBean("bookdaoimpl");
            bookdaoimpl.save();*/
            BookService bookService = (BookService) ctx.getBean("BookService");
            bookService.save();
        }
    

    bean 属性的认识

    id 是 bean的表示 表示该类所对应的对象名称

    class 代表你需要管理哪一个类

    name 表示可以给该bean 起别名 可以用空格隔开或者逗号

    scop 表示bean的范围是单例还是多例,scop默认是单例的以下是单例的说明

     BookService bookService = (BookService) ctx.getBean("BookService");
            System.out.println(bookService);
            BookService bookService1 = (BookService) ctx.getBean("BookService");
            System.out.println(bookService1);
    

    image-20220814103600301

以下是多例的说明

scope="prototype"

image-20220814104039534

bean实例化的方式

通过构造方法实例化bean

通过静态工厂实例化bean

需要一个参数factory-method 属性告诉bean真正造对象的方法名

通过非静态工厂实例化bean

因为不是静态方法,不能通过该类直接调用,需要通过该类的对象点方法名调用

image-20220814155337757

因为方式三创建bean麻烦,所以开发者为我们写好了一个接口叫factorybean,我们直接继承这个接口就好了

//<里面表示工厂想要创建什么类型的对象>
public class BookDaoFactoryBean implements FactoryBean<BookDao> {


    @Override
    public BookDao getObject() throws Exception {
        return new BookDaoimpl();
    }

    @Override
    public Class<?> getObjectType() {
        return BookDao.class;
    }
}

bean的生命周期

image-20220814163630058

image-20220814164301476

  • 销毁方式一close()关闭,比较暴力

要想看到bean容器关闭,必须在java虚拟机退出前,关闭bean容器,close方法在主接口中没有,所以要将变量的定义修改为他的实现类

image-20220814164430572

init(),destory(),都是定义在实现类里面的方法,在bean中通过属性告诉bean这是开始和销毁

  • 销毁方式二 关闭钩子registerShutdownHook();

生命周期控制的优化方案

在实现类中继承接口:InitializingBean ,DisposableBean

image-20220814165900766

image-20220814170017100

依赖注入方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jhPpZJuq-1660835421955)(C:\Users\刘国庆\AppData\Roaming\Typora\typora-user-images\image-20220814170442850.png)]

setter注入 标签用property

<bean id = "bookdaoimpl" class="com.itheima.dao.impl.BookDaoimpl">
    <property name="database" value="sssk"/>
    <property name="num" value="10"/>
</bean>

构造器注标签用constructor-arg

<bean id = "bookDao" class="com.itheima.dao.impl.BookDaoimpl">
   <constructor-arg name="database" value="sdfs"/>
    <constructor-arg name="num" value="10"/>
</bean>
  • 自己开发一般使用setter注入

依赖自动装配

对依赖注入的优化

image-20220814183527768

通过bean的属性autowire来指定方式匹配

一般使用按类型装配

image-20220814184528027

集合注入

image-20220814185346254

image-20220814185411373

Spring加载外部配置文件

  • 现在ioc容器中开辟一个命名空间
  • 然后通过命名空间 占位符属性来加载

image-20220814212704241

开辟命名空间

image-20220814212757708

image-20220814213048124

如果配置文件的命名为username=1;

在spring中加载的时候得到的并不是这个

因为变量名称和系统变量名称冲突了,也就是说在系统变量中有一个变量叫username 系统变量的优先级高于配置文件

要想加载自己的变量,就得 配一个属性了

image-20220814213647207

  • 方式一:加载多个配置文件,只需在第一个配置文件后面加个,再加另一个配置文件的名称
  • 方式二:*.properties 加载所有配置文件
  • 标准格式 classpath* 不光加载当前目录下的配置文件,还加载所依赖的所有jar包中的配置文件

image-20220814214341293

image-20220814214548789

容器

创建容器的两种方式

一 是由类路径加载

二是通过文件来加载(写配置文件的绝对路径)

获取bin的三种方式

image-20220814220109117

核心容器总结

image-20220815064333427

image-20220815064402912

注解

注解开发定义bean

  • 先再spring容器中开辟命名空间
  • 使用@Component 定义bean
  • 核心配置文件中扫描bean

image-20220815072421713

image-20220815072515542

纯注解开发模式

  • 将配置文件用类来替换下来

image-20220815074921456

image-20220815075016751

注解开发bean的作用范围与生命周期

image-20220815080923669

注解开发依赖注入

引用依赖注入

使用注解注入的时候不需要在写setter方法了,也不用类提供入口了,只需在要注入的变量上面添加注解@Autowired 根据类型自动装配

image-20220815083717975

image-20220815083735270

简单类型注入

image-20220815084119247

通过注解加载配置文件

  • 先在配置类里面加上配置

image-20220815084951686

第三方bean管理

image-20220815085926722

image-20220815090125585

第三方bean注入

image-20220815104247581

image-20220815104309716

image-20220815104839063

Spring整合mybatis

两个框架的整合

  • 1.首先导入对应的坐标
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.8</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.27</version>
    </dependency>

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.5</version>
    </dependency>

    //spring操作数据库专用的包
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
    
    //mybatis和spring整合,spring提供接口
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.0</version>
    </dependency>

</dependencies>

Spring整合junit

需要导入的坐标



<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.2.10.RELEASE</version>
</dependency>

AOP简介

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

  • aop是一种编程思想,在不惊动原有设计的基础上为其进行功能的增强的

image-20220815204411680

image-20220815204431079

aop开发流程

  • 导入aop坐标
<dependencies>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.4</version>
    </dependency>
</dependencies>

说明spring-context里面包含spring-aop

  • 定义接口与实现类

  • 定义通知类,制作通知

  • 定义切入点

  • 绑定切入点与通知的关系

  • 定义通知类受Spring容器管理,并定义当前类为切面类 @Component ,@Aspect

  • 在spring核心配置里面开启spring对aop注解驱动的支持

  • @EnableAspectJAutoProxy

如果出现配置文件找不到的情况,就是target目录里面没有加载,在pom文件夹里将打包方式改为jar

AOP切入点表达式

image-20220816092143681

image-20220816092525375

image-20220816093611551

对于环绕通知around () 要给一个参数ProceedingJoinPoint获取要环绕的方法,并且方法的返回值可以prossed的方法返回出来。

image-20220816101100113

返回后通知 AfterReturning

抛出异常后通知 AfterThrowing

image-20220816101445961

aop通知获取数据

image-20220816114118513

image-20220816114223566

Spring事务简介

  1. 在业务接口上添加spring事务管理@Transactional(英语意思:事务)

image-20220816134715972

  2. 设置事务管理器

image-20220816135606999

3.开启注解式事务驱动

image-20220816135701939

spring事务角色

  • 事务角色
    • 事务管理员:发起事务,在Spring中通常指代业务层开启事务的方法
    • 事务协调员:加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法

image-20220816152346100

spring事务属性

image-20220816152412738

事务属性使用案例

image-20220816152523574

事务传播行为:事务协调员对事务管理员所携带事务的处理态度(日志)

image-20220816152907253

image-20220816151724695

Spring

SpringMvc简介

  • Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)等等。

img

Springmvc入门案例

  1. 导入坐标
 <!--1.导入坐标spring 和servlet-->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.1.0</version>
  <!--<scope>provided</scope>   servlet和tomcat发生冲突所以加个范围-->
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.2.10.RELEASE</version>
</dependency>
//2.定义controller
//2.1 使用@Controller定义bean
@Controller
public class UserController {
    //2.2  设置当前操作的访问路径
    @RequestMapping("/save")
    //2.3设置当前操作的返回值类型
    @ResponseBody
    public String save(){
        System.out.println("user save...");
        return "{'module':'springmvc'}";
    }
}
//3 创建springmvc的配置文件,加载controller对应的bean
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
//4.定义一个servlet容器启动的配置类,在里面加载spring的配置
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    //加载springmvc容器配置
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }
    //设置那些请求归属springmvc处理
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    //加载spring容器配置
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

注意点

  • web.xml 不要了,删除,用配置类实现
  • 添加tomcat插件的坐标
<build>
<plugins>
  <plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.1</version>
  </plugin>
</plugins>
  </build>

springmvc的工作流程

image-20220816171809104

image-20220816171957773

SpringMVC bean的加载控制

  • 问题:因为功能不同如何避免Spring错误的加载到SpringMVC的bean?

    答:加载Spring控制的bean的时候排除掉SpringMVC控制的bean

方法一

配置你想加载的包

@ComponentScan({"com.itheima.dao","com.itheima.service"})
方法二
@ComponentScan(value="com.itheima",
   excludeFilters = @ComponentScan.Filter(
   type = FilterType.ANNOTATION,
   classes = Controller.class   
   )
)

image-20220816172729395

mybatis自动代理的方式来创建的实现对象,扫描对应dao后为其生成bean并注入到spring容器中

image-20220816174535196

简化开发

  • AbstractAnnotationConfigDispatcherServletInitializer
    

image-20220816174928593

PostMan工具介绍

  • Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件

  • 作用:常用于进行接口测试

​ 下载地址:https://app.getpostman.com/app/download/win64

请求

请求路径的设置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ghbt83x1-1660835421974)(C:\Users\刘国庆\AppData\Roaming\Typora\typora-user-images\image-20220816191859411.png)]

image-20220816191927476

请求参数

  • get请求

image-20220816192814305

  • post请求

image-20220816192851421

​ 乱码处理在servletContainersInitConfig中写一个过滤器:里面引用springmvc写好的filter

image-20220816193720737

五种类型的传参

image-20220816195253855

image-20220816195352753

image-20220816195417598

image-20220816195505878

image-20220816195536821

image-20220816195607001

json数据传递参数

  • json数组
  • json对象(pojo)
  • json数组(pojo

第一步导入json坐标

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.9</version>
</dependency>

第二步在springmvcConfig上配置注解@EnableMvc

第三步在参数前面加上@RequestBody

image-20220816201020508

image-20220816201039399

image-20220816201100211

image-20220816201125260

image-20220816201156179

image-20220816201216788

image-20220816201252566

image-20220816201316163

image-20220816201345946

日期类型传递参数

image-20220816202243024

image-20220816202315890

image-20220816202548076

响应

  • 响应页面
  • 响应数据
    • 文本数据
    • json数据

image-20220816203450957

image-20220816203537094

image-20220816203605268

image-20220816203624227

image-20220816203807887

转换为响应体的具体实现

image-20220816204046916

REST风格简介

image-20220816205028027

image-20220816205701981

入门案例

image-20220816210639269

image-20220816210729592

image-20220816210755578

image-20220816210831264

image-20220816211007885

REST快速开发

image-20220816211809270

image-20220816211837728

案例

image-20220816215304683

image-20220816215354786

image-20220816215427965

SSM整合

1.整合配置

image-20220816215807691

包的基础结构

image-20220817095154297

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sUCiiGJH-1660835421989)(C:\Users\刘国庆\AppData\Roaming\Typora\typora-user-images\image-20220817071259135.png)]

坐标 一共10个依赖坐标

<dependencies>
 <!--1.连接数据库需要的mysql驱动-->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.27</version>
  </dependency>

 <!--2.mybatis框架-->


  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.5</version>
  </dependency>
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.2</version>
  </dependency>

    <!--//servlet-->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
    </dependency>

  <!--3.导入第三方数据池-->
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.8</version>
  </dependency>
  <!--4.导入单元测试类-->
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
  </dependency>
  <!--5.导入sprin相关坐标-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.10.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.10.RELEASE</version>
  </dependency>

   <!--导入json依赖-->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.9</version>
    </dependency>
</dependencies>



<!--6.导入tomacat驱动-->

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <version>2.1</version>
    </plugin>
  </plugins>
</build>

特别注意 导入servlet的时候加入scope

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

image-20220816220140672

image-20220816224739749

一定要注意:@PropertySource(“classPath:jdbc.properties”)//加载数据配置时一定要加上classPath

image-20220816224813690

image-20220816224900436

image-20220816224926644

image-20220816224948680

image-20220816225046225

image-20220816225110005

2.功能模块开发

image-20220817104101891

  • BookDao接口
public interface BookDao {

    @Insert("insert into tbl_book values(null,#{type},#{name},#{description})")
    public void save(Book book);
    @Update("update tbl_book set type=#{type},name=#{name},description = #{description} where id=#{id}")
    public void update(Book book);
    @Delete("delete from tbl_book where id = #{id}")
    public void delete(Integer id);
    @Select("select * from tbl_book where id = #{id}")
    public Book selectById(Integer id);
    @Select("select * from tbl_book")
    public List<Book> selectAll();
}
  • BookService接口
@Transactional
public interface BookService {
    /**
     * 保存业务
     * @param book
     * @return
     */

    public boolean save(Book book);

    /**
     * 更新业务
     * @param book
     * @return
     */

    public boolean update(Book book);

    /**
     * 删除业务
     * @param id
     * @return
     */

    public boolean delete(Integer id);

    /**
     * 根据id查询业务
     * @param id
     * @return
     */

    public  Book selectById(Integer id);

    /**
     * 查询所有数据
     * @return
     */
    public List<Book> selectAll();
}
  • BookServiceImpl 实现类
package com.itheima.service;

import com.itheima.dao.BookDao;
import com.itheima.domain.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;
    @Override
    public boolean save(Book book) {
        bookDao.save(book);
        return true;
    }

    @Override
    public boolean update(Book book) {
        bookDao.update(book);
        return true;
    }

    @Override
    public boolean delete(Integer id) {
        bookDao.delete(id);
        return true;
    }

    @Override
    public Book selectById(Integer id) {
       return bookDao.selectById(id);

    }

    @Override
    public List<Book> selectAll() {
        return bookDao.selectAll();
    }
}
  • 实体Book
public class Book {
    private Integer id;
    private String type;
    private String name;
    private String description;

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", type='" + type + '\'' +
                ", name='" + name + '\'' +
                ", description='" + description + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}
  • BookController
@RestController  //说明该类是一个控制器
@RequestMapping("books")  //设置请求的访问路径
public class BookController {

    @Autowired
    private BookService bookService;

    @PostMapping
    public boolean save(@RequestBody Book book){
           return bookService.save(book);
    }

    @PutMapping
    public boolean update(@RequestBody Book  book){
        return bookService.update(book);
    }

    @DeleteMapping("/{id}")
    public boolean delete(@PathVariable Integer id){
        return bookService.delete(id);
    }

    @GetMapping("/{id}")
    public Book getById(@PathVariable Integer id){
        return bookService.selectById(id);
    }
    @GetMapping
    public List<Book> selectAll(){
        return bookService.selectAll();
    }

}

3.接口测试

4.前后端结合

表现层数据封装统一格式步骤:
  • 1.在controller包下定义模型类
 public Result() {
    }

    public Result(Object data, Integer code) {
        this.data = data;
        this.code = code;
    }

    public Result(Object data, Integer code, String msg) {
        this.data = data;
        this.code = code;
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

2.定义code类里面的数据

public class Code {
    public static final Integer SAVE_OK = 20011;
    public static final Integer DELETE_OK = 20021;
    public static final Integer UPDATE_OK = 20031;
    public static final Integer GET_OK = 20041;



    public static final Integer SAVE_ERR = 20010;
    public static final Integer DELETE_ERR = 20020;
    public static final Integer UPDATE_ERR = 20030;
    public static final Integer GET_ERR = 20040;


}

3修改cotroller里面的数据

@PostMapping
public Result save(@RequestBody Book book){
    boolean flag = bookService.save(book);
    return new Result(flag ? Code.SAVE_OK:Code.SAVE_ERR,flag);

}

@PutMapping
public Result update(@RequestBody Book  book){
    boolean flag = bookService.update(book);
    return new Result(flag ? Code.UPDATE_OK:Code.UPDATE_ERR,flag);
}

@DeleteMapping("/{id}")
public Result delete(@PathVariable Integer id){
    boolean flag = bookService.delete(id);
    return new Result(flag ? Code.DELETE_OK:Code.DELETE_ERR,flag);
}

@GetMapping("/{id}")
public Result getById(@PathVariable Integer id){
    Book book = bookService.selectById(id);
    Integer code = book !=null ? Code.GET_OK:Code.GET_ERR;
    String msg = book != null ? "" :"数据查询失败,请重试";
    return new Result(code,book,msg);
}
@GetMapping
public Result selectAll(){
    List<Book> books = bookService.selectAll();
    Integer code = books !=null ? Code.GET_OK:Code.GET_ERR;
    String msg = books != null ? "" :"数据查询失败,请重试";
    return new Result(code,books,msg);
}

异常处理器

1.在controller包下创建一个类,声明成异常处理@Rest ControllerAdvice

image-20220817144621775

image-20220817144429772

在方法上声明要处理什么类型的异常@ExceptionHandler

image-20220817144649634

@RestControllerAdvice
public class ProjectExceptionAdvice {
    @ExceptionHandler(Exception.class)
    public Result doException(Exception ex){
        return new Result(666,null,"出异常啦");
    }
}

异常的分类

image-20220817171812515

项目异常处理方案

image-20220817171934575

1.首先创建两个异常类

image-20220817175119645

//这是我们自定义的一个异常类,继承RuntimeException的目的是出现异常不处理自动向上一级抛
public class BusinessException extends RuntimeException {

    private Integer code;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public BusinessException(String message, Integer code) {
        super(message);
        this.code = code;
    }

    public BusinessException(String message, Throwable cause, Integer code) {
        super(message, cause);
        this.code = code;
    }

}

2.自己创建抛两个异常

if(id == 1){
    throw new BusinessException("请不要使用你的技术来挑战我的耐性!", Code.BUINESS_ERR);
}

     try{
         int i = 1/0;
     }
     catch (Exception e){
         throw new SystemException("服务器访问超时,请重试",Code.SYSTEM_TIMEOUT_ERR);
     }

       return bookDao.selectById(id);

    }

3.在异常处理器里面管理这两个异常

@ExceptionHandler(BusinessException.class)
public Result doBusinessException(BusinessException ex){

    return new Result(ex.getCode(),null,ex.getMessage());
}

@ExceptionHandler(SystemException.class)
public Result doSystemException(SystemException ex){
    //记录日志
    //发送消息给运维
    //发送邮件给开发人员

    return new Result(ex.getCode(),null,ex.getMessage());
}

//其他异常
@ExceptionHandler(Exception.class)
public Result doException(Exception ex){
    //记录日志
    //发送消息给运维
    //发送邮件给开发人员
    return new Result(Code.SYSTEM_UNKNOW_ERR,null,"系统繁忙,请稍后再试");
}

4.在Code里面定义异常的类型编码

public static final Integer SYSTEM_ERR = 50001;
public static final Integer SYSTEM_TIMEOUT_ERR = 50002;
public static final Integer SYSTEM_UNKNOW_ERR = 59999;


public static final Integer BUINESS_ERR = 60002;

完成!

前后台协议联调-----静态界面放行

  1. 添加前端代码
  2. SpringMVC将前端代码的静态页面放行

image-20220817194218895

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
          registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
          registry.addResourceHandler("/css/**").addResourceLocations("/css/");
          registry.addResourceHandler("/js/**").addResourceLocations("/js/");
          registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
    }
}

3.将配置加载到Springmvc的核心配置里面

@ComponentScan({"com.itheima.controller","com.itheima.config"})

拦截器

浏览器发出请求到达tomcat服务器,然后拦截所有请求,资源划分为静态资源和动态资源,对于静态资源(html,css,js,图片,声音)tomcat直接给你,动态资源会直接进入到servlet或者说是controller中吗?不是,在进入之前会有一个过滤器(可以多层)直到访问到你的控制器上 在spring中有一个中央控制器,根究你的请求路径,访问具体的controller

  • 需求:在访问具体的contoller之前要确定你的(权限)这就出现了拦截器(访问前后都对数据做处理)

image-20220818113220127

image-20220818113651735

拦截器和过滤器的区别

image-20220818113851526

开发步骤:

  • 先写拦截类

  • 配置拦截器作用于哪个controller

  • 配置是何种请求才会触发拦截器

image-20220818122845626

image-20220818122907255

image-20220818122927611

执行流程

image-20220818124341115

多拦截器

C将前端代码的静态页面放行

[外链图片转存中…(img-rDRTrKLd-1660835421994)]

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
          registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
          registry.addResourceHandler("/css/**").addResourceLocations("/css/");
          registry.addResourceHandler("/js/**").addResourceLocations("/js/");
          registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
    }
}

3.将配置加载到Springmvc的核心配置里面

@ComponentScan({"com.itheima.controller","com.itheima.config"})

拦截器

浏览器发出请求到达tomcat服务器,然后拦截所有请求,资源划分为静态资源和动态资源,对于静态资源(html,css,js,图片,声音)tomcat直接给你,动态资源会直接进入到servlet或者说是controller中吗?不是,在进入之前会有一个过滤器(可以多层)直到访问到你的控制器上 在spring中有一个中央控制器,根究你的请求路径,访问具体的controller

  • 需求:在访问具体的contoller之前要确定你的(权限)这就出现了拦截器(访问前后都对数据做处理)

[外链图片转存中…(img-q8m2FKgz-1660835421994)]

[外链图片转存中…(img-EKeJScqt-1660835421994)]

拦截器和过滤器的区别

[外链图片转存中…(img-oNyySsJD-1660835421995)]

开发步骤:

  • 先写拦截类

  • 配置拦截器作用于哪个controller

  • 配置是何种请求才会触发拦截器

[外链图片转存中…(img-2EKBiq17-1660835421995)]

[外链图片转存中…(img-yAVXICgE-1660835421995)]

[外链图片转存中…(img-01pD979c-1660835421996)]

执行流程

[外链图片转存中…(img-RLHjQU7U-1660835421996)]

多拦截器

image-20220818142211547

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶落q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值