【计算机网络】Servlet API重点知识汇总

news/2024/5/9 7:00:28/文章来源:https://blog.csdn.net/qq_68993495/article/details/127934027

目录

1.HttpServlet:

2.HttpServletRequest:

3.HttpServletRequest代码实例:

3.1.打印请求的内容:

3.2.获取请求中的重要参数

(query string中的值):

3.3.获取请求中的重要参数

(body中的值):

4.HttpServletResponse:

5.HttpServletResponse代码示例:

5.1.设置不同的状态码

5.2.设置响应的header,实现页面的自动刷新

5.3.构造一个重定向响应

6.代码案例:


  1. Servlet 是Tomcat给后端程序员提供的开发服务器程序的API合集,借助这个更方便搭建网站的后端。
  2. Servlet提供的类和方法有很多主要使用的就是三个(HttpServlet、HttpServletRequestHttpServletResponse

1.HttpServlet:

  1. HttpServlet,编写servlet代码的时候第一步就是先创建类继承自HttpServlet,并重写某些方法:
    核心方法说明
    init首次创建出HttpServlet实例会调用一次
    destroy在HttpServlet实例不使用时调用一次
    service收到HTTP请求的时候调用头一次
    doGet收到GET请求的时候service调用doGet
    doPost收到POST请求的时候service来调用
    doPut / doDelete收到这些请求的时候service来调用
  2. init 方法:创建出HttpServlet实例会调用一次,init方法的作用就是用来初始化。注意:HttpServlet的实例只是在程序启动的时候创建一次而不是每次收到HTTP请求都重新创建实例。
  3. destroy方法:不一定真的能调用到!如果Tomcat关闭了,则不再调用HttpServlet了
    Tomcat的关闭:
    1.杀进程, 类似于拔电源
    比如点击idea中的红色方框、cmd直接点×、任务管理器结束任务......2.通过8005端口给Tomcat发送一个关闭操作, 类似于走正常的程序关闭电脑
    这个时候Tomcat就会正常关机就可以调用到destroy方法
  4. service方法:Tomcat收到请求实际上是先调用service,在service里面再去根据方法调用不同的doXxx。
  5. 【面试题】谈一谈Servlet的生命周期。
    初始阶段实例化的时候,调用一次 init
    结束销毁之前,调用一次 destroy
    每次收到请求,调用 service

2.HttpServletRequest:

  1. 当Tomcat通过Socket api读取HTTP请求(字符串),并且按照HTTP协议的格式把字符串解析成HttpServletRequest对象
  2. URL是唯一资源定位符;URI是唯一资源标识符。
  3. 常用方法:
    方法说明
    String getProtocol()返回请求协议的名称和版本号
    String getMethod()返回请求的HTTP方法
    String getPrequestURI()返回URL中的一部分
    String getContextPath()返回ContextPath
    String getQueryString()返回查询字符串
    Enumeration getParameterNames()
    String getParameter(String name)返回请求参数的值,参数不存在返回null
    String[ ] getParameterValues(String name)返回请求参数的所有值
    Enumeration getHeaderNames()返回包含请求中所有header的key的枚举
    String getCharacterEncoding()返回请求中使用的字符编码
    String getContentType()返回请求中使用的文本类型和字符编码
    int getContentLength()返回请求主体的长度,字节为单位
    String getHeader(String name)返回指定请求头的值
    InputStream getInputStream()用来读取query string和body的内容
  4. 请求的对象是服务器收到的内容,不应该修改;因此上面都是读的方法不是写的方法。

3.HttpServletRequest代码实例:

3.1.打印请求的内容:

 代码如下:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;@WebServlet("/showRequest")
public class showRequest extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//resp是响应的对象,setContentType给响应的ContentType设置了值html//声明响应body是html结构的数据resp.setContentType("text/html");StringBuilder stringBuilder = new StringBuilder();//getProtocol返回请求协议的版本stringBuilder.append(req.getProtocol());//要将\n 替换成 <br> 否则html无法识别
//        stringBuilder.append("\n");stringBuilder.append("<br>");//getMethod返回请求中http方法的名称stringBuilder.append(req.getMethod());stringBuilder.append("<br>");//getRequestURI返回请求的uristringBuilder.append(req.getRequestURI());stringBuilder.append("<br>");//getRequeatURL返回请求的urlstringBuilder.append(req.getRequestURL());stringBuilder.append("<br>");//返回Context PathstringBuilder.append(req.getContextPath());stringBuilder.append("<br>");//返回查询字符串stringBuilder.append(req.getQueryString());stringBuilder.append("<br>");//拼接header中的内容//getHeaderNames返回一个包含请求中所有的键值对key的值Enumeration<String> headerNames = req.getHeaderNames();while(headerNames.hasMoreElements()){String name = headerNames.nextElement();//getHeader以字符串的形式返回key对应的value值String value = req.getHeader(name);stringBuilder.append(name+ ": " + value);stringBuilder.append("<br>");}resp.getWriter().write(stringBuilder.toString());}
}

3.2.获取请求中的重要参数

(query string中的值):

  1.  对于获取query string来说,核心的方法就是getParameter
  2. 如果在浏览器页面上已经手动对特殊符号包括汉字encode编码了,那么servlet getParameter方法会自动的针对encode的结果进行decode解码操作,不需要手动处理。注意一点:浏览器地址栏里用户输入的查询字符串中包含汉字,也不一定会出错(有的浏览器自动编码)。
  3. getParameter方法使用时,如果键值对不存在,得到的就是 null;如果键值对的值不存在,得到的就是 “ ”,例如查询字符串为?studentId=1&studentName=  )。
  4. 如果不写Content-Type,浏览器就不知道用什么方式什么格式来解析。

代码如下: 

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/getParameter")
public class getParameterServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取query string中的键值对//取值的时候,如果键值对不存在返回的是 null//如果键存在,值不存在那么返回 “ ”String studentId = req.getParameter("studentId");String studentName = req.getParameter("studentName");System.out.println(studentId);System.out.println(studentName);//如果不加这行代码,浏览器就会显示出 ???,这里是 = ,不能是 -resp.setContentType("text/html; charset=utf8");resp.getWriter().write(studentId + " , " + studentName);}
}

3.3.获取请求中的重要参数

(body中的值):

分为俩种情况!

  1. (1)如果请求的body是x-www-form-urlencode格式,form表单、这里也使用getParameter来获取。
  2. 用 html 和 postman 分别来操作!
  3. 使用html来发送form请求,需要先在webapp目录下创建一个html。
  4. 服务器的代码:
  5. 上述的前端和后端代码运行后会出现问题
  6. 请求req这里设置的utf8是告诉servlet(tomcat)如何解析响应resp这里设置的utf8是告诉浏览器如何解析
  7. 请求req和响应resp的字符编码。
    请求这里使用这个方法:
    req.setCharacterEncoding("utf8");响应建议使用第一种,
    因为不止要设置字符集还要设置格式
    resp.setContentType("text/html; charset = utf8");
    //resp.setCharacterEncoding("utf8");
  8. 加字符编码的总体原则:不要让程序猜!最好的做法就是显示声明该声明的东西。
  9. 通过postman来构造一个POST请求,postman也是一个http客户端,和浏览器是对等的。请求req也要设置字符集,否则还是会有乱码。

后端代码如下:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/getParameter")
public class getParameterServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//如果不加上这段代码,req就会随机解析,因此页面上显示的就是乱码req.setCharacterEncoding("utf8");String studentId = req.getParameter("studentId");String studentName = req.getParameter("studentName");System.out.println(studentId);System.out.println(studentName);resp.setContentType("text/html; charset = utf8");resp.getWriter().write(studentId + ", " + studentName);}
}

  1. (2)如果请求的body是json格式,需要先读取body中的内容,进一步的再来读取流对象(getInputStream),下一步解析json格式,但是servlet中没有内置json解析,因此我们需要到借助第三方库jackson
  2. Jackson的使用需要我们知道一个类和俩个方法。一个ObjectMapper,方法是readValuewriteValueAsString
  3. readValue的作用是先读取输入流获取要解析的字符串,再把字符串按照json格式解析得到一组键值对(map),再根据类对象创建一个实例,再遍历类对象中的属性的名字,拿着名字去上面的map中查询,查到的value赋值到对应的对象的属性中,最后返回这个构造完成的对象。
  4. readValue要求键值对中键的名字和类的属性名要一一对应。
  5. 如果类属性多,请求的key少,不会报错,少的那个属性就是null。如果类属性少,请求的key多这里key的多指的是个数多,不是种类,结果就是最后那个。如果类属性少,请求的key多这里key多的是种类,那就会报错。
  6. 还可以使用writeValueAsString方法来返回响应。
  7. 对三种返回响应的代码抓包:

 后端代码如下:

import com.fasterxml.jackson.databind.ObjectMapper;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;class Student{//1.这个student类的属性必须是public或者带有 public 的getter 和 setter//  否则jackson无法访问这个对象的属性//2.这个类必须要有无参版本的构造方法public int studentId;public String studentName;public String studentSex;
}@WebServlet("/json")
public class JsonServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//此处假设请求中的body是json格式的//{studentId:66,studentName:"王大锤"}//jackson 一个类ObjectMapper 和俩个方法//一个方法是readValue,把json格式的数据转换成 java 对象//另外一个方法是writeValueAsString,把java对象转换成json格式的字符串ObjectMapper objectMapper = new ObjectMapper();//readValue的第一个参数可以是字符串,也可以是输入流//第二个参数是类的对象Student s = objectMapper.readValue(req.getInputStream(),Student.class);System.out.println(s.studentId);System.out.println(s.studentName);System.out.println(s.studentSex);//        resp.setContentType("text/html; charset = utf8");
//        resp.getWriter().write(s.studentId + ", " + s.studentName +", " + s.studentSex);//        //响应的数据是html格式的
//        resp.setContentType("text/html; charset = utf8");
//        resp.getWriter().write(objectMapper.writeValueAsString(s));//响应的数据是json格式的resp.setContentType("application/json; charset = utf8");resp.getWriter().write(objectMapper.writeValueAsString(s));}
}

4.HttpServletResponse:

  1. HttpServletRequest的方法大部分都是前缀为get;HttpServletResponse的方法大部分都是前缀为set。
  2. 在doGet/doPost等方法中,这里面的HttpServletResponse对象都是空的。因此这些方法都是set系列也就好理解了。
  3. 常用方法:
    方法说明
    void setStatus()设置状态码
    void setHeader(String name,String value)设置一个header字段,如果已经存在,会覆盖
    void addHeader(String name,String value)设置一个header字段,如果存在,会再创建一个
    void setContentType()设置发送给客户端的响应的内容类型+字符编码
    void setCharacterEncoding()设置发送给客户端的响应的字符编码
    void sendRedirect(String location)重定向
    PrintWriter getWriter()用于往body中写入文本格式数据
    OutputStream getOutputStream()用于往body中写入二进制数据
  4. 状态码和header的设置要放到getWriter和getOutputStream前面。

5.HttpServletResponse代码示例:

5.1.设置不同的状态码

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/status")
public class StatusServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//约定一下浏览器的query string传一个参数过来//127.0.0.1:8080/servlet/status?type=1//如果type=1返回200,如果为2返回404String type = req.getParameter("type");if(type.equals("1")){resp.setStatus(200);}else if(type.equals("2")){resp.setStatus(404);}else if(type.equals("3")){{resp.setStatus(500);}}else{resp.setStatus(504);}}
}

5.2.设置响应的header,实现页面的自动刷新

  1. 在header中设置refresh属性,值是一个秒数,浏览器会在时间到了之后自动刷新
  2. 尽管我设置了3秒刷新一次,但是并不是精确的3000ms,会比3000略多一点
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/autoRefresh")
public class AutoRefreshServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//直接返回响应就行resp.setHeader("refresh","3");resp.getWriter().write(System.currentTimeMillis()+"");}
}

5.3.构造一个重定向响应

  1. 可以设置header中的Location属性,实现跳转;也可以使用sendRedirect方法。 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//进行重定向,收到请求,跳转到哔哩哔哩//第一种写法//resp.setStatus(302);//resp.setHeader("Location","http://www.bilibili.com");//第二种写法resp.sendRedirect("http://www.bilibili.com");}
}

6.代码案例:

  1. 实现表白墙:在页面上点击提交,希望在服务器这里保存数据,把数据发送给服务器;当关闭页面再启动,需要从服务器上读取之前保存过的数据,在页面上显示出来。
  2. 先要规划好请求和响应的细节。
  3. 提供俩种版本:顺序表和数据库。

 使用顺序表的版本:

import com.fasterxml.jackson.databind.ObjectMapper;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;@WebServlet("/message")
public class MessageServlet extends HttpServlet {public ObjectMapper objectMapper = new ObjectMapper();public ArrayList<Message> arrayList = new ArrayList<>();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/json; charset=utf8");resp.getWriter().write(objectMapper.writeValueAsString(arrayList));}//浏览器提交数据@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取到body中的数据并且解析Message message = objectMapper.readValue(req.getInputStream(),Message.class);//将得到的数据保存arrayList.add(message);resp.setStatus(200);System.out.println("提交数据成功,form:" + message.getFrom() +" to: " + message.getTo() + " Message: " + message.getMessage());}
}
class Message {private String From;private String To;private String Message;public String getFrom() {return From;}public void setFrom(String from) {From = from;}public String getTo() {return To;}public void setTo(String to) {To = to;}public String getMessage() {return Message;}public void setMessage(String message) {Message = message;}
}

使用数据库的版本:

//使用这个类来封装DataSource
public class DBUtil {private static volatile DataSource dataSource = null;public static DataSource getDataSource(){if(dataSource == null){synchronized (DBUtil.class){if(dataSource == null){dataSource = new MysqlDataSource();((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java105?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("111111");}}}return dataSource;}private DBUtil() {}
}import com.fasterxml.jackson.databind.ObjectMapper;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;@WebServlet("/message")
public class MessageServlet extends HttpServlet {// 这个对象在多个方法中都需要使用private ObjectMapper objectMapper = new ObjectMapper();// 负责让页面获取到数据@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 显式声明当前的响应数据格式 不要让客户端去猜!!!resp.setContentType("application/json; charset=utf8");// 把 messageList 转成 json 字符串, 并且返回给页面就行了.List<Message> messageList = null;try {messageList = load();} catch (SQLException e) {e.printStackTrace();}resp.getWriter().write(objectMapper.writeValueAsString(messageList));}// 提交数据@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取到 body 中的数据并解析Message message = objectMapper.readValue(req.getInputStream(), Message.class);// 把这个 message 保存一下. 简单的办法就是保存在内存中.// messageList.add(message);try {save(message);} catch (SQLException e) {e.printStackTrace();}resp.setStatus(200);System.out.println("提交数据成功: from=" + message.getFrom()+ ", to=" + message.getTo() + ", message=" + message.getMessage());}private List<Message> load() throws SQLException {// 从数据库查询数据// 1. 先有一个数据源DataSource dataSource = DBUtil.getDataSource();// 2. 建立连接Connection connection = dataSource.getConnection();// 3. 构造 SQLString sql = "select * from message";PreparedStatement statement = connection.prepareStatement(sql);// 4. 执行 SQLResultSet resultSet = statement.executeQuery();// 5. 遍历结果集合List<Message> messageList = new ArrayList<>();while (resultSet.next()) {Message message = new Message();message.setFrom(resultSet.getString("from"));message.setTo(resultSet.getString("to"));message.setMessage(resultSet.getString("message"));messageList.add(message);}// 6. 关闭连接statement.close();connection.close();return messageList;}private void save(Message message) throws SQLException {// 把数据保存到数据库中// 1. 先有一个数据源DataSource dataSource = DBUtil.getDataSource();// 2. 建立连接Connection connection = dataSource.getConnection();// 3. 构造 SQLString sql = "insert into message values(?, ?, ?)";PreparedStatement statement = connection.prepareStatement(sql);statement.setString(1, message.getFrom());statement.setString(2, message.getTo());statement.setString(3, message.getMessage());// 4. 执行 SQLint ret = statement.executeUpdate();System.out.println("ret = " + ret);// 5. 关闭连接statement.close();connection.close();}
}

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

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

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

相关文章

用HTML+CSS仿网易云音乐网站(6个页面)_实训素材

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 音乐网页设计 | 仿网易云音乐 | 各大音乐官网网页 | 明星音乐演唱会主题 | 爵士乐音乐 | 民族音乐 | 等网站的设计与制作 | HTML期末大学生网页设计作…

【安装教程】vscode安装教程(超详细)

Visual Studio Code&#xff08;简称 VSCode&#xff09;是一款由微软开发且跨平台的免费源代码编辑器。该软件支持语法高亮、代码自动补全、代码重构功能&#xff0c;并且内置了命令行工具和 Git版本控制系统。用户可以更改主题和键盘快捷方式实现个性化设置&#xff0c;也可以…

SpringBoot SpringBoot 开发实用篇 6 监控 6.5 health 端点指标控制

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇6 监控6.5 health 端点指标控制6.5.1 问题引入6.5.2 health 端点指标…

还有人以为高并发=多线程吗?跟着大佬带你了解二者关系与区别,面试难题轻松拿下!

高并发和多线程的关系 “高并发和多线程”总是被一起提起&#xff0c;给人感觉两者好像相等&#xff0c;实则高并发≠多线程 多线程是完成任务的一种方法&#xff0c;高并发是系统运行的一种状态&#xff0c;通过多线程有助于系统承受高并发状态的实现。 高并发是一种系统运…

Android 10.0 11.0 12.0 启动模拟器教程

Android 10.0 11.0 12.0 启动模拟器教程 一、android 12.0 模拟器二、创建模拟器设备三、创建删除路经文件夹avd和配置环境变量四、启动模拟器一、android 12.0 模拟器 Android 10.0 11.0 12.0 启动模拟器都行,我选择android 12.0 模拟器 二、创建模拟器设备 第一步骤:在 …

推荐一个基于Springboot + Vue 开发的前后端分离博客

基于Springboot Vue 开发的前后端分离博客 博客介绍 本博客是参考 [风丶宇] 大佬的博客更新而成&#xff0c;感谢大佬提供的页面&#xff0c;然后定制新增部分功能&#xff0c;是个非常值得新手入门学习的Java规范化编程案例&#xff01; 在线地址 项目链接&#xff1a; h…

JVM 中类加载的链接与初始化

类加载系统&#xff0c;主要有以下部分 加载链接 验证准备解析初始化 它们每部分都做些什么事情呢&#xff1f; 加载 (2条消息) JVM 双亲委派模型_兜兜转转m的博客-CSDN博客 链接 链接-验证 一般验证部分&#xff0c;IDEA已经帮我们规范了。 验证是连接阶段的第一步&…

数据结构和常用排序算法复杂度

1.顺序表 插入操作时间复杂度 最好O(1)&#xff0c;最坏O(n)&#xff0c;平均O(n) 移动结点的平均次数n/2 删除操作时间复杂度 最好O(1)&#xff0c;最坏O(n)&#xff0c;平均O(n) 移动结点的平均次数(n-1)/2 按值查找时间复杂度 最好O(1)&#xff0c;最坏O(n)&#xff0c;平…

JVM垃圾回收——CMS垃圾收集器

目录 一、什么是CMS垃圾收集器 二、CMS垃圾收集的过程 三、CMS收集器的不足 四、CMS收集器的参数配置 一、什么是CMS垃圾收集器 虽然HotSpot虚拟机已经在jdk14中移除了CMS垃圾收集的参数&#xff0c;但是考虑到还有很多开发是基于jdk8开发的&#xff0c;所以还是有必要了解…

数据结构-难点突破(C++实现并查集+路径优化,详解哈夫曼编码树)

文章目录1. 并查集2. 哈夫曼编码树1. 并查集 并查集是一个多棵树的集合&#xff08;森林&#xff09;。 并查集由多个集合构成&#xff0c;每一个集合就是一颗树。 并&#xff1a;合并多个集合。查&#xff1a;判断两个值是否再一个集合中。 每棵树存在数组中&#xff0c;使…

集世界杯+GameFi元素的MetaElfLand,为何将在世界杯期间爆发?

又到了四年一度的球迷狂欢节&#xff0c;本次卡塔尔世界杯已于11月21号举行。 每当世界杯来临&#xff0c;与世界杯相关产业都会迎来一波爆发&#xff0c;毕竟这个千亿美金市值的市场暗藏着无数的机会。而自GameFi的火热开始&#xff0c;世界杯也成为了加密投资者的狂欢日&…

pytorch的buffer学习整理

pytorch模型中的buffer 这段时间忙于做项目&#xff0c;但是在项目中一直在模型构建中遇到buffer数据&#xff0c;所以花点时间整理下模型中的parameter和buffer数据的区别&#x1f495; 1.torch.nn.Module.named_buffers(prefix‘‘, recurseTrue) 贴上pytorch官网对其的说…

分布式文件系统HDFS实践及原理详解part3

HDFS原理 说明&#xff1a;3.5开头目录是因为和上篇文章内容同属一章&#xff0c;所以开头使用了3.5 3.5 HDFS核心设计 3.5.1 心跳机制 1、 Hadoop 是 Master/Slave 结构&#xff0c;Master 中有 NameNode 和 ResourceManager&#xff0c;Slave 中有 Datanode 和 NodeManag…

异构网络小入

A Survey of Heterogeneous Information Network Analysis Heterogeneous Graph Attention Network 异构网络很火吗&#xff1f; 在一个网络中&#xff0c;不用节点的类型不同&#xff0c;这是肯定的。 所以&#xff0c;异构网络在表征比较复杂的情形时&#xff0c;是比较合适…

基于图像识别的小车智能寻迹控制系统

目录 摘要…… I Abstract II 基于图像识别的智能寻迹控制系统设计 I Design of Intelligent tracking Control system based on Image recognition II 目录 III 第1章 绪论 1 1.1 课题背景 1 1.1 国内外文献综述 1 1.2 论文研究内容 2 第2章 基于图像识别的智能寻迹控制系统方…

【安装Ubuntu18.04遇到的问题】未找到WIFI适配器

大家好&#xff0c;我是小政。好久没有更新文章&#xff0c;近期开始陆续分享一些研究生阶段正在学习的知识和遇到的一些问题。 联想拯救者Y9000P关于安装Ubuntu未找到WIFI适配器的解决方法1.Ubuntu18.042.网卡信息3.解决方法&#xff08;1&#xff09;用手机USB连接电脑提供网…

动态规划--树型dp

6个题1. 树的最长路径2.树的中点.由于第三题需要用到一些数学地知识&#xff0c;所以先去补一补数学知识。连接链接在这里4.二叉苹果树5.战略游戏6.皇宫守卫1. 树的最长路径 定义&#xff1a;树中两个点直接的最远距离称为树的直径 先说一个结论 先任意找到一个树中一个点u&am…

分布式协调系统ZooKeeper实践与原理剖析

基础的一些知识&#xff0c;高阶知识后续看看补充 第一章 ZooKeeper概述 1.1 介绍 What is ZooKeeper&#xff1f; Apache ZooKeeper is an effort to develop and maintain an open-source server which enables highly reliable distributed coordination ZooKeeper is…

大学生静态HTML网页设计--公司官网首页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制 HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结构 CSS&#xf…

SpringIoc依赖查找-5

1. 依赖查找的今世前生: Spring IoC容器从Java标准中学到了什么? 单一类型依赖查找 JNDI - javax.naming.Context#lookup(javax.naming.Name) JavaBeans - java.beans.beancontext.BeanContext 集合类型依赖查找 java.beans.beancontext.BeanContext 集合查找方法 层…