【JavaWeb】Servlet与过滤器

news/2024/5/11 13:46:29/文章来源:https://blog.csdn.net/weixin_37833693/article/details/137588927

目录

  • Servlet
    • Servlet做了什么
    • JSP与Servlet的关系
    • 主要Servlet API介绍
      • 如何创建Servlet
      • Servlet中主要方法
      • ServletRequest
      • ServletResponse
      • ServletConfig
    • Servlet生命周期
      • Servlet创建
      • Servlet部署与运行
    • ServletConfig类
      • ServletConfig类的三大作用
    • ServletContext类
      • ServletContext类的四个作用
  • HTTP协议
    • GET请求和POST请求
      • GET
        • 格式
      • POST
        • 格式
      • 常用的请求头的说明
      • GET请求和POST请求的种类(即哪些是)
        • GET请求有:
      • 响应的HTTP协议格式
    • 常用的响应码
      • MIME类型说明
        • 常见的MIME类型
    • HttpServletRequest类
      • 常用方法
    • HttpServletResponse类
    • @WebServlet注解
      • 属性列表
  • 过滤器
    • 原理
    • 代码
    • 配置
    • 生命周期
      • destroy()
      • init()
      • doFilter()
    • 备注
    • \<filter-mapping>
      • \<url-pattern>
    • Filter里面的<dispatcher>标签
    • 过滤器链
  • 总结:执行原理
    • Servlet的执行原理:
    • Filter的执行原理:

Servlet

  • Server+Applet,是一种服务器端的Java应用程序
  • 只有当一个服务器端的程序使用了Servlet API的时候,这个服务端的程序才能称之为Servlet
  • Servlet是JavaWeb三大组件之一,三大组件是:Servlet程序、Filter过滤器、Listener监听器
  • Servlet是运行在服务器上的一个java小程序,它可以接受客户端发送过来的请求,并响应数据给客户端

Servlet做了什么

  • 本身不做任何业务处理
  • 只是接收请求并决定调用哪个JavaBean去处理请求
  • 确定用哪个页面来显示处理返回的数据

JSP与Servlet的关系

在这里插入图片描述Servlet是运行在服务器端的Java应用程序

主要Servlet API介绍

  • javax.servlet.Servlet接口
    所有Java Servlet的基础接口类,规定了必须由Servlet具体类实现的方法集
  • javax.servlet.GenericServlet类
    是Servlet的通用版本,是一种与协议无关的Servlet
  • javax.servlet.http.HttpServlet类
    在GenericServlet基础上扩展的基于Http协议的Servlet

如何创建Servlet

  • 实现Servlet接口
  • 继承GenericServlet类
  • 继承HttpServlet类

Servlet中主要方法

  • init():Servlet的初始化方法,仅仅会执行一次
  • service():处理请求和生成响应
  • destroy():在服务器停止并且程序中的Servlet对象不再使用的时候调用,只执行一次

ServletRequest

  • 封装客户的请求信息
  • 作用相当于JSP内置对象request

ServletResponse

  • 创建响应信息,将处理结果返回给客户端
  • 作用相当于JSP内置对象response

ServletConfig

  • 包含了Servlet的初始化参数信息

Servlet生命周期

  1. 加载和实例化
  2. 初始化
  3. 处理请求
  4. 销毁
生命周期谁来做何时做
实例化Servlet 容器当Servlet容器启动或者容器检测到客户端请求时
初始化Servlet 容器实例化后,容器调用Servlet的init()初始化对象
处理请求Servlet 容器得到客户端请求并做出处理时
销毁Servlet 容器当程序中的Servlet对象不再使用的时候,或者Web服务器停止运行的时候

在这里插入图片描述

Servlet创建

package com.zjl.servlet;import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @author: zjl* @datetime: 2024/4/10* @desc:*/
public class HelloServlet extends HttpServlet {public HelloServlet() {System.out.println("生命周期之——————创建实例");}@Overridepublic void init(ServletConfig config) throws ServletException {String mycharset = config.getInitParameter("mycharset");System.out.println("初始化时加载配置中的参数为:" + mycharset);System.out.println("生命周期之——————初始化");}//接收Get请求@Overridepublic void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("生命周期之——————处理请求");req.setCharacterEncoding("UTF-8");//设置请求字符集编码resp.setCharacterEncoding("UTF-8");//设置响应字符集编码req.setAttribute("key","value");//将数据保存在request域,以键值对方式req.getSession().setAttribute("sessionKey","sessionValue");//根据request获取所在的session会话,并向会话保存一个数据req.getRequestDispatcher("welcome.jsp").forward(req,resp);//转发跳转页面}//接收POST请求@Overridepublic void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("生命周期之——————处理请求");}/*@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("生命周期之——————处理请求");}*/@Overridepublic void destroy() {System.out.println("生命周期之——————销毁");}
}

Servlet部署与运行

  • 修改web.xml(部署描述文件)
    • 添加:把Servlet内部名映射到一个Servlet类名
    • 添加:把用户访问的URL映射到Servlet的内部名
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID" version="2.5"><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><servlet><servlet-name>helloServlet</servlet-name><servlet-class>com.zjl.servlet.HelloServlet</servlet-class><init-param><param-name>mycharset</param-name><param-value>utf-t</param-value></init-param></servlet><servlet-mapping><servlet-name>helloServlet</servlet-name><url-pattern>/hello.do</url-pattern></servlet-mapping>
</web-app>
  • 通过URL访问Servlet
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

ServletConfig类

  • ServletConfig类从类名上来看,就知道是Servlet程序的配置信息类
  • Servlet程序和ServletConfig对象都是由Tomcat负责创建,我们负责调用
  • Servlet程序默认是第一次访问的时候创建,ServletCongfig是每个Servlet程序创建时,就创建一个对应的ServletConfig对象

ServletConfig类的三大作用

  1. 可以获取Servlet程序的别名servlet-name的值
  2. 获取初始化参数init-param
  3. 获取ServletContext对象
	@Overridepublic void init(ServletConfig config) throws ServletException {String mycharset = config.getInitParameter("mycharset");System.out.println("初始化时加载配置中的参数为:" + mycharset);System.out.println("生命周期之——————初始化");config.getServletContext();config.getServletName();}

ServletContext类

  1. ServletContext是一个接口,它表示Servlet上下文对象
  2. 一个web工程,只有一个ServletContext对象实例
  3. ServletContext对象是一个域对象
  4. ServletContext是在web工程部署启动的时候创建,在web工程停止的时候销毁

域对象:是可以像Map一样存取数据的对象
这里的域指的是存取数据的操作范围是整个web工程

存数据取数据删除数据
Mapput()get()
域对象setAttribute()getAttribute()

ServletContext类的四个作用

  1. 获取web.xml中配置的上下文参数context-param
    属于整个工程,也就是说所有的Servlet都可以访问到
<!--context-param是上下文参数(它属于整个web工程)-->
<context-param><param-name>username</param-name><param-value>context</param-value>
</context-param>
<!--context-param是上下文参数(它属于整个web工程)-->
<context-param><param-name>password</param-name><param-value>root</param-value>
</context-param>
  1. 获取当前的工程路径,格式:/工程路径
//2、获取当前的工程路径,格式: /工程路径
System.out.println("当前工程路径:" + servletContext.getContextPath());
  1. 获取工程部署后在服务器硬盘上的绝对路径
	@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取工程部署后在服务器硬盘上的绝对路径/***      / 斜杠被服务器解析地址为http://ip:port/工程名/  映射到IDEA代码的web目录*/System.out.println("工程部署的路径是:" + servletContext.getRealPath("/"));System.out.println("工程下imgs目录的绝对路径是:" + servletContext.getRealPath("/imgs"));System.out.println("工程下imgs目录下1.jpg的绝对路径是:" + servletContext.getRealPath("/imgs/1.jpg"));}
  1. 像Map一样存取数据
  • 当我们存储之前,还未存储的时候,此时去获取数据,是获取不到即返回null
  • 一个web工程,只有一个ServletContext对象实例,因此地址一致
	@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取ServletContext对象ServletContext servletContext = getServletContext();// System.out.println(servletContext);System.out.println("保存之前Context1 中获取域数据key1的值是:" + servletContext.getAttribute("key1"));servletContext.setAttribute("key1", "value1");System.out.println("Context1 中获取域数据key1的值是:" + servletContext.getAttribute("key1"));}

HTTP协议

  • 协议是指双方、或多方,相互约定好的,大家都需要遵守的规则,叫协议
  • 所谓HTTP协议,就是指:客户端和服务端之间通信时,发送的数据,需要遵守的规则,叫HTTP协议
  • HTTP协议中的数据又叫报文
  • 客户端给服务器发送数据叫请求
  • 服务器给客户端回传数据叫响应

GET请求和POST请求

GET

格式
  1. 请求行
    请求的方式
    请求的资源路径[+?+请求参数]
    请求的协议的版本号
  2. 请求头
    key : value 组成,不同的键值对,表示不同的含义
    在这里插入图片描述在这里插入图片描述

POST

格式
  1. 请求行
    请求的方式
    请求的资源路径[+?+请求参数]
    请求的协议的版本号
  2. 请求头
    key : value 组成,不同的键值对,表示不同的含义
  3. 请求体 ==> 就是发送给服务器的数据
    在这里插入图片描述在这里插入图片描述

常用的请求头的说明

  • Accept:表示客户端可以接受的数据类型
  • Accpet-Language:表示客户端可以接受的语言类型
  • User-Agent:表示客户端浏览器的信号
  • Host:表示请求时的服务器ip和端口号

GET请求和POST请求的种类(即哪些是)

GET请求有:
  1. form 标签 method=“get”
  2. a 标签
  3. link 标签引入 css 文件
  4. Script 标签引入 js 文件
  5. img 标签引入图片
  6. iframe 引入 html 页面
  7. 在浏览器地址栏中输入地址后敲回车

POST请求有:

  • form 标签 method=“post”

响应的HTTP协议格式

  1. 响应行
    响应的协议和版本号
    响应状态码
    响应状态描述符

  2. 响应头
    key : value 不同的响应头,有其不同的含义

  3. 响应体 ==> 就是回传给客户端的数据
    在这里插入图片描述在这里插入图片描述

常用的响应码

响应码说明
200表示请求成功
302表示请求重定向
404表示请求服务器以及收到了,但是你要的数据不存在(请求地址错误)
500表示服务器已经收到请求,但是服务器内部错误(代码错误)

MIME类型说明

  • MIME是HTTP协议中的数据类型
  • MIME 的英文全称是"Multipurpose Internet Mail Extensions" 多功能 Internet 邮件扩充服务。MIME 类型的格式是“大类型/小类型”,并与某一种文件的扩展名相对应
常见的MIME类型
文件MIME类型
超文本标记语言文本.html, .htm text/html
普通文本 .txt text/plain
RTF文本.rtf application/rtf
GIF图形.gif image/gif
JDEG图形.jpeg, .jpg image/jpeg
au声音文件.au audio/basic
MIDI音乐文件.mid, .midi audio.midi, audio/x-midi
RealAudio音乐文件.ra, .ram audio/x-pn-realaudio
MPEG文件.mpg, .mpeg video/mpeg
AVI文件.avi video/x-msvideo
GZIP文件.gz application/x-gzip
TAR文件.tar application/x-tar

HttpServletRequest类

  • 对应JSP的内置对象request
  • 每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中,然后传递到service方法或doGet方法或doPost方法中给我们使用。而我们可以通过HttpServletRequest对象,获取到所有请求的信息
  • 普通的访问无法访问到WEB-INF目录下的内容,但是请求转发可以访问到
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/WEB-INF/form.html");
  • 无法访问工程以外的资源,因为默认放本工程目录下
RequestDispatcher requestDispatcher = req.getRequestDispatcher("http://www.baidu.com");//会报错

常用方法

方法名作用
getRequestURI()获取请求的资源路径
getRequestURL()获取请求的统一资源定位符(绝对路径)
getRemoteHost()获取客户端的ip地址
getHeader()获取请求头
getParameter()获取请求的参数
getParameterValues()获取请求的参数(多个值的时候使用)[如复选框]
getMethod()获取请求的方式GET或POST
setAttribute(key, value)设置域数据
getAttribute(key)获取域数据
getRequestDispatcher()获取请求转发对象

HttpServletResponse类

  • 对应JSP内置对象response
  • HttpServletResponse类和HttpServletRequest类一样,每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用。HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息
  • 我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象来进行设置
  • 不共享Request域中数据
  • 不能访问WEB-INF下的资源。是因为WEB-INF是受保护的,而浏览器是不能够访问受保护的,当重新第二次到新地址,也是浏览器发送请求,因此不能访问到受保护的WEB-INF目录
  • 可以访问工程下的资源
类别表示作用
字节流getOutputStream()常用于下载(传递二进制数据)
字符流getWriter()常用于回传字符串(常用)

注意:两个流同时只能使用一个
使用了字节流,就不能再使用字符流了,反之亦然,否则就会报错

@WebServlet注解

  • 在Servlet中,设置了@WebServlet注解,当请求该Servlet时,服务器就会自动读取当中的信息

  • 如果注解@WebServlet(“/category”),则表示该Servlet默认的请求路径为…/category,这里省略了urlPatterns属性名,完整的写法应该是:@WebServlet(urlPatterns = “/category”)

  • 如果在@WebServlet中需要设置多个属性,必须给属性值加上属性名称,中间用逗号隔开,否则会报错.

  • 若没有设置@WebServlet的name属性,默认值会是Servlet的类完整名称.

  • 在servlet3.0以后,web.xml中对Servlet配置,同样可以在@WebServlet注解中配置.

属性列表

属性名类型描述
nameString指定Servlet 的 name 属性,等价于 。如果没有显式指定,则该 Servlet 的取值即为类的全限定名。
valueString[]该属性等价于 urlPatterns 属性。两个属性不能同时使用。
urlPatternsString[]指定一组 Servlet 的 URL 匹配模式。等价于标签。
loadOnStartupint指定 Servlet 的加载顺序,等价于 标签。
initParamsWebInitParam[]指定一组 Servlet 初始化参数,等价于标签。
asyncSupportedboolean声明 Servlet 是否支持异步操作模式,等价于 标签。
descriptionString该 Servlet 的描述信息,等价于 标签。
displayNameString该 Servlet 的显示名,通常配合工具使用,等价于 标签。

过滤器

拦截所有访问web资源的请求或者响应(servlet、Jsp页面、HTML页面),从而实现我们自己的业务逻辑,这些逻辑可以是实现访问权限的控制、过滤敏感词、压缩响应等功能。

  • 是向Web应用程序的请求和响应添加功能的Web服务组件
  • 过滤器可以统一地集中处理请求和响应
  • 使用过滤器技术实现对请求数据的过滤

原理

过滤器是"链接"在容器的处理过程中的,它会在servlet处理器之前访问进入的请求,并且在响应信息返回客服端之前访问这些响应信息。这样就可以动态的修改请求和响应中的内容。
在这里插入图片描述在这里插入图片描述

代码

package com.zjl.filter;import javax.servlet.*;
import java.io.IOException;/*** @author: zjl* @datetime: 2024/4/10* @desc:*/
public class MyCharsetFilter implements Filter {private String encode;public MyCharsetFilter(){System.out.println("生命周期之——创建");}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {encode = filterConfig.getInitParameter("encode");System.out.println("生命周期之——初始化");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("生命周期之——执行过滤");servletResponse.setCharacterEncoding(encode);servletRequest.setCharacterEncoding(encode);filterChain.doFilter(servletRequest,servletResponse);//执行过滤}@Overridepublic void destroy() {System.out.println("生命周期之——销毁");}
}

配置

<filter><filter-name>mycharset</filter-name><filter-class>com.zjl.filter.MyCharsetFilter</filter-class><init-param><param-name>encode</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>mycharset</filter-name><url-pattern>/*</url-pattern></filter-mapping>

生命周期

  • 实例化
  • 初始化:init()
  • 过滤:doFilter()
  • 销毁:destroy()

destroy()

  • 当web服务器调用该方法时,表示过滤器将被销毁。

init()

  • 当web服务器调用该方法时,表示过滤器将被注册到服务中

doFilter()

  • 当服务器调用Filter中的doFilter()方法,它会将每一个请求或者响应传递给下一个资源

备注

  • Filter是在应用启动是被创建和初始化的。
  • Filter是单例多线程的(创建和初始化只会被执行一次)
  • doFilter()方法无论是那一个线程访问,只要由该Filter进行过滤,那么就会执行该Filter的doFilter()方法,并且是每过滤一次就会执行一次doFilter()。
  • Filter中destroy方法是在应用被停止时调用的,它意味着销毁这个Filter。
  • FilterConfig指的是Filter在web.xml中的注册信息 ,它将注册信息进行封装,然后通过形参的方式传给初始化方法

<filter-mapping>

  • <filter-mapping>标签表示拦截匹配,也就是要拦截那些请求。
  • <filter-name>:要拦截的过滤器名称
  • <url-pattern>:拦截那些路径

<url-pattern>

  • 注意Filter中在写拦截所有路径的时候只能写成/*,而不能写成/,因为写成/它就不走拦截器中的doFilter方法了。

  • 在Servlet中/*即会拦截动态资源又会拦截静态资源,而/不会拦截动态资源

Filter里面的标签

  • dispatcher表示分发器,表示过滤器所拦截的资源被servlet容器调用的方式,可以是REQUEST,INCLUDE,FORWARD,ERROR中的任何一个,默认是REQUEST。
  • 用户可以设置多个<dispatcher>子元素用来指定过滤器对资源的多种调用方式进行拦截。
属性作用
FORWARD表示当前过滤器只会拦截由一个Servlet通过RequestDispatcher的forward()完成跳转
INCLUDE表示当前过滤器只会拦截由一个Servlet通过RequestDispatcher的include()完成跳转
REQUEST表示当前过滤器会拦截普通请求,但对于forward()与include()的跳转不进行拦截,REQUEST是默认的。
ERROR表示当跳转到指定的错误处理页面时,这个跳转请求会被当前过滤器拦截

过滤器链

多个过滤器会形成过滤器链
在这里插入图片描述

总结:执行原理

Servlet的执行原理:

  • 在Servlet中有两个Map,这两个Map的key均为Servlet注册时的值,但value是不同的。第一个Map的value是Servlet实例对象的引用,第二个Map的value为的值,即Servlet类的全限定类名。

  • 当对Servlet的请求到达Servlet容器时,会先对请求进行解析,使用该解析出的URL,作为比较对象,从第一个Map中查找是否有匹配的key,若不存在匹配的key,那么读取其value,即Servlet对象的引用,执行该Servlet的service()方法。

  • 若不存在匹配的key ,那么再从第二个Map中查找是否有匹配的key。若存在,这读取其value,即读取其value,即要访问的Servlet的全限定类名。然后使用反射机制创建该Servlet实例,并将该实例写入到第一个Map中,然后在执行该Servlet的service()方法。

  • 若第二个Map中也没有找到匹配的key,那么就跳转到错误处理页面404。

Filter的执行原理:

  • 一个数组与一个Map :

    • 一个Map:Map的key为的值,value为Filter实例对象的引用
    • 一个数组:存在着与请求相匹配的所有Filter
  • 当对某资源的请求到达Web容器时,会先对请求进行解析,使用解析出的URI作为比较对象,从Map中查找是否存在相匹配的key。若存在,那么读取其value,即Filter对象的引用,将该应用存入到数组中。然后继续向后查找,直到将Map查找完毕。这样在数组中就会存在按照查找顺序排好序的Filter引用。

  • 数组初始化完毕后,开始按照数组元素顺序进行执行。所有数组中的Filter全部执行完毕后,再跳转到请求的目标资源。

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

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

相关文章

图像生成:Pytorch实现一个简单的对抗生成网络模型

图像生成&#xff1a;Pytorch实现一个简单的对抗生成网络模型 前言相关介绍具体步骤准备并读取数据集定义生成器定义判别器定义损失函数定义优化器开始训练完整代码 训练生成的图片 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&…

【vim 学习系列文章 20 -- a:mode 的值有哪些?】

请阅读【嵌入式开发学习必备专栏 之 Vim】 文章目录 a:mode 的值有哪些?举例Vim 底部状态栏设置 a:mode 的值有哪些? 在 Vim 脚本语言中&#xff0c;a:mode 常常用于函数内部&#xff0c;以获取该函数被调用时 Vim 正处于的模式。它主常用于那些可以从不同模式下被调用的函数…

websocket分析和前后端如何接入websocket

1、前言 websocket一般用途为消息提醒&#xff0c;股票行情数据推送等等&#xff0c;有很多用途。 我们这里简单举例理解websocket和如何前后端接入websocket&#xff1b; 使用网络抓包分析软件。主要是截取网络封包&#xff0c;并尽可能显示出最为详细的网络封包资料。 2、…

怎么快速围绕“人、货、场”做零售数据分析?

做零售数据分析多了&#xff0c;不难发现零售数据分析的关键就是“人、货、场”&#xff0c;那么怎么又快又灵活地分析这三个关键点&#xff1f;不妨参考下奥威BI零售数据分析方案。 奥威BI零售数据分析方案是一套吸取大量项目经验&#xff0c;结合零售企业数据分析共性需求打…

MyBatis 等类似的 XML 映射文件中,当传入的参数为空字符串时,<if> 标签可能会导致 SQL 语句中的条件判断出现意外结果。

问题 传入的参数为空字符串&#xff0c;但还是根据参数查询了。 原因 在 XML 中使用 标签进行条件判断时&#xff0c;需要明确理解其行为。在 MyBatis 等类似的 XML 映射文件中&#xff0c; 标签通常用于动态拼接 SQL 语句的条件部分。当传入的参数 riskLevel 为空字符串时…

acwing总结-线性质数筛

质数筛 题目链接:质数筛线性筛法 ac代码&#xff1a; #include<iostream> #include<algorithm> //https://www.bilibili.com/video/BV1LR4y1Z7pm/?spm_id_from333.337.search-card.all.click&vd_source436ccbb3a8f50110aa75654f38e35672 //链接到b站视频 us…

如何在 YouTube、Medium、Twitter 和 Linkedin 上使用 ChatGPT 赚钱

人工智能SEO&#xff1a;未来内容优化的革命 介绍 在当今的数字时代&#xff0c;利用 ChatGPT 等人工智能工具已经成为在线内容创建和货币化领域的游戏规则改变者。 本指南探讨了如何在 YouTube、Medium、Twitter 和 Linkedin 等各种平台上有效使用 ChatGPT&#xff0c;不仅可以…

el-table动态合并列

需要合并列&#xff0c;并且不确定需要合并多少列的&#xff0c;可以参照如下代码 首先需要再el-table上传入span-method方法 arraySpan({ row, column, rowIndex, columnIndex }){if (row.groupName 汇总 && columnIndex 0) {return [0,0]} else if (row.groupName…

机器学习-08-关联规则和协同过滤

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中关联规则和协同过滤。 参考 机器学习&#xff08;三&#xff09;&#xff1a;Apriori算法&#xff08;算法精讲&#xff09; Apriori 算法 理论 重点 MovieLens:一个常用的电影推荐系统领域的数据集 2…

01、ArcGIS For JavaScript 4.29对3DTiles数据的支持

综述 Cesium从1.99版本开始支持I3S服务的加载&#xff0c;到目前位置&#xff0c;已经支持I3S的倾斜模型、3D Object模型以及属性查询的支持。Cesium1.115又对I3S标准的Building数据实现了加载支持。而ArcGIS之前一直没有跨越对3DTiles数据的支持&#xff0c;所以在一些开发过…

数字社交的新典范:解析Facebook的成功密码

在当今数字化时代&#xff0c;社交媒体已经成为人们日常生活的重要组成部分&#xff0c;而Facebook作为最知名的社交媒体平台之一&#xff0c;其成功之处备受瞩目。本文将深入解析Facebook的成功密码&#xff0c;探讨其在数字社交领域的新典范。 1. 用户体验的优化 Facebook注…

Docker容器嵌入式开发:在Ubuntu上配置Postman和flatpak

在 Ubuntu 上配置 Postman 可以通过 Snap 命令完成&#xff0c;以下是所有命令的总结&#xff1a; sudo snap install postmansudo snap install flatpak在 Ubuntu 上配置 Postman 和 Flatpak 非常简单。以下是一些简单的步骤&#xff1a; 配置 Flatpak 安装 Flatpak&#x…

【力扣】104. 二叉树的最大深度、111. 二叉树的最小深度

104. 二叉树的最大深度 题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输…

【linux】yum 和 vim

yum 和 vim 1. Linux 软件包管理器 yum1.1 什么是软件包1.2 查看软件包1.3 如何安装软件1.4 如何卸载软件1.5 关于 rzsz 2. Linux编辑器-vim使用2.1 vim的基本概念2.2 vim的基本操作2.3 vim命令模式命令集2.4 vim底行模式命令集2.5 vim操作总结补充&#xff1a;vim下批量化注释…

IOS虚拟键盘弹出后,弹窗的按钮点击不起作用,不会触发click事件

背景 讨论区项目的回复框&#xff0c;使用的是Popup和TextArea做&#xff0c;布局如下图&#xff0c;希望键盘弹出时候&#xff0c;回复框可以紧贴键盘&#xff0c;这点实现起来比较简单&#xff0c;监听resize事件&#xff0c;动态修改popup的这题内容的top值即可&#xff0c…

二叉数应用——最优二叉树(Huffman树)、贪心算法—— Huffman编码

1、外部带权外部路径长度、Huffman树 从图中可以看出&#xff0c;深度越浅的叶子结点权重越大&#xff0c;深度越深的叶子结点权重越小的话&#xff0c;得出的带权外部路径长度越小。 Huffman树就是使得外部带权路径最小的二叉树 2、如何构造Huffman树 &#xff08;1&#xf…

SpringBoot中的Redis的简单使用

在Spring Boot项目中使用Redis作为缓存、会话存储或分布式锁等组件&#xff0c;可以简化开发流程并充分利用Redis的高性能特性。以下是使用Spring Boot整合Redis的详细步骤&#xff1a; 1. 环境准备 确保开发环境中已安装&#xff1a; Java&#xff1a;用于编写和运行Spring…

HTML5学习记录

简介 超文本标记语言&#xff08;HyperText Markup Language&#xff0c;简称HTML&#xff09;&#xff0c;是一种用于创建网页的标准标记语言。 编辑器 下载传送门https://code.visualstudio.com/ 下载编辑器插件 标题 标题通过 <h1> - <h6> 标签进行定义。 …

xss.pwnfunction-Ok,Boomer

调用0k会直接调用tostring方法获得href里的内容而setTimeout第一个参数恰巧可以接收字符串 但是href必须是协议&#xff1a;主机名 这里tel是dompurify框架的白名单 <a idok hreftel:alert(1337)>

xss跨站脚本攻击笔记

1 XSS跨站脚本攻击 1.1 xss跨站脚本攻击介绍 跨站脚本攻击英文全称为(Cross site Script)缩写为CSS&#xff0c;但是为了和层叠样式表(CascadingStyle Sheet)CSS区分开来&#xff0c;所以在安全领域跨站脚本攻击叫做XSS 1.2 xss跨战脚本攻击分类 第一种类型:反射型XSS 反射…