皓学IT:WEB06_ EL表达式JSTL标签库

一、EL表达式

1.1.特点

  • 是一个由java开发的工具包

  • 用于从特定域对象中读取并写入到响应体开发任务,不能向域对象中写入。

  • EL工具包自动存在Tomcat的lib中(el-api.jar),开发是可以直接使用,无需其他额外的包。

  • 标准格式 : ${域对象别名.。关键字} 到指定的域中获取相应关键字的内容,并将其写入到响应体。

1.2.域对象

注:使用时可以省略域对象别名

默认查找顺序: pageScope -> requestScope -> sessionScope -> applicationScope

最好只在pageScope中省略

对应案例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>jsp</title>
</head>
<body>
    <%
        application.setAttribute("name","applcation");
        session.setAttribute("name","session");
        request.setAttribute("name","request");
        pageContext.setAttribute("name","pageContext");
    %>
    <br>--------------使用java语言----------------<br>
    application中的值:<%= application.getAttribute("name")%><br>
    session中的值:<%= session.getAttribute("name")%><br>
    request中的值:<%= request.getAttribute("name")%><br>
    pageContext中的值:<%= pageContext.getAttribute("name")%><br>
​
    <br>--------------使用EL表达式----------------<br>
    application中的值:${applicationScope.name}<br>
    session中的值:${sessionScope.name}<br>
    request中的值:${requestScope.name}<br>
    pageContext中的值:${pageScope.name}<br>
​
    <br>--------------使用EL表达式,省略域对象----------------<br>
    application中的值:${name}<br>
</body>
</html>

 

1.3.支持的运算

(1)数学运算

(2)比较运算 > gt < lt >= ge <= le == eq != !=

(3)逻辑预算 && || !

对应案例:


<%@ page import="com.sun.org.apache.xpath.internal.operations.Bool" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL运算</title>
</head>
<body>
<%
    request.setAttribute("num1","12");
    request.setAttribute("num2","14");
​
    application.setAttribute("flag1",true);
    application.setAttribute("flag2",false);
%>
<br>---------------使用java语言-------------------<br>
<%
    String num1 = (String)request.getAttribute("num1");
    String num2 = (String)request.getAttribute("num2");
    int num3 = Integer.parseInt(num1)+Integer.parseInt(num2);
​
    boolean flag1 = (Boolean)application.getAttribute("flag1");
    boolean flag2 = (Boolean)application.getAttribute("flag2");
    boolean flag3 = flag1 && flag2;
​
    //输出方式一
    out.write(Boolean.toString(flag3));
%>
<!-- 输出方式二 -->
<h1><%=num3%></h1>
​
<br>---------------使用EL表达式-------------------<br>
<h1>${ requestScope.num1 + requestScope.num2 }</h1>
<h1>${ requestScope.num1 > requestScope.num2 }</h1>
<h1>${ applicationScope.flag1 && applicationScope.flag2 }</h1>
​
</body>
</html>

1.4.其他的内置对象

(1)param 使用 ${param.请求参数名} 从请求参数中获取参数内容

(2)paramValues 使用 ${ paramValues.请求参数名 } 从请求参数中获取多个值,以数组的形式

(3)initParam 使用 ${ initParam.参数名 } 获取初始化参数

<%@ page import="com.sun.org.apache.xpath.internal.operations.Bool" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>其他内置对象</title>
</head>
<body>
    url:...?username=zhangsan&password=admin<br>
    url中的参数:用户名:${param.username} --- 密码:${param.password}<br>
    -------------------------------------------<br>
    url:...?username=zhangsan&username=lisi
    url中的参数:用户1:${paramValues.username[0]} ---
               用户2:${paramValues.username[1]}<br>
    -------------------------------------------<br>
​
    <!--
        在web.xml中添加启动参数
        <context-param>
            <param-name>driver</param-name>
            <param-value>com.mysql.jdbc.Driver</param-value>
        </context-param>
    -->
    获取启动参数:${initParam.driver}
    
</body>
</html>

1.5.EL表达式的缺陷

(1)只能读取域对象中的值,不能写入

(2)不支持if判断和控制语句

二、 JSTL标签工具类

2.1.基本介绍

(1) JSP Standrad Tag Lib jsp标准标签库

(2) 是sun公司提供

(3) 组成

(4)使用原因:使用简单,且在JSP编程当中要求尽量不出现java代码

2.2.使用方式

(1)导入依赖的jar包 jstl.jar standard.jar

(2)在jsp中引入JSTL的core包依赖约束

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

2.3.重要标签的使用

2.3.1.<c: set>

在JSP文件上设置域对象中的共享数据

<%@ page import="com.sun.org.apache.xpath.internal.operations.Bool" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title> c:set </title>
</head>
<body>
​
    <%--相当于
    <%
        request.setAttribute("name","zhangsan");
    %>
    --%>
    <c:set scope="request" var="name" value="zhangsan"/>
    通过JSTL添加的作用域的值:${requestScope.name} <br>
    <c:set scope="application" var="name" value="lisi"/>
    通过JSTL添加的作用域的值:${applicationScope.name} <br>
    <c:set scope="session" var="name" value="wangwu"/>
    通过JSTL添加的作用域的值:${sessionScope.name} <br>
    <c:set scope="page" var="name" value="zhaoliu"/>
    通过JSTL添加的作用域的值:${pageScope.name} <br>
​
</body>
</html>

2.3.2.<c: if>

控制哪些内容能够输出到响应体

<%@ page import="com.sun.org.apache.xpath.internal.operations.Bool" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title> c:if </title>
</head>
    <c:set scope="page" var="age" value="20"/>
    <br>---------------使用java语言------------------<br>
    <%
        if(Integer.parseInt((String)pageContext.getAttribute("age")) >= 18){
    %>
    输入:欢迎光临!
    <%  }else{  %>
    输入:未满十八,禁止入内!
    <%  }  %>
    <br>---------------使用JSTL标签------------------<br>
    <c:if test="${age ge 18}">
        输入:欢迎光临!
    </c:if>
    <c:if test="${age lt 18}">
        输入:未满十八,禁止入内!
    </c:if>
​
</body>
</html>

2.3.3.<c: choose>

在jsp中进行多分支判断,决定哪个内容写入响应体

<%@ page import="com.sun.org.apache.xpath.internal.operations.Bool" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title> c:choose </title>
</head>
<body>
    <c:set scope="page" var="age" value="20"/>
    <br>---------------使用java语言------------------<br>
    <%
        if(Integer.parseInt((String)pageContext.getAttribute("age")) == 18){
    %>
    输出:您今年成年了
    <%  }else if(Integer.parseInt((String)pageContext.getAttribute("age")) > 18){  %>
    输出:您已经成年了
    <%  }else{  %>
    输出:您还是个孩子
    <%  }  %>
    <br>---------------使用JSTL标签------------------<br>
    <c:choose>
        <c:when test="${age eq 18}">
            输出:您今年成年了
        </c:when>
        <c:when test="${age gt 18}">
            输出:您已经成年了
        </c:when>
        <c:otherwise>
            输出:您还是个孩子
        </c:otherwise>
    </c:choose>
​
</body>
</html>

2.3.4.<c: forEach>

循环遍历

<c:forEach var="申明循环变量的名称" begin="初始化循环变量"
           end="循环变量可以接受的最大值" step="循环变量的递增或递减值">
    *** step属性可以不写,默认递增1
    *** 循环变量默认保存在pageContext中
</c:forEach>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.List" %>
<%@ page import="dao.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title> c:forEach </title>
</head>
<body>
    <%
        pageContext.setAttribute("students",new ArrayList(){{
            add(new Student("01","zhangsan",16));
            add(new Student("02","lisi",19));
            add(new Student("03","wangwu",15));
        }});
        pageContext.setAttribute("stuMap",new HashMap(){{
            put("s1",new Student("01","zhangsan",16));
            put("s2",new Student("02","zhangsan",19));
            put("s3",new Student("03","zhangsan",15));
        }});
    %>
    <br>---------------使用java语言----------------<br>
    <table>
        <tr><td>学号</td><td>姓名</td><td>年龄</td></tr>
        <%
            List<Student> students = (ArrayList<Student>)pageContext.getAttribute("students");
            for (int i = 0; i < students.size(); i++) {
        %>
        <tr>
            <td><%=students.get(i).getSid()%></td>
            <td><%=students.get(i).getName()%></td>
            <td><%=students.get(i).getAge()%></td>
        </tr>
        <%  }  %>
    </table>
    <br>---------------使用JSTL标签读取list----------------<br>
    <table>
        <tr><td>学号</td><td>姓名</td><td>年龄</td></tr>
        <c:forEach var="stu" items="${students}">
        <tr>
            <td>${stu.sid}</td>
            <td>${stu.name}</td>
            <td>${stu.age}</td>
        </tr>
        </c:forEach>
    </table>
    <br>---------------使用JSTL标签读取Map----------------<br>
    <table>
        <tr><td>key值</td><td>学号</td><td>姓名</td><td>年龄</td></tr>
        <c:forEach var="stu" items="${stuMap}">
            <tr>
                <td>${stu.key}</td>
                <td>${stu.value.sid}</td>
                <td>${stu.value.name}</td>
                <td>${stu.value.age}</td>
            </tr>
        </c:forEach>
    </table>
    <br>---------------使用JSTL标签读取指定for循环----------------<br>
    <c:forEach var="item" begin="1" end="10" step="1">
        <option> ${item} </option>
    </c:forEach>
</body>
</html>

其中使用的javaBean

public class Student {
    private String sid;
    private String name;
    private int age;
​
    public String getSid() {
        return sid;
    }
​
    public void setSid(String sid) {
        this.sid = sid;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    public Student(String sid, String name, int age) {
        this.sid = sid;
        this.name = name;
        this.age = age;
    }
}

三、Listener、Filter

3.1.概念

  • servlet

servlet是一种运行服务器端的java应用程序,他可以用来处理请求和响应。

  • filter

过滤器,不像servlet,它不能产生一个请求或者响应,它是一个中间者,能修改处理经过它的请求和响应,并不能直接给客户端响应。

  • listener

监听器,它用来监听容器内的一些变化,如session的创建,销毁等。当变化产生时,监听器就要完成一些工作。

3.2.生命周期

1、servlet: servlet的生命周期始于它被装入web服务器的内存时,并在web服务器终止或重新装入servlet时结束。servlet一旦被装入web服务器,一般不会从web服务器内存中删除,直至web服务器关闭或重新开始。

1.装入:启动服务器时加载Servlet的实例;

2.初始化:web服务器启动时或web服务器接收到请求时,或者两者之间的某个时刻启动。初始化工作由init()方法负责执行完成;

3.调用:从第一次到以后的多次访问,都是只调用doGet()或doPost()方法;

4.销毁:停止服务器时调用destory()方法,销毁实例。

2、filter: 一定要实现javax.servlet包的Filter接口的三个方法init()、doFilter()、destory(),空实现也行

1.启动服务器时加载过滤器的实例,并调用init()方法来初始化实例;

2.每一次请求时都只调用方法doFilter()进行处理;

3.停止服务器时调用destory()方法,销毁实例。

3、listener: 类似于servlet和filter

servlet2.4规范中提供了8个listener接口,可以将其分为三类,分别如下:

  • 第一类:与servletContext有关的listener接口。包括:ServletContextListener、ServletContextAttributeListener;

  • 第二类:与HttpSession有关的Listener接口。包括:HttpSessionListener、HttpSessionAttributeListener、HttpSessionBindingListener、HttpSessionActivationListener;

  • 第三类:与ServletRequest有关的Listener接口,包括:ServletRequestListener、ServletRequestAttributeListener

web.xml 的加载顺序是:context- param -> listener -> filter -> servlet

3.3.使用方式

listener:

import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
​
public class TestListener implements HttpSessionListener, ServletRequestListener, ServletRequestAttributeListener {
    //sessionListener  start!
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        logger.info("............TestListener sessionCreated().............");
    }
​
    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        logger.info("............TestListener sessionDestroyed().............");
    }
    //sessionListener end!
​
    //requestListener start!
    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        logger.info("............TestListener requestInitialized().............");
    }
​
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
        logger.info("............TestListener requestDestroyed().............");
    }
    //requestListener end!
​
    //attributeListener start!
    @Override
    public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        logger.info("............TestListener attributeAdded().............");
    }
​
    @Override
    public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        logger.info("............TestListener attributeRemoved().............");
    }
​
    @Override
    public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        logger.info("............TestListener attributeReplaced().............");
    }
    //attributeListener end!
​
​
​
}

Filter:

import javax.servlet.*;
import java.io.IOException;
​
public class TestFilter implements Filter {
​
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
​
    }
​
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤器被执行了");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }
​
    @Override
    public void destroy() {
​
    }
}

Servlet:

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
​
public class TestServlet extends HttpServlet {
​
    @Override
    public void init() throws ServletException {
        super.init();
    }
​
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }
​
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
        //...TestdoPost  doPost()  start...
        //操作Attribute
        req.setAttribute("a","a");
        req.setAttribute("a","b");
        req.getAttribute("a");
        req.removeAttribute("a");
​
        //操作session
        req.getSession().setAttribute("a","a");
        req.getSession().getAttribute("a");
        req.getSession().invalidate();
        //...TestdoPost  doPost()  end...
    }
​
    @Override
    public void destroy() {
        super.destroy();
    }
​
}

配置XML

<!-- 测试filter -->
<filter>
    <filter-name>TestFilter</filter-name>
    <filter-class>test.TestFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>TestFilter</filter-name>
    <url-pattern>*.do</url-pattern>
</filter-mapping>
<!-- 测试servlet -->
<servlet>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>test.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
<!-- 测试listener -->
<listener>
    <listener-class>test.TestListener</listener-class>
</listener>

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

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

相关文章

千万不要错过这9款能让你快速写作成长的宝藏软件…… #科技#学习方法#学习

很多小伙伴想要自己做自媒体&#xff0c;但是却不知道从何下手&#xff0c;今天我就和大家分享一波好用的一些自媒体工具。 1.红桃写作 这是一个微信公众号 面向专业写作领域的ai写作工具&#xff0c;写作助手包括&#xff0c;ai论文,ai开题报告、ai公文写作、ai商业计划书、…

每日五道java面试题之springboot篇(三)

目录&#xff1a; 第一题. Spring Boot 中的监视器是什么&#xff1f;第二题. 如何在 Spring Boot 中禁用 Actuator 端点安全性&#xff1f;第三题. 我们如何监视所有 Spring Boot 微服务&#xff1f;第四题. 什么是 WebSockets&#xff1f;第五题. 什么是 Spring Data ? 第一…

Qt教程 — 3.6 深入了解Qt 控件:Display Widgets部件(2)

目录 1 Display Widgets简介 2 如何使用Display Widgets部件 2.1 QTextBrowser组件-简单的文本浏览器 ​2.2 QGraphicsView组件-简单的图像浏览器 Display Widgets将分为两篇文章介绍 文章1&#xff08;Qt教程 — 3.5 深入了解Qt 控件&#xff1a;Display Widgets部件-CSDN…

使用POI以OLE对象的形式向excel中插入附件(pdf为例)

前言&#xff1a; 最近在使用easyExcel操作excel文件时&#xff0c;一直想找到一个方法可以往excel中填充附件&#xff0c;但是目前只发现POI可以插入附件&#xff0c;于是将方法记录如下&#xff1a; 实现&#xff1a; 这个方法主要是使用 Apache POI 的 HSSFWorkbook 类来…

带有GUI界面的电机故障诊断(MSCNN-BILSTM-ATTENTION模型,TensorFlow框架,有中文注释,带有六种结果可视化)

本次创作最主要是在MSCNN-BILSTM-ATTENTION模型&#xff08;可轻松替换为其它模型&#xff09;基础上&#xff0c;搭建GUI测试界面&#xff0c;方便对你想要测试的数据的进行测试&#xff0c;同时进行了全面的结果可视化&#xff1a;1.训练集和测试集的准确率曲线&#xff0c;2…

第28章 ansible的使用

第28章 ansible的使用 本章主要介绍在 RHEL8 中如何安装 ansible 及 ansible的基本使用。 ◆ ansible 是如何工作的 ◆ 在RHEL8 中安装ansible ◆ 编写 ansible.cfg 和清单文件 ◆ ansible 的基本用法 文章目录 第28章 ansible的使用28.1 安装ansible28.2 编写ansible.cfg和清…

v3-admin-vite 整合pont

需求 目前后端的Admin模板使用的是v3-admin-vite&#xff0c;需要整合pont接口&#xff0c;方便前后端统一一体化开发 安装PONT 按照官方的文档&#xff0c;将pont engine安装好&#xff0c;然后在项目根目录执行pont start。注意生成代码路径要修改一下&#xff0c;因为v3-a…

AI新工具(20240322) 免费试用Gemini Pro 1.5;先进的AI软件工程师Devika;人形机器人Apptronik给你打果汁

✨ 1: Gemini Pro 1.5 免费试用Gemini Pro 1.5 Gemini 1.5 Pro是Gemini系列模型的最新版本&#xff0c;是一种计算高效的多模态混合专家&#xff08;MoE&#xff09;模型。它能够从数百万个上下文Token中提取和推理细粒度信息&#xff0c;包括多个长文档和数小时的视频、音频…

Excel数字乱码怎么回事 Excel数字乱码怎么调回来

在日常工作中&#xff0c;Excel是我们最常使用的数据处理软件之一&#xff0c;它强大的功能使得数据处理变得既简单又高效。然而&#xff0c;用户在使用Excel时偶尔会遇到数字显示为乱码的问题&#xff0c;这不仅影响了数据的阅读&#xff0c;也大大降低了工作效率。那么&#…

Docker-Image

Docker Docker 镜像是什么为什么需要镜像镜像命令总览docker imagesdocker tagdocker pulldocker pushdocker rmidocker savedocker loaddocker image inspectdocker historydocker importdocker image prunedocker build Docker 镜像是什么 Docker image 本质上是一个 read-on…

一文全面了解 wxWidgets 程序国际化(i18n)处理

尽管应用程序的国际化&#xff08;简称i18n&#xff09;远不止是将文本消息翻译成另一种语言的消息——日期、时间和货币格式也需要更改&#xff0c;一些语言是从左到右书写&#xff0c;而另一些是从右到左书写&#xff0c;字符编码可能不同&#xff0c;以及许多其他可能需要更…

一文带你弄懂JVM与JAVA体系结构

文章目录 1.JVM 与 Java 体系结构1.1. 前言1.2. 一些参考书目1.3. Java 及 JVM 简介1.4. Java 发展的重大事件1.5. 虚拟机与 Java 虚拟机1.6. JVM 的整体结构1.7. Java 代码执行流程1.8. JVM 的架构模型1.9. JVM 的生命周期 1.JVM 与 Java 体系结构 1.1. 前言 作为 Java 工程…

NLP 笔记:Latent Dirichlet Allocation (介绍篇)

1 问题介绍 假设我们有一堆新闻&#xff0c;每个新闻都有≥1个主题 我们现在只知道新闻的内容&#xff0c;我们希望一个算法&#xff0c;帮我们把这些新闻分类成主题人类可以根据每个每个文章里面的单词判断主题&#xff0c;那计算机怎么做呢&#xff1f; ——>LDA(Latent D…

大小端是什么?怎么判断?(百度笔试题)

目录 一、前言二、什么是大小端&#xff1f;三、为什么有大小端之分呢&#xff1f;四、判断机器是大端还是小端--百度笔试题 一、前言 先看一段代码&#xff1a; #include<stdio.h> int main() {int n 0x11223344;return 0; }二、什么是大小端&#xff1f; 其实超过⼀…

【JavaSE】抽象类和接口

目录 前言 1. 抽象类 1.1 认识抽象类 1.2 抽象类的特征 1.3 抽象类的作用 2. 接口 2.1 接口的概念 2.2 接口的语法 2.3 接口的使用 2.4 接口的特性 2.5 接口的好处 2.6 接口之间的继承 结语 前言 今天我们来讲Java中的抽象类和接口&#xff0c;它们在面向对象中发…

前端应用开发实验:条件渲染和循环渲染

目录 实验目的相关知识点实验内容图片的隐藏和显示代码实现效果 电影票房排序代码实现效果 代办事项记录代码实现效果 实验目的 (1)熟练掌握v-on 指令的用法&#xff0c;学会使用v-on 指令监听DOM元素的事件&#xff0c;并通过该事件触发调用事件处理程序。 (2)掌握v-on指令修…

大学理科用什么软件搜题?推荐5个搜题软件和学习工具 #其他#知识分享#经验分享

大学生的学习生活离不开一些实用的工具&#xff0c;它们能够帮助我们更高效地学习和管理时间。 1.千鸟搜题 这是一个公众号 这是一个老公众号了&#xff0c;我身边的很多朋友都在用&#xff0c;支持超新星、学习强国、知到、智慧树和各类专业网课题目。 下方附上一些测试的试…

Axure案例分享—折叠面板(附下载地址)

今天和大家分享的Axure案例是折叠面板 折叠面板是移动端APP中常见的组件之一&#xff0c;有时候也称之为手风琴。咱们先看下Axure画出的折叠面板原型效果&#xff0c;然后再对该组件进行详细讲解。 一、功能介绍 折叠或展开多个面板内容&#xff0c;默认为展开一项内容&…

【JS】闭包的漏洞

下面这段代码可以实现&#xff1a;通过立即执行函数o返回对象中的get方法&#xff0c;通过参数key得到fn函数内部对象obj中的值。 var fn function () {var obj {a: 1,b: 2}return {get: function (key) {return obj[key]}} }() console.log(fn.get(b)); // 2这是一个典型的…

小红书扫码登录分析与python实现

文章目录 1. 写在前面2. 接口分析3. 代码实现 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…