当前位置: 首页 > news >正文

Servlet执行流程生命周期方法介绍体系结构、Request和Response的功能详解


在这里插入图片描述

🐌个人主页: 🐌 叶落闲庭
💨我的专栏:💨
c语言
数据结构
javaEE
操作系统
Redis

石可破也,而不可夺坚;丹可磨也,而不可夺赤。


Servlet

  • 一、 Servlet执行流程
  • 二、Servlet生命周期
  • 三、 Servlet方法介绍
  • 四、 Servlet体系结构
  • 五、 urlPattern配置
  • 六、 XML配置Servlet(老版本)
  • 七、Request
    • 7.1 Request继承体系
    • 7.2 Request获取请求数据
    • 7.3 Request通用方式获取请求参数
    • 7.4 请求参数中文乱码处理
      • 7.4.1 POST 解决方案
      • 7.4.1 GET 解决方案
    • 7.5 Request请求转发
  • 八、Response
    • 8.1 设置相应数据功能
    • 8.2 完成重定向
    • 8.3资源路径问题
    • 8.4 Response响应字符数据
    • 8.5 Response响应字节数据

一、 Servlet执行流程

  • Servlet由Tomcat服务器创建,,web项目发布到Tomcat服务器后,Tomcat服务器会自动调用web项目中的service()方法,但是在调用service()方法之前,会先创建一个Servlet对象,这个Servlet对象也是由Tomcat服务器创建的,Servlet执行流程就是由浏览器向Servlet发送请求,根据url路径找到要执行的方法,也就是service()方法,这个service()方法也是Tomcat调用的,这个service()方法一被调用,就会返回对应的响应给客户端浏览器。

在这里插入图片描述


二、Servlet生命周期

  • 对象的生命周期指一个对象从被创建到被销毁的整个过程
  • Servleti运行在Servlet:容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:
    • 1.加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象
    • 2.初始化:在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作,该方法只调用一次
    • 3.请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理。
    • 4.服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放,在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收
@WebServlet("/demo")
public class ServletDemo implements Servlet {/*** 初始化方法* 1.调用时机:默认情况下,Servlet被第一次访问时调用* 2.调用次数:1次* @param servletConfig* @throws ServletException*/@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("init...");}@Overridepublic ServletConfig getServletConfig() {return null;}/*** 提供服务* 1.调用时机:每次Servlet被访问时调用* 2.调用次数:多次* @param servletRequest* @param servletResponse* @throws ServletException* @throws IOException*/@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("hello service~");}@Overridepublic String getServletInfo() {return null;}/*** 销毁方法* 1.调用时机:内存释放或服务器关闭时* 2.调用次数:1次*/@Overridepublic void destroy() {System.out.println("destroy...");}
}

在这里插入图片描述


三、 Servlet方法介绍

  • 初始化方法,在Servleti被创建时执行,只执行一次
void init(ServletConfig servletConfig)
  • 提供服务方法,每次Servleti被访问,都会调用该方法
void service(ServletRequest servletRequest, ServletResponse servletResponse)
  • 销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet
void destroy()
  • 获取ServletConfig对象
ServletConfig getServletConfig()
  • 获取Servlet信息
String getServletInfo()

@WebServlet("/demo")
public class ServletDemo implements Servlet {private ServletConfig servletConfig;/*** 初始化方法* 1.调用时机:默认情况下,Servlet被第一次访问时调用* 2.调用次数:1次* @param servletConfig* @throws ServletException*/@Overridepublic void init(ServletConfig servletConfig) throws ServletException {this.servletConfig = servletConfig;System.out.println("init...");}@Overridepublic ServletConfig getServletConfig() {return this.servletConfig;}/*** 提供服务* 1.调用时机:每次Servlet被访问时调用* 2.调用次数:多次* @param servletRequest* @param servletResponse* @throws ServletException* @throws IOException*/@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("hello service~");}@Overridepublic String getServletInfo() {return "";}/*** 销毁方法* 1.调用时机:内存释放或服务器关闭时* 2.调用次数:1次*/@Overridepublic void destroy() {System.out.println("destroy...");}
}

四、 Servlet体系结构


在这里插入图片描述


  • 我们将来开发B/S架构的web项目,都是针对HTTP协议所以我们自定义Servlet,会继承HttpServlet
  • 自定义Servlet,重写doGetdoPost方法:
@WebServlet("/demo1")
public class ServletDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("get...");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("post...");}
}

  • 默认执行doGet方法:

在这里插入图片描述


  • 执行doPost方法:
    • 创建一个html文件,定义一个表单,设置url路径,方法为post请求,发送post请求:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>doPost</title>
</head>
<body>
<form action="/BBS/demo1" method="post"><input name="username"><input type="submit">
</form>
</body>
</html>

在这里插入图片描述


五、 urlPattern配置

  • Servlet要想被访问,必须配置其访间路径(urlPattern)
  • 一个Servlet,可以配置多个urlPattern
 String[] urlPatterns() default {};
@WebServlet(urlPatterns = {"/demo1","/demo2"})
  • urlPattern配置规则
    • 精确匹配
      • 配置路径:@WebServlet(urlPatterns = "/user/select")
      • 访问路径:http://localhost:8080/BBS/user/select
    • 目录匹配
      • 配置路径:@WebServlet(urlPatterns = "/user/*")
      • 访问路径:http://localhost:8080/BBS/user/aaa(aaa可以使任意字符)
    • 扩展名匹配
      • 配置路径:@WebServlet(urlPatterns = "*.do")注意:此处没有/,这里的*表示任意以.do的路径均可
      • 访问路径:http://localhost:8080/BBS/demo1.do
    • 任意匹配
      • 配置路径:@WebServlet(urlPatterns = "/")@WebServlet(urlPatterns = "/*")后者优先级更高
      • 访问路径:http://localhost:8080/BBS/ /后可为任意内容
    • //*的区别:
      • 当我们的项目中的Servlet配置了"/”,会覆盖掉tomcat中的DefaultServlet,当其他的url-patterni都匹配不上时都会走这个Servlet
      • 当我们的项目中配置了“*”,意味着匹配任意访问路径
  • 优先级:
    • 精确路径 > 目录路径 > 扩展名路径 > /* > /

六、 XML配置Servlet(老版本)

  • 1.编写Servlet类
  • 2.在web.xml中配置该Servlet类
<web-app><display-name>Archetype Created Web Application</display-name><!--Servlet全类名--><servlet><servlet-name>demo2</servlet-name><servlet-class>test.ServletDemo2</servlet-class></servlet><!--Servlet访问路径--><servlet-mapping><servlet-name>demo2</servlet-name><url-pattern>/demo2</url-pattern></servlet-mapping>
</web-app>

七、Request

  • Request:获取请求数据
  • Response:设置响应数据

7.1 Request继承体系


在这里插入图片描述


  • Tomcati需要解析请求数据,封装为request对象并且创建request对象传递到service方法中
  • 使用request对象,查阅JavaEE API文档的HttpServletRequest接口

7.2 Request获取请求数据

  • 请求行:
  • GET /request-demo/req1?username=zhangsan HTTP/1.1
    • String getMethod():获取请求方式:GET
    • String getContextPath():获取虚拟目录(项目访问路径):/request-demo
    • String Buffer getRequestURL():获取URL(统一资源定位符):http:/localhost:8080/request–demo/req1
    • String getRequestURI():获取URI(统一资源标识符):/request-demo/req1
    • String getQueryString():获取请求参数(GET方式):username=zhangsan&password=123
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//String getMethod()String method = req.getMethod();System.out.println(method);//String getContextPath()String contextPath = req.getContextPath();System.out.println(contextPath);//String Buffer getRequestURL()StringBuffer requestURL = req.getRequestURL();System.out.println(requestURL.toString());//String getRequestURI()String requestURI = req.getRequestURI();System.out.println(requestURI);//String getQueryString()String queryString = req.getQueryString();System.out.println(queryString);}

在这里插入图片描述


  • 请求头:
  • User-Agent:Mozilla/5.0 Chrome/91.0.4472.106
  • String getHeader((String name); 根据请求头名称,获取值
//user-agent:浏览器版本信息
String agent = req.getHeader("user-agent");
System.out.println(agent);

在这里插入图片描述


  • 请求体:
  • username=superbaby&password=123
  • ServletInputStream getInputStream();获取字节输入流
  • BufferedReader getReader();获取字符输入流
@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.获取字符输入流BufferedReader reader = req.getReader();//2.读取数据String s = reader.readLine();System.out.println(s);}

在这里插入图片描述


7.3 Request通用方式获取请求参数

  • Map<String,String[]>getParameterMap():获取所有参数Map集合

  • String[]getParameterValues(String name):根据名称获取参数值(数组)

  • String getParameter(String name):根据名称获取参数值(单个值)

  • get方式:

    • html代码:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>doPost</title>
</head>
<body>
<form action="/BBS/demo5" method="get"><input type="text" name="username"><br><input type="password" name="password"><br><input type="checkbox" name="hobby" value="1"> 游泳<input type="checkbox" name="hobby" value="2"> 跑步 <br><input type="submit">
</form>
</body>
</html>
  • Java代码:
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//Get请求System.out.println("get...");//1.获取所有参数的Map集合Map<String, String[]> parameterMap = req.getParameterMap();for (String key : parameterMap.keySet()) {System.out.print(key + ": ");//获取值String[] strings = parameterMap.get(key);for (String string : strings) {System.out.print(string + " ");}System.out.println();}System.out.println("----------------------");//2.根据key获取值String[] hobbies = req.getParameterValues("hobby");for (String hobby : hobbies) {System.out.println(hobby);}System.out.println("----------------------");//3.获取单个参数String username = req.getParameter("username");String password = req.getParameter("password");System.out.println(username);System.out.println(password);}
  • post方式:
    • html代码:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>doPost</title>
</head>
<body>
<form action="/BBS/demo5" method="post"><input type="text" name="username"><br><input type="password" name="password"><br><input type="checkbox" name="hobby" value="1"> 游泳<input type="checkbox" name="hobby" value="2"> 跑步 <br><input type="submit">
</form>
</body>
</html>
  • Java代码:
@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//Post请求System.out.println("get...");//1.获取所有参数的Map集合Map<String, String[]> parameterMap = req.getParameterMap();for (String key : parameterMap.keySet()) {System.out.print(key + ": ");//获取值String[] strings = parameterMap.get(key);for (String string : strings) {System.out.print(string + " ");}System.out.println();}System.out.println("----------------------");//2.根据key获取值String[] hobbies = req.getParameterValues("hobby");for (String hobby : hobbies) {System.out.println(hobby);}System.out.println("----------------------");//3.获取单个参数String username = req.getParameter("username");String password = req.getParameter("password");System.out.println(username);System.out.println(password);}
  • 通用代码:
@WebServlet("/demo5")
public class ServletDemo5 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//Get请求System.out.println("get...");//1.获取所有参数的Map集合Map<String, String[]> parameterMap = req.getParameterMap();for (String key : parameterMap.keySet()) {System.out.print(key + ": ");//获取值String[] strings = parameterMap.get(key);for (String string : strings) {System.out.print(string + " ");}System.out.println();}System.out.println("----------------------");//2.根据key获取值String[] hobbies = req.getParameterValues("hobby");for (String hobby : hobbies) {System.out.println(hobby);}System.out.println("----------------------");//3.获取单个参数String username = req.getParameter("username");String password = req.getParameter("password");System.out.println(username);System.out.println(password);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req,resp);}
}

7.4 请求参数中文乱码处理

7.4.1 POST 解决方案

@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解决乱码POST//设置字符输入流的编码req.setCharacterEncoding("utf-8");//获取数据String username = req.getParameter("username");System.out.println(username);}

7.4.1 GET 解决方案

  • GET获取参数方式:getQueryString
  • 产生乱码的原因:
    • 浏览器在解析中文字符时采用UTF-8的字符集通过URL进行编码,将中文转换成%+16进制数的格式,然后将转换后的字符发送给服务器进行解码,tomcat在进行解码时是通过ISO-8859-1的字符集进行URL解码,由于编码和解码时用的字符集不同,所以就会出现乱码。
  • URL编码:
    • 将字符串按照编码方式转为二进制
    • 每个字节转为2个16进制数并在前边加上%
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解决乱码GETString username = req.getParameter("username");//转换为字节数据,编码byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);//将字节数组转换为字符串,解码username = new String(bytes,"utf-8");System.out.println(username);}
  • Tomcat8.0之后,已将GET请求乱码问题解决,设置默认的解码方式为UTF-8

7.5 Request请求转发

  • 请求转发(forward):一种在服务器内部的资源跳转方式
req.getRequestDispatcher("资源B路径").forward(req,resp);
  • 请求转发资源间共享数据:使用Request对象
  • void setAttribute(String name,Object o):存储数据到request域中
  • Object getAttribute(String name):根据key,获取值
  • void removeAttribute(String name):根据key,删除该键值对
@WebServlet("/demo7")
public class ServletDemo7 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("demo7...");//存储数据req.setAttribute("msg","hello");//请求转发req.getRequestDispatcher("/demo8").forward(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req,resp);}
}
@WebServlet("/demo8")
public class ServletDemo8 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("demo8...");//获取数据Object msg = req.getAttribute("msg");System.out.println(msg);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req,resp);}
}
  • 请求转发特点:
    • 浏览器地址栏路径不发生变化
    • 只能转发到当前服务器的内部资源
    • 一次请求,可以在转发的资源间使用request共享数据

八、Response

8.1 设置相应数据功能

  • 响应数据分为3部分:
    • 响应行
      • 设置响应状态码:
void setStatus(int sc)
    • 响应头
      • 设置响应键值对
void setHeader(String name,String value)
    • 响应体
      • 获取字符输出流
PrintWriter getWriter();
      • 获取字节输出流
ServletOutputStream getOutputStream();

8.2 完成重定向

  • 重定向(Redirect):一种资源跳转方式
@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("resp1...");//重定向//设置响应状态码302//resp.setStatus(302);//设置响应头//resp.setHeader("Location","/BBS/resp2");//简化方式resp.sendRedirect("/BBS/resp2");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req, resp);}
}
@WebServlet("/resp2")
public class ResponseDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("resp2...");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req, resp);}
}
  • 重定向特点:
    • 浏览器地址栏路径发生变化
    • 可以重定向到任意位置的资源(服务器内部、外部均可)
    • 两次请求,不能在多个资源使用request:共享数据

8.3资源路径问题

  • 明确路径谁使用?
    • 浏览器使用:需要加虚拟目录(项目访问路径)
    • 服务端使用:不需要加虚拟目录
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("resp1...");//简化方式//动态获取虚拟目录String contextPath = req.getContextPath();resp.sendRedirect(contextPath + "/resp2");}

8.4 Response响应字符数据

  • 使用:
    • 1.通过Response对象获取字符输出流
PrintWriter writer resp.getWriter();
  • 2.写数据
writer.write("hello~");

@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");PrintWriter writer = resp.getWriter();resp.setHeader("content-type","text/html");writer.write("<h1>hello~</h1>");writer.write("<h1>你好~</h1>");}

注意:

  • 该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭
  • 中文数据乱码:原因通过Response获取的字符输出流默认编码:ISO-8859-1

8.5 Response响应字节数据

  • 使用:
  • 通过Response对象获取字符输出流
ServletOutputStream outputStream resp.getOutputStream();
  • 写数据
outputStream.write("字节数据")

@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//读取文件FileInputStream fis = new FileInputStream("d://head.jpg");//获取response字节输出流ServletOutputStream os = resp.getOutputStream();//完成流的copybyte[] buff = new byte[1024];int len = 0;while ((len = fis.read(buff)) != -1) {os.write(buff,0,len);}fis.close();}
  • IOUtils工具类使用:
    • 导入坐标:
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version>
</dependency>
    • 使用:
IOUtils.copy(fis,os);

@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//读取文件FileInputStream fis = new FileInputStream("d://head.jpg");//获取response字节输出流ServletOutputStream os = resp.getOutputStream();//完成流的copyIOUtils.copy(fis,os);fis.close();}

相关文章:

Servlet执行流程生命周期方法介绍体系结构、Request和Response的功能详解

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Servlet 一、 Servlet执行流程二、Servlet生…...

软件工程之总体设计

总体设计是软件工程中的一个重要阶段&#xff0c;它关注整个系统的结构和组织&#xff0c;旨在将系统需求转化为可执行的软件解决方案。总体设计决定了系统的架构、模块划分、功能组织以及数据流和控制流等关键方面。 可行性研究 具体方面&#xff1a;经济可行性、技术可行性…...

监控员工电脑文件拷贝记录:电脑怎么看员工复制文件的历史记录

在现代企业管理中&#xff0c;数据安全和保密是极其重要的一环。企业需要确保敏感信息不被泄露&#xff0c;以防止可能的法律纠纷和经济损失。为此&#xff0c;许多公司都采取了一些措施来监控员工的电脑使用行为。其中&#xff0c;监控文件拷贝记录是一种常见的方法。本文将详…...

vue中request.js中axios请求和(若依)文件通用下载方法封装

vue中request.js中axios请求和&#xff08;若依&#xff09;文件通用下载方法封装 1.request.js import axios from axios import { Message, Loading } from element-ui import { saveAs } from file-saver // 创建axios实例 const request axios.create({// 这里可以放一…...

【大数据存储与处理】1. hadoop单机伪分布安装和集群安装

0. 写在前面 0.1 软件版本 hadoop2.10.2 ubuntu20.04 openjdk-8-jdk 0.2 hadoop介绍 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下&#xff0c;开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个…...

linux通过time命令统计代码编译时间

首先编写一个编译脚本 build.sh 内容如下&#xff1a; 然后执行time sh build.sh 编译完成后输出三个时间 time sh xxx.sh # 会返回3个时间数据 (1) real&#xff1a;从进程 ls 开始执行到完成所耗费的 CPU 总时间。该时间包括 ls 进程执行时实际使用的 CPU 时间&#xff0c;…...

logback日志是怎么保证多线程输出日志线程安全的

logback中的单例模式 logback日志框架使用了单例设计模式来进行日志输出。在logback中&#xff0c;Logger类是一个关键的组件&#xff0c;它负责记录和输出日志消息。 Logger类使用了单例设计模式&#xff0c;确保在一个应用程序中只存在一个Logger实例。这样做的好处是可以确…...

2022年统计用区划代码表SQL 01

行政区划代码为国家公布的六位县级以上行政区划代码 行政区编码的用途&#xff1a; APP里做城市级联选择根据身份证前六位获取用户所在城市区县 370786 昌邑市 370800 济宁市 370811 任城区 370812 兖州区 百度高德等接口通常都会返回adcode字段 (行政区编码)根据 行政区编…...

EM@基本初等函数@幂和根式@指数函数

abstract 基本初等函数幂和根式指数函数 指数和幂 正整指数幂 a n a^{n} an a ⋯ a ⏟ n 个 \underbrace{a\cdots{a}}_{n个} n个 a⋯a​​, n ∈ N n\in\mathbb{N^{}} n∈N 其中 a n a^{n} an称为** a a a的 n n n次幂** a a a叫做幂的底数, n n n叫做幂的指数 正整指数…...

时序预测 | MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测

时序预测 | MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测 目录 时序预测 | MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测&#…...

element 二次确认框,内容自定义处理

上代码&#xff1a; async inspectionTypeOff(row) {console.log(row.id);let taskArray await this.getTaskList(row.id); // 查询关联的任务console.log("taskArray", taskArray);let messageTip taskArray.length > 0? <div><p>确认禁用巡检项&…...

【软件设计师-中级——刷题记录4(纯干货)】

目录 进度管理工具Grantt图&#xff1a;程序语言基础&#xff1a;高级语言源程序模式&#xff1a; 每日一言&#xff1a;持续更新中... 个人昵称&#xff1a;lxw-pro 个人主页&#xff1a;欢迎关注 我的主页 个人感悟&#xff1a; “失败乃成功之母”&#xff0c;这是不变的道理…...

9.24 校招 实习 内推 面经

绿泡*泡&#xff1a; neituijunsir 交流裙 &#xff0c;内推/实习/校招汇总表 1、自动驾驶一周资讯 - 小马智行在京开展“车内无人”出行服务商业化试点&#xff0c;余承东将升任车BU董事长 自动驾驶一周资讯 - 小马智行在京开展“车内无人”出行服务商业化试点&#xff0…...

第二章:25+ Python 数据操作教程(第二十五节用 PYTHON 和 R 制作祝福圣诞节)持续更新

这篇文章献给所有 Python 和 R 编程爱好者...通过以下程序在同行中炫耀您的知识。作为一名数据科学专业人士,您希望自己的愿望在圣诞节前夕变得特别。如果您观察代码,您还可以学到 1-2 个技巧,您可以在以后的日常任务中使用这些技巧。 方法 1:运行以下程序,看看我的意思 R…...

你是怎么理解自动化测试的?理解自动化测试的目的和本质

其实自动化测试很好理解&#xff0c;由两部分组成&#xff0c;“自动化”和“测试”&#xff0c;所以我们要理解自动化测试&#xff0c;就必须理解“自动化”和“测试”&#xff0c;只有理解了这些概念&#xff0c;才能更轻松的做好的自动化测试。其中“自动化”可以想象成通过…...

二十六、MySQL并发事务问题:脏读/不可重复读/幻读

1、事务的隔离级别 &#xff08;1&#xff09;隔离级别 Read uncommitted # 读&#xff0c;未提交 Read committed # 读&#xff0c;已提交 Repeatable Read(默认) # 可重复读 Serializable # 串读 &#xff08;2&#xff09;基础语法 set transaction isolation level 事…...

RK3588平台开发系列讲解(项目篇)视频监控之RTMP推流

文章目录 一、RTMP协议是什么二、RTMP 的原理三、Nginx 流媒体服务器四、FFmpeg 推流沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 目前常见的视频监控和视频直播都是使用了 RTMP、RTSP、HLS、MPEG-DASH、WebRTC流媒体传输协议等。 视频监控项目组成,分为三部分:…...

http基础教程(超详细)

HTTP HTTP 一 、基础概念 请求和响应报文URL 二、HTTP 方法 GETHEADPOSTPUTPATCHDELETEOPTIONSCONNECTTRACE 三、HTTP 状态码 1XX 信息2XX 成功3XX 重定向4XX 客户端错误5XX 服务器错误 四、HTTP 首部 通用首部字段请求首部字段响应首部字段实体首部字段 五、具体应用 连接管理…...

Vue3 <script setup> 单文件组件 组合式 API 相关语法

1.vue3使用vuex <script setup> import {ref} from "vue" import {useStore} from "vuex"//获取store const storeuseStore(); const count ref(0); //获取store状态 const type store.state.type //给count赋值 count.value1;</script>2.vue…...

为什么说网络安全是IT行业最后的红利?是风口行业?

前言 “没有网络安全就没有国家安全”。当前&#xff0c;网络安全已被提升到国家战略的高度&#xff0c;成为影响国家安全、社会稳定至关重要的因素之一。 网络安全行业特点 1、就业薪资非常高&#xff0c;涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...