EL表达式 过滤器 监听器

news2024/11/19 3:35:39

这里写目录标题

  • 1 EL 表达式
    • 1.1 EL 表达式介绍
    • 1.2 EL 表达式快速入门
    • 1.3 EL 表达式获取数据
    • 1.4 EL 表达式注意事项
    • 1.5 EL表达式运算符
    • 1.6 EL 表达式使用细节
    • 1.7 EL 表达式隐式对象
  • 2 JSTL
    • 2.1 JSTL 介绍
    • 2.2 JSTL 核心标签库
    • 2.3 JSTL基本使用
  • 3 Filter
    • 3.1 过滤器介绍
    • 3.2 Filter 介绍
    • 3.3 FilterChain 介绍
    • 3.4 过滤器的使用
    • 3.5 过滤器使用细节
    • 3.6 过滤器生命周期
    • 3.7 FilterConfig
    • 3.8 过滤器的五种拦截行为
  • 4 Listener
    • 4.1 监听器介绍
    • 4.2 监听对象的监听器
    • 4.3 监听域对象属性变化的监听器
    • 4.4 监听会话相关的感知性监听器
    • 4.5 监听器的使用

1 EL 表达式

1.1 EL 表达式介绍

  • EL(Expression Language):表达式语言
  • 在 JSP 2.0 规范中加入的内容,也是 Servlet 规范的一部分
  • 作用:在 JSP 页面中获取数据。让我们的 JSP 脱离 Java 代码块 和 JSP 表达式
  • 语法:${表达式内容}

1.2 EL 表达式快速入门

  • 代码演示
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式快速入门</title>
</head>
<body>
<%--    设置共享数据--%>
    <% request.setAttribute("username","zhangsan"); %>

    java 代码块:<%out.println("username");%><br/>

    java 表达式:<%=request.getAttribute("username")%><br/>

    EL 表达式:${username}
</body>
</html>

1.3 EL 表达式获取数据

<%@ page import="com.txt.bean.Student" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式获取不同类型数据</title>
</head>
<body>
<%--    1. 获取基本数据类型--%>
    <% pageContext.setAttribute("num",10); %>
    基本数据类型:${num}<br/>
<%--    2. 获取自定义数据类型--%>
    <%
        Student stu = new Student("张三",23);
        pageContext.setAttribute("stu",stu);
    %>
    自定义数据类型:${stu}<br/>
    学生姓名:${stu.name}<br/>
    学生年龄:${stu.age}
<%--    3. 获取数组类型--%>
    <%
        String[] arr = {"hello","world"};
        pageContext.setAttribute("arr",arr);
    %>
    数组:${arr}<br/>
    0索引元素:${arr[0]}<br>
    1索引元素:${arr[1]}<br>
<%--    4. 获取List集合--%>
    <%
        ArrayList<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        pageContext.setAttribute("list",list);
    %>
    List集合:${list}<br/>
    0索引元素:${list[0]}<br>
<%--    5. 获取Map集合--%>
    <%
        HashMap<String,Student> map = new HashMap<>();
        map.put("stu01",new Student("张三",23));
        map.put("stu02",new Student("李四",24));
        pageContext.setAttribute("map",map);
    %>
    Map集合:${map}<br>
    第一个学生对象:${map.stu01}<br>
    第一个学生对象的姓名:${map.stu01.name}<br>
</body>
</html>

1.4 EL 表达式注意事项

  • EL 表达式没有空指针异常
  • EL 表达式没有索引越界异常
  • EL 表达式没有字符串的拼接异常

1.5 EL表达式运算符

  • 关系运算符
    在这里插入图片描述
  • 逻辑运算符
    在这里插入图片描述
  • 其他运算符
    在这里插入图片描述
  • 代码演示
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式运算符</title>
</head>
<body>
<%--    empty--%>
    <%
        String str1 = null;
        String str2 = "";
        int[] arr = {};
    %>
    ${empty str1}<br>
    ${empty str2}<br>
    ${empty arr}<br>

<%--    三元表达式--%>
    <%
        pageContext.setAttribute("gender","women");
    %>
    <input type="radio" name="gender" value="men" ${gender == "men" ? "checked":""} /><input type="radio" name="gender" value="women" ${gender == "women" ? "checked":""} /></body>
</html>

1.6 EL 表达式使用细节

  • EL 表达式能够获取四大域对象的数据,根据从小到大在域对象中查找
  • 还有可以获取 JSP 其他八个隐式对象,并调用其方法
  • 代码演示
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL使用细节</title>
</head>
<body>
    <%
//      pageContext.setAttribute("username","张三");
      request.setAttribute("username","张三");
//      session.setAttribute("username","张三");
//      application.setAttribute("username","张三");
    %>

    ${username}<br>

<%--获取 JSP 其他八个隐式对象,并调用其方法--%>
    ${pageContext.request.contextPath}
</body>
</html>

1.7 EL 表达式隐式对象

在这里插入图片描述

  • 代码演示
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式11个隐式对象</title>
</head>
<body>
    <%--pageContext对象 可以获取其他三个域对象和JSP中八个隐式对象--%>
    ${pageContext.request.contextPath} <br>

    <%--applicationScope sessionScope requestScope pageScope 操作四大域对象中的数据--%>
    <% request.setAttribute("username","zhangsan"); %>
    ${username} <br>
    ${requestScope.username} <br>

    <%--header headerValues  获取请求头数据--%>
    ${header["connection"]} <br>
    ${headerValues["connection"][0]} <br>

    <%--param paramValues 获取请求参数数据--%>
    ${param.username} <br>
    ${paramValues.hobby[0]} <br>
    ${paramValues.hobby[1]} <br>

    <%--initParam 获取全局配置参数--%>
    ${initParam["pname"]}  <br>

    <%--cookie 获取cookie信息--%>
    ${cookie}  <br> <%--获取Map集合--%>
    ${cookie.JSESSIONID}  <br> <%--获取map集合中第二个元素--%>
    ${cookie.JSESSIONID.name}  <br> <%--获取cookie对象的名称--%>
    ${cookie.JSESSIONID.value} <%--获取cookie对象的值--%>


</body>
</html>

2 JSTL

2.1 JSTL 介绍

  • JSTL:JSP 标准标签库
  • 主要提供给开发人员一个标准通用的标签库
  • 开发人员可以利用这些标签取代 JSP 页面上的 Java代码,从而提高程序的可读性,降低程序的维护难度
    在这里插入图片描述

2.2 JSTL 核心标签库

在这里插入图片描述

2.3 JSTL基本使用

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>流程控制</title>
</head>
<body>
<%--    向域对象中添加数据--%>
    ${pageContext.setAttribute("score","T")}

<%--    对成绩进行判断--%>
    <c:if test="${score eq 'A'}">
      优秀
    </c:if>

<%--    对成绩进行多条件判断--%>
    <c:choose>
        <c:when test="${score == 'A'}">优秀</c:when>
        <c:when test="${score == 'B'}">良好</c:when>
        <c:when test="${score == 'C'}">及格</c:when>
        <c:when test="${score == 'D'}">较差</c:when>
        <c:otherwise>成绩非法</c:otherwise>
    </c:choose>
</body>
</html>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>循环</title>
</head>
<body>
    <%
        ArrayList<String> list = new ArrayList<>();
        list.add("aa");
        list.add("bb");
        list.add("cc");
        list.add("dd");
        pageContext.setAttribute("list",list);
    %>
    <c:forEach items="${list}" var="str">
        ${str}<br>
    </c:forEach>
</body>
</html>

3 Filter

3.1 过滤器介绍

  • 过滤器——Filter,它是JavaWeb三大组件之一。另外两个是Servlet和Listener。
  • 它是在2000年发布的Servlet2.3规范中加入的一个接口。是Servlet规范中非常实用的技术。
  • 它可以对web应用中的所有资源进行拦截,并且在拦截之后进行一些特殊的操作。
  • 常见应用场景:URL级别的权限控制;过滤敏感词汇;中文乱码问题等等。
  • 过滤器一般用于完成通用操作,例如:登录验证、统一编码处理、敏感字符过滤等等…

3.2 Filter 介绍

  • Filter 是一个借口。如果想实现过滤器的功能,必须实现该接口!
  • 核心方法
    在这里插入图片描述
  • 配置方式
    注解方式
    配置文件

3.3 FilterChain 介绍

  • FilterChain 是一个接口,代表过滤器链对象,由 Servlet 容器提供实现类对象,直接使用即可
  • 过滤器可以定义多个,就会组成过滤器链
    在这里插入图片描述

    如果有多个过滤器,在第一个过滤器中调用下一个过滤器,依次类推。直到到达最终访问资源
    如果只有一个过滤器,放行时,就会直接到达最终访问资源

3.4 过滤器的使用

  • 需求说明
    通过 Filter 过滤器解决多个资源写出中文乱码的问题
  • 最终目的
    通过本需求,最终掌握 Filter 过滤器的作用
  • 代码演示
@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("ServletDemo01执行了...");

        resp.getWriter().write("ServletDemo01执行了...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

@WebServlet("/servletDemo02")
public class ServletDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("ServletDemo02执行了...");

        resp.getWriter().write("ServletDemo02执行了...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
@WebFilter("/*")
public class FilterDemo01 implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filterDemo01执行了...");

        servletResponse.setContentType("text/html;charset=UTF-8");

        filterChain.doFilter(servletRequest,servletResponse);
    }
}

3.5 过滤器使用细节

  • 配置方式
    注解方式 @WebFilter(拦截路径)
    配置文件方式
    在这里插入图片描述
  • 多个过滤器使用顺序
    如果有多喝过滤器,取决于过滤器映射的顺序

3.6 过滤器生命周期

  • 创建
    当应用加载时实例化对象并执行 init 初始化方法
  • 服务
    对象提供服务的过程,执行 doFilter 方法
  • 销毁
    当应用卸载时或服务器停止时对象销毁,执行 destroy 方法

3.7 FilterConfig

在这里插入图片描述

  • FilterConfig 是一个接口。可以加载一些初始化参数
  • 核心方法
    在这里插入图片描述
  • 代码演示
public class FilterDemo03 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("对象创建了...");

        String filterName = filterConfig.getFilterName();
        System.out.println(filterName);

        String username = filterConfig.getInitParameter("username");
        System.out.println(username);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filterDemo01执行了...");

        servletResponse.setContentType("text/html;charset=UTF-8");

        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("对象销毁了...");
    }
}
  • 配置文件
<filter>
        <filter-name>filterDemo03</filter-name>
        <filter-class>com.txt.filter.FilterDemo03</filter-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>zhangsan</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>filterDemo03</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

3.8 过滤器的五种拦截行为

  • Filter 过滤器默认拦截的是请求,但在实际开发中,我们还有请求转发和请求包含,以及由服务器触发调用的全局错误页面,默认情况下过滤器是不参与过滤的,想要使用,就需要我们配置
    在这里插入图片描述

4 Listener

4.1 监听器介绍

  • 观察者设计模式,所有监听器都是基于观察者设计模式的
  • 三个组成部分
    事件源:触发事件的对象
    事件:触发的动作,封装了事件源
    监听器:当事件源触发事件后,可以完成的功能
  • 在程序当中,我们可以对:对象的创建销毁、域对象中属性的变化、会话相关内容进行监听

4.2 监听对象的监听器

  • ServletContextListener:用于监听 ServletContext 对象的创建和销毁
    在这里插入图片描述
  • HttpSessionListener:用于监听 HttpSession 对象的创建和销毁
  • 核心方法
    在这里插入图片描述
  • ServletRequestListener:用于监听 ServletRequest 对象的创建和销毁
  • 核心方法
    在这里插入图片描述

4.3 监听域对象属性变化的监听器

  • ServletContextAttributeListener:用于监听 ServletContext 应用域中属性的变化
  • 核心方法
    在这里插入图片描述
  • HttpSessionAttributeListener:用于监听 HttpSession 会话域中属性的变化
  • 核心方法
  • ServletRequestAttributeListener:用于监听 ServletRequest 请求域中属性的变化
  • 核心方法
    在这里插入图片描述

4.4 监听会话相关的感知性监听器

  • HttpSessionBindingListener:用于感知对象和会话域绑定的监听器
  • 核心方法
    在这里插入图片描述
  • HttpSessionActivationListener:用于感知会话域中对象钝化和活化的监听器
  • 核心方法
    在这里插入图片描述

4.5 监听器的使用

  • 代码演示
@WebListener
public class ServletContextListenerDemo implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("监听到了对象的创建...");

        ServletContext servletContext = sce.getServletContext();
        System.out.println(servletContext);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("监听到了对象的销毁...");
    }
}
  • ServletContextAttributeListener 代码演示
@WebListener
public class ServletContextAttributeListenerDemo implements ServletContextAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        System.out.println("监听到了属性的添加...");

        ServletContext servletContext = scae.getServletContext();
        Object username = servletContext.getAttribute("username");
        System.out.println(username);
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae) {
        System.out.println("监听到了属性的移除...");

        ServletContext servletContext = scae.getServletContext();
        Object username = servletContext.getAttribute("username");
        System.out.println(username);
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent scae) {
        System.out.println("监听到了属性的修改...");

        ServletContext servletContext = scae.getServletContext();
        Object username = servletContext.getAttribute("username");
        System.out.println(username);
    }
}

@WebListener
public class ServletContextListenerDemo implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("监听到了对象的创建...");

        ServletContext servletContext = sce.getServletContext();
        servletContext.setAttribute("username","zhangsan");

        servletContext.setAttribute("username","lisi");

        servletContext.removeAttribute("username");
//        System.out.println(servletContext);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("监听到了对象的销毁...");
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

很全很详细的GUI编程

为什么要学习&#xff1f; 写出自己想要的小工具。工作可能需要维护到swing界面。了解MVC架构&#xff0c;了解监听。 组件&#xff1a;窗口、弹窗、面板、文本框、列表框、按钮、图片、监听事件、鼠标、键盘事件、破解工具。 一、简介 GUI的核心技术&#xff1a;Swing AWT 因…

[附源码]计算机毕业设计基于springboot和vue的茶文化交流平台的设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

路由规则——MVC控制器

MVC的路由规则配置方式比较多,咱们用得最多的是两种: A、全局规则。就是我们熟悉的”{controller}/{action}“。 app.MapControllerRoute(name: "bug",pattern: "{controller}/{action}"); app.MapControllerRoute(name: "八阿哥",pattern: &…

定积分的概念及可积条件

微积分是高等数学的核心&#xff0c;包含微分和积分。前面几篇我们介绍了微分及其逆运算——不定积分&#xff08;严格来说&#xff0c;不定积分属于微分模块&#xff09;。传送门&#xff1a;微分与导数 不定积分今天开始&#xff0c;我们进入积分模块。还是老样子&#xff0…

怎么关闭Windows安全启动?

什么是安全启动&#xff1f; 安全启动&#xff08;英文名为Secure Boot&#xff09;&#xff0c;是装有UEFI固件的较新PC上的一项重要安全功能&#xff0c;它可以保护计算机的启动过程&#xff0c;防止在启动过程中加载未签名的UEFI驱动程序和引导加载程序&#xff0c;以及阻止…

软件测试经典面试题:如何进行支付功能的测试?

非现金支付时代&#xff0c;非现金支付已经成为了生活不可或缺的一部分&#xff0c;我们只需要一台手机便可走遍全国各地&#xff08;前提是支付宝&#xff0c;微信有钱<00>&#xff09;,那么作为测试人员&#xff0c;支付测试也是非常重要的一环&#xff0c;那么下面我就…

Netty03——进阶

目录1.粘包与半包1.1.粘包现象1.2.半包现象1.3.现象分析1.4 解决方案1.4.1.短链接1.4.2.固定长度1.4.3.固定分隔符1.4.4.预设长度2.协议设计与解析2.1.为什么需要协议&#xff1f;2.2.redis 协议举例2.3.http 协议举例2.4.自定义协议要素2.5.编解码器3.聊天室案例3.1.聊天室业务…

Locust学习记录2-locust用户类学习【HttpUser,wait_time,weight和fixed_count属性】

HttpUser 每个模拟用户定义的类&#xff0c;都必须继承HttpUser&#xff0c;目的时为每个用户提供一个client属性&#xff0c;该属性是一个实例HttpSession&#xff0c;可用于向我们要进行负载测试的目标系统发出HTTP请求 当测试开始时&#xff0c;locust将为它模拟的每个用户…

Java内存模型

TOC Java内存模型 Java内存模型&#xff08;Java Memory Model&#xff0c;JMM&#xff09; 是《Java虚拟机规范》中定义的一种用来屏蔽各种硬件和操作系统的内存访问差异&#xff0c;以实现让Java程序在各种平台下都能达到一致性的内存访问效果的一种内存访问模型。从JDK&…

不要再稀里糊涂的使用反射了,四万字带你搞定Java反射(JDK8)

文章目录前言Java反射体系概述类型信息&#xff08;Type&#xff09;GenericDeclarationAnnotatedType成员信息&#xff08;Member&#xff09;属性信息&#xff08;Field&#xff09;构造函数信息&#xff08;Constructor&#xff09;方法信息&#xff08;Method&#xff09;修…

毕业设计-基于机器视觉的指针式仪表智能识别

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

C++ 复制构造函数

在讲解 C 的复制构造函数之前这里先明确一个概念&#xff0c;C 的复制构造函数的意思并不是字面上的意思复制一个构造函数&#xff0c;而是有一种专门用于复制内容的构造函数被叫做复制构造函数。 复制构造函数对于 C 来说是非常重要的概念&#xff0c;所以我们必须掌握并牢记…

jsp设备信息查询系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp设备信息查询系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使用…

【算法笔记(六)】检索算法

算法笔记(六) 检索算法算法笔记(六)前言一、线性查找1.什么是线性查找2.需求规则3.人工图示演示4.代码实现二、二分查找1.什么是二分查找2.需求规则3.人工图示演示4.代码实现三.插值查找1.什么是插值查找2.需求规则3.人工图示演示4.代码实现四.斐波那契查找1.什么是斐波那契查找…

[附源码]计算机毕业设计基于springboot框架的资产管理系统设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

TCP三次握手四次挥手及常见问题解决方案

一、重要概念 位码即tcp标志位,有6种表示: SYN(synchronous建立连接) ACK(acknowledgement 表示响应、确认) PSH(push表示有DATA数据传输) FIN(finish关闭连接) RST(reset表示连接重置) URG(urgent紧急指针字段值有效) 二、三次握手四次挥手流程图 三、三次握手 第一次握手&am…

一段有关MPU配置代码的几个小疑问

当我们阅读一些STM32F7或STM32H7系列芯片例程&#xff0c;或者基于这两类芯片通过cubeMx进行配置并用到MPU功能时&#xff0c;往往会在代码里看到下面这段MPU配置。对这段代码可能有人有些疑问&#xff0c;这里重点一起聊聊其中的3个&#xff0c;供参考。第一个疑问&#xff0c…

【AI工程论文解读】04-通过Ease.ML/CI实现机器学习模型的持续集成(上)

作者&#xff1a;王磊 更多精彩分享&#xff0c;欢迎访问和关注&#xff1a;https://www.zhihu.com/people/wldandan 持续集成是一种软件开发实践&#xff0c;即团队开发成员经常集成他们的工作&#xff0c;通常每个成员每天至少集成一次&#xff0c;也就意味着每天可能会发生多…

机器人xacro设计+gazebo/rviz启动

机器人xacro设计gazebo/rviz启动项目需求方案机器人的本体设计机器人本体集成car_gazebo.xacroinertial惯性矩阵 head.xacro小车底盘base.xacro摄像头camera.xacro雷达laser.xacro机器joint关节控制器传感器sensor设计机器人joint关节控制器move.xacro摄像头传感器camera_senso…

Metabase学习教程:系统管理-7

使用MetabaseAPI MetabaseAPI简介。 本文介绍如何使用Metabase的API。我们自己使用该API连接前端和后端&#xff0c;因此您可以编写Metabase几乎可以执行的所有操作。 警告&#xff1a;MetabaseAPI可能会更改 开始之前有两个注意事项&#xff1a; API可能会更改。API与前端…