SpringMVC框架学习笔记(八):自定义拦截器和异常处理

自定义拦截器

1.1 什么是拦截器

1.1.1 说明

 (1)Spring MVC 也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定 的功能.

(2)自定义的拦截器必须实现 HandlerInterceptor 接口

1.1.2 自定义拦截器的三个方法

(1)preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行处理。

(2)postHandle():这个方法在目标方法处理完请求后执行

(3)afterCompletion():这个方法在完全处理完请求后被调用,可以在该方法中进行一些资源 清理的操作。

1.2 自定义拦截器执行流程分析图 

自定义拦截器执行流程说明

(1)如果 preHandle 方法返回 false, 则不再执行目标方法, 可以在此指定返回页面

(2)postHandle 在目标方法被执行后执行. 可以在方法中访问到目标方法返回的 ModelAndView 对象

(3)若 preHandle 返回 true, 则 afterCompletion 方法 在渲染视图之后被执行

(4)若 preHandle 返回 false, 则 afterCompletion 方法不会被调用

(5)在配置拦截器时,可以指定该拦截器对哪些请求生效,哪些请求不生效 

1.3 自定义拦截器应用实例

1.3.1 快速入门

 应用实例需求:完成一个自定义拦截器,学习如何配置拦截器和拦截器的运行流程

代码实现: 

(1)创建 MyInterceptor01.java 类,实现 HandlerInterceptor 接口

package com.web.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 MyInterceptor01 implements HandlerInterceptor {

    /**
     * 1.preHandle()在目标方法被执行前执行
     * 2.如果preHandle()返回false,就不会执行目标方法
     * 3.该方法可以获取到request ,response,handler
     * 4.这里根据业务,可以进行拦截,并指定跳转到哪个页面
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("--MyInterceptor01--preHandle()--");
        return true;
    }

    /**
     * 1. 在目标方法执行后,会执行postHandle()
     * 2.
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("--MyInterceptor01--postHandle()--");
    }

    /**
     * 1. 该方法在视图渲染后被执行,这里可以进行资源清理
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("--MyInterceptor01--afterCompletion()--");
    }
}

(2)修改 spring 容器配置文件,增加以下配置

<!--配置自定义拦截器-->
<mvc:interceptors>
    <!--
    1 第一种配置方式,直接使用ref 引用到对应的myInterceptor01
    2 这种方式,会拦截所有的目标方法
    -->
    <ref bean="myInterceptor01"/>

    <!--
    1.第二种配置方式,mvc:mapping path="/hi" 指定要拦截的路径
    2.ref bean="myInterceptor01" 指定对哪个拦截器进行配置
    -->
    <mvc:interceptor>
        <mvc:mapping path="/hi"/>
        <ref bean="myInterceptor01"/>
    </mvc:interceptor>

    <!--
    1. 第3种配置方式
    2. mvc:mapping path="/h*" 通配符方式 表示拦截 /h 打头的路径
    3. mvc:exclude-mapping path="/hello" 表示/hello不拦截
    4. ref bean="myInterceptor01" 指定对哪个拦截器配置
    -->
    <mvc:interceptor>
        <mvc:mapping path="/h*"/>
        <mvc:exclude-mapping path="/hello"/>
        <ref bean="myInterceptor01"/>
    </mvc:interceptor>
</mvc:interceptors>

(3)创建 InteHandler.java 类

package com.web.interceptor;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@SuppressWarnings("All")
@Controller
public class InteHandler {

    @RequestMapping("/hi")
    public String hi(){
        System.out.println("--InteHandler--hi()方法被执行");
        return "success";
    }

    @RequestMapping("/hello")
    public String hello(){
        System.out.println("--InteHandler--hello()方法被执行");
        return "success";
    }
}

 (4)创建前端页面 interceptor.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>测试自定义拦截器</title>
</head>
<body>
<h1>测试自定义拦截器</h1>
<a href="<%=request.getContextPath()%>/hi">测试自定义拦截器-hi</a><br><br>
<a href="<%=request.getContextPath()%>/hello">测试自定义拦截器-hello</a><br/><br/>
</body>
</html>

 (5)测试效果

1.3.2 注意事项和细节

(1)拦截器需要配置才生效,不配置是不生效的.

(2)如果 preHandler() 方法返回了 false, 就不会执行目标方法(前提是你的目标方法被拦截 了), 可以在这里根据业务需要指定跳转页面.

1.4 多个拦截器

1.4.1 多个拦截器执行流程示意图

1.4.2 应用实例 1

(1)创建 MyInterceptor02.java ,作为第二个拦截器

package com.web.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 MyInterceptor02 implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("--MyInterceptor02--preHandle()--");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("--MyInterceptor02--postHandle()--");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("--MyInterceptor02--afterCompletion()--");
    }
}

 (2)在spring容器配置文件 xml文件 中给/hi 配置这两个拦截器

注意:拦截器的执行顺序是和配置顺序一致的

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/hi"/>
        <ref bean="myInterceptor01"/>
    </mvc:interceptor>

    <mvc:interceptor>
        <mvc:mapping path="/hi"/>
        <ref bean="myInterceptor02"/>
    </mvc:interceptor>
</mvc:interceptors>

(3)依然使用前面快速入门案例中的 interceptor.jsp 页面进行测试

1.4.3 注意事项和细节

  • 如果第 1 个拦截器的 preHandle() 返回 false , 后面都不在执行
  • 如 果 第 2 个 拦 截 器 的 preHandle() 返 回 false , 就 直 接 执 行 第 1 个 拦 截 器 的 afterCompletion()方法, 如果拦截器更多,规则类似
  • 说明: 前面说的规则,都是目标方法被拦截的前提 

1.4.2 应用实例 2

 需求: 如果用户提交的数据有禁用词(比如 病毒),则在第 1 个拦截器就返回,不执行目标方法

(1)修改 MyInterceptor01 类中的 preHandle() 方法

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("--MyInterceptor01--preHandle()--");
    if ("病毒".equals(request.getParameter("topic"))){
        request.getRequestDispatcher("/WEB-INF/pages/warning.jsp")
                .forward(request, response);
        return false;
    }
    return true;
}

(2)创建警告页面 warning.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>警告</title>
</head>
<body>
<h1>不要乱说话哦</h1>
</body>
</html>

(3)使用 postman 测试

2 异常处理

2.1 异常处理-基本介绍

(1)Spring MVC 通过 HandlerExceptionResolver 接口处理程序的异常,包括 Handler 映射、数据绑定以及目标方法执行时发生的异常。
(2)使用 Handler 中用 @ExceptionHandler 注解定义的方法 来处理目标方法发生的异常,这就是局部异常。
(3)ExceptionHandlerMethodResolver 类内部若在 Handler 本类中找不到@ExceptionHandler 注解的话,会找 @ControllerAdvice 类的@ExceptionHandler 注解方法, 这样就相当于一个全局异常处理器

(4)异常处理时:局部异常 优先级高于 全局异常,如果异常在局部处理了,就不会进行全局处理

2.2 局部异常

说明:使用@ExceptionHandler注解标注局部异常,该注解的value值可指定要处理的异常类型

实际案例:演示局部异常处理机制

(1)创建 HandlerException.java 类

package com.web.exception;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

@Controller
public class HandlerException {

    /**
     * 1. localException 方法处理局部异常
     * 2. 这里处理ArithmeticException.class算术异常,NullPointerException.class空指针异常
     * 3. Exception exception: 生成的异常对象,会传递给exception, 通过exception可以得到相关的信息
     */
    @ExceptionHandler({ArithmeticException.class, NullPointerException.class})
    public String localException(Exception exception, HttpServletRequest request){
        System.out.println("错误信息--"+exception.getMessage());
        request.setAttribute("result", exception.getMessage());
        return "exception_mes";
    }

    /**
     * 1. 编写方法,模拟算术异常
     * 2. 如果我们不做异常处理,是由tomcat默认页面显示
     */
    @RequestMapping("/testException01")
    public String test01(Integer num){
        int i = 9/num;
        return "success";
    }

}

(2)创建前端测试页面 test_exception.jsp 和 异常页面 exception_mes.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>测试异常</title>
</head>
<body>
<h1>测试异常</h1>
<a href="testException01?num=0">这是个算术异常</a>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>出现异常</title>
</head>
<body>
<h1>出现了异常</h1>
异常信息为--${requestScope.result}
</body>
</html>

(3)测试效果如下

 

2.3 全局异常

说明:使用 @ControllerAdvice 标注一个类, 这个类就相当于一个全局异常处理器

 应用实例:

需求说明:演示全局异常处理机制 , ExceptionHandlerMethodResolver 内部若在 Handler 本类中找不到 @ExceptionHandler 注解的话,会找 @ControllerAdvice 类的@ExceptionHandler 注解方法, 这样就相当于一个全局异常处理器

(1)创建 GlobalException.java 作为一个全局处理器

package com.web.exception;

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

import javax.servlet.http.HttpServletRequest;

@ControllerAdvice
public class GlobalException {

    /**
     * 1. 全局异常就不管是哪个Handler抛出的异常,都可以捕获 , @ExceptionHandler({异常类型})
     * 2. 这里处理的全局异常是NumberFormatException.class,ClassCastException.class
     * 3. Exception exception 接收抛出的异常对象
     */
    @ExceptionHandler({NumberFormatException.class, ClassCastException.class})
    public String globalException(Exception exception, HttpServletRequest request){
        System.out.println("全局异常信息:" + exception.getMessage());
        request.setAttribute("result", exception);
        return "exception_mes";
    }
}

(2)在 HandlerException 类中增加方法 global()

@RequestMapping("/testGlobalException")
public String global(){
    //1. 这里我们模拟了一个异常 NumberFormatException
    //2. 该异常没有在局部异常处理,按照异常处理机制,就会交给全局异常处理类处理
    Integer i = Integer.parseInt("str");
    return "success";
}

(3)创建前端请求

<a href="testGlobalException">点击测试全局异常</a>

(4)启动服务器,测试效果

2.4 自定义异常

说明:通过@ResponseStatus 注解, 可以自定义异常,该注解有两个属性reason异常的原因,value异常的状态。自定义异常需要继承异常类型,比如 RuntimeException

应用实例

(1)创建自定义异常 AgeException.java

package com.web.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(reason = "年龄需要在1-120之间", value = HttpStatus.BAD_REQUEST)
public class AgeException extends RuntimeException{

    public AgeException(){}

    public AgeException(String message){
        super(message);
    }
}

(2)修改 ExceptionHandler.java, 增加方法

@RequestMapping("/testException02")
public String test02(){
    throw new AgeException("年龄必须在1-120之间~~~");
}

 (3)修改 test_exception.jsp, 增加超链接

<a href="testException02">点击测试自定义异常</a>

(4)启动服务器,测试效果

 

 (5)将该异常添加至全局异常处理器

@ExceptionHandler({NumberFormatException.class, ClassCastException.class, AgeException.class})
public String globalException(Exception exception, HttpServletRequest request){
    System.out.println("全局异常信息:" + exception.getMessage());
    request.setAttribute("result", exception);
    return "exception_mes";
}

(6)重新部署,测试效果

2.5 SimpleMappingExceptionResolver 异常统一处理

2.5.1 基本说明

  • 如果希望对所有异常进行统一处理,可以使用 SimpleMappingExceptionResolver
  • 它将异常类名映射为视图名,即发生异常时使用对应的视图报告异常
  • 需要在 ioc 容器中配置

2.5.2 应用实例

需求说明:对数组越界异常进行统一处理,使用 SimpleMappingExceptionResolver

(1)配置 spring 容器配置文件

<!--配置统一处理异常Bean-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <prop key= "java.lang.ArrayIndexOutOfBoundsException">arrEx</prop>
        </props>
    </property>
</bean>

 (2)修改 ExceptionHandler.java , 增加方法 test03

RequestMapping(value = "/testException03")
public String test03(){
    int[] arr = new int[]{3,9,10,190};
    //抛出一个数组越界的异常 ArrayIndexOutOfBoundsException
    System.out.println(arr[90]);
    return "success";
}

(3)创建/WEB-INF/pages/arrEx.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>数组越界异常</title>
</head>
<body>
<h1>异常信息: 数组越界异常</h1>
</body>
</html>

 (4)修改 test_exception.jsp

<a href="<%=request.getContextPath()%>/testException03">点击测试统一处理异常</a>

 (5)启动服务器,测试效果

2.5.3 对未知异常进行统一处理

说明:对未知异常进行统一处理,使用 SimpleMappingExceptionResolver 

应用实例:

(1) 修改 spring 容器配置文件,添加异常类型 Exception

<!--配置统一处理异常Bean-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <prop key= "java.lang.ArrayIndexOutOfBoundsException">arrEx</prop>
            <prop key="java.lang.Exception">allEx</prop>
        </props>
    </property>
</bean>

 (2)修改 ExceptionHandler.java , 增加方法 test04

//如果发生了没有归类的异常, 可以给出统一提示页面
@RequestMapping(value = "/testException04")
public String test04(){
    String str = "hello";
    //这里会抛出 StringIndexOutOfBoundsException
    char c = str.charAt(10);
    return "success";
}

(3)创建/WEB-INF/pages/allEx.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>未知异常信息</title>
</head>
<body>
<h1>朋友,系统发生了未知异常~, 请联系网站管理员</h1>
</body>
</html>

 (4)修改 test_exception.jsp

<a href="testException04">点击测试未知异常</a>

 (5)启动服务器,测试效果

2.6 异常处理的优先级

异常处理的优先级:局部异常 > 全局异常 > SimpleMappingExceptionResolver > tomcat 默认机制 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/714906.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ssh的远程连接(Linux篇)

这里用到的虚拟机时centos7 记得提前先把网络连接好&#xff0c;这里选择的是桥接模式 1.启动ssh服务 # 在centos中启动sshd服务 sudo systemctl start sshd 2.在windows的cmd命令界面内输入以下内容 # ssh centos中的登录用户名centos中的IP地址 ssh yl192.168.1.108 然后…

Python 基础:类

目录 一、类的概念二、定义类三、创建对象并进行访问四、修改属性的值方法一&#xff1a;句点表示法直接访问并修改方法二&#xff1a;通过方法进行修改 五、继承继承父类属性和方法重写父类方法 六、将实例用作属性七、导入类导入单个类从一个模块中导入多个类导入整个模块导入…

效果超越ControlNet+IP-Adapter和FreeControl!Ctrl-X:可控文生图新框架(加州大学英伟达)

文章链接&#xff1a;https://arxiv.org/pdf/2406.07540 项目链接&#xff1a;https://genforce.github.io/ctrl-x/ 最近的可控生成方法&#xff0c;如FreeControl和Diffusion Self-guidance&#xff0c;为文本到图像&#xff08;T2I&#xff09;扩散模型带来了细粒度的空间…

机器学习(V)--无监督学习(一)聚类

根据训练样本中是否包含标签信息&#xff0c;机器学习可以分为监督学习和无监督学习。聚类算法是典型的无监督学习&#xff0c;目的是想将那些相似的样本尽可能聚在一起&#xff0c;不相似的样本尽可能分开。 相似度或距离 聚类的核心概念是相似度(similarity)或距离(distance…

模板方法模式和命令模式

文章目录 模板方法模式1.引出模板模式1.豆浆制作问题2.基本介绍3.原理类图 2.豆浆制作代码实现1.类图2.SoyaMilk.java 豆浆的抽象类3.PeanutSoyaMilk.java 花生豆浆4.RedBeanSoyaMilk.java 红豆豆浆5.Client.java6.结果 3.钩子方法1.基本介绍2.代码实现1.SoyaMilk.java 添加钩子…

数据中台-知识图谱平台

【数据分析小兵】专注数据中台产品领域,覆盖开发套件,包含数据集成、数据建模、数据开发、数据服务、数据可视化、数据治理相关产品以及相关行业的技术方案的分享。对数据中台产品想要体验、做二次开发、关注方案资料、做技术交流的朋友们&#xff0c;可以关注我。 1. 概述 随着…

弗洛伊德算法——C语言

弗洛伊德算法&#xff0c;是一种用于解决所有顶点对之间最短路径问题的经典算法&#xff0c;该算法通过动态规划的方法计算出从每个顶点到其他所有顶点的最短路径。 弗洛伊德算法的基本思想是逐步考虑每一个顶点作为中间点&#xff0c;更新所有顶点对之间的最短路径。它通过以…

开源模型应用落地-LangChain高阶-LCEL-表达式语言(七)

一、前言 尽管现在的大语言模型已经非常强大&#xff0c;可以解决许多问题&#xff0c;但在处理复杂情况时&#xff0c;仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而&#xff0c;现在可以利用langchain来使得模型的应用变得更加直接和简单。 LCEL是什么&…

STM32CubeMX配置-RTC周期唤醒

一、简介 MCU为STM32G070&#xff0c;采用内部时钟32KHZ&#xff0c;配置为周期6s唤醒&#xff0c;调用回调函数&#xff0c;进行喂狗操作。 二、配置 初始时间、日期、周期唤醒时间配置。 开启周期唤醒中断 三、生成代码 调用回调函数&#xff0c;进行喂狗操作。 //RTC唤醒回…

vue-i18n使用步骤详解(含完整操作步骤)

开篇 下面是从创建vue项目开始&#xff0c;完整使用i18n实现国际化功能的步骤&#xff0c;希望对您有所帮助。 完整步骤 创建项目 创建项目&#xff0c;并在创建项目的时候选择vuex,router 选择3.x版本 后面随意选即可&#xff0c;下面是完整的代码结构 安装vue-i18n,并封装…

数据库事务隔离级别

前几天项目上合作公司的系统出现了一次死锁&#xff0c;突然想到由于近几年开发设计的系统并发用户比较少&#xff0c;很久没有碰到过死锁了&#xff0c;因此对死锁的概念也比较生疏了&#xff0c;需要温习一下。 事务 先从最基本的概念开始&#xff0c;事务、及其ACID特性。…

牛客热题:最长上升子序列(一)

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;最长上升子序列(一)题目链接方法…

浅谈赚钱的四个级别,你在哪一层呢

一谈到赚钱&#xff0c;很多人都会扯到&#xff1a;智商、情商、人脉、资源、背景等等&#xff0c;类似“小钱靠勤&#xff0c;中钱靠智&#xff0c;大钱靠德”这样的经典语录都会脱口而出&#xff0c;其实从本质上来讲&#xff0c;都没有错&#xff0c;但这样的说法太缥缈&…

基于CPS-SPWM链式STATCOM系统在电压不平衡环境下控制策略的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于CPS-SPWM链式STATCOM系统在电压不平衡环境下控制策略的simulink建模与仿真。利用电压外环PI调节器得到有功 电流指令值结合由负载侧电流检测 到 的无功 电流指令值 &#…

element-plus表单组件之自动补全组件el-autocomplete和级联选择器组件el-cascader

el-autocomplete 自动补全组件 自补全组件的功能和可以根据输入过滤的el-select组件有些类似。 fetch-suggestions 根据输入框的输入获取建议的内容&#xff0c;其接受值是一个函数&#xff0c;有2个参数&#xff0c;querystring:输入的内容&#xff0c;callback内置函数&…

C 语言连接MySQL 数据库

前提条件 本机安装MySQL 8 数据库 整体步骤 第一步&#xff1a;开启Windows 子系统安装Ubuntu 22.04.4&#xff0c;安装MySQL 数据库第三方库执行 如下命令&#xff1a; sudo aptitude install libmysqlclient-dev wz2012LAPTOP-8R0KHL88:/mnt/e/vsCode/cpro$ sudo aptit…

【论文阅读】AttnDreamBooth | 面向文本对齐的个性化图片生成

文章目录 1 动机2 方法3 实验 1 动机 使用灵活的文本控制可以实现一些特定的概念的注入从而实现个性化的图片生成。 最经典的比如一些好玩的动漫人物的概念&#xff0c;SD大模型本身是不知道这些概念的&#xff0c;但是通过概念注入是可以实现的从而生成对应的动漫人物 两个…

使用Java Spring Boot生成二维码与条形码

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

【分布式计算】java消息队列机制

消息队列是一种在不同组件或应用之间进行数据传递的技术&#xff0c;通常用于处理异步通信。它允许消息的发送者&#xff08;生产者&#xff09;和接收者&#xff08;消费者&#xff09;之间进行解耦。 概念 消息队列是一种先进先出&#xff08;FIFO&#xff09;的数据结构&…

(三十九)Vue之集中式的状态管理机制Vuex

目录 概念vuex的核心概念State&#xff08;状态&#xff09;Getters&#xff08;获取器&#xff09;Mutations&#xff08;突变&#xff09;Actions&#xff08;动作&#xff09; 搭建vuex环境基本使用getters的使用 上一篇&#xff1a;&#xff08;三十八&#xff09;Vue之插槽…