一天学完Servlet!!!(万字总结)
文章目录
- 前言
- Servlet打印Hello Servlet
- Servlet生命周期
- HttpServletRequest对象
- 常用api方法
- 请求乱码问题
- 请求转发
- request域对象
- HttpServletResponse对象
- 响应数据
- 响应乱码问题
- 请求重定向
- 请求转发与重定向区别
- Cookie对象
- Cookie的创建与获取
- Cookie设置到期时间
- Cookie注意点
- Cookie的路径
- HttpSession对象
- Session对象获取和常用Api
- 标识符JSESSIONID
- session域对象
- session对象的销毁
- ServletContext对象
- 常用aip
- ServletContext域对象
- Servlet三大域对象总结
- Servlet文件上传
- 前端页面实现
- 后台代码实现
- Servlet文件下载
- 超链接下载
- 后台代码下载
前言
虽然Servlet现在已经不会直接用于开发了,但是作为SpringMVC的前置知识,还是需要全面了解一下的,故做此文,用于总结。
Servlet打印Hello Servlet
1、前置配置
下载Tomcat :
Tomcat下载连接
idea2022 创建Servlet项目流程:
public class Servlet01 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//打印内容在控制台System.out.println("hello servlet");//通过流输出到浏览器resp.getWriter().write("Hello Servlet!!!");}
}
运行效果:
浏览器:
控制台:
Servlet生命周期
生命周期简单来说,分为3步,
初始化(init()) ==> 调用方法(service()) ==>销毁方法(destroy())
放到代码中来看:
@WebServlet("/ser02")
public class servlet02 extends HttpServlet {private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");/*** 系统方法,服务器自动调用,只执行一次* @throws ServletException*/@Overridepublic void init() throws ServletException {System.out.println("Servlet被创建了..." + formatter.format(new Date(System.currentTimeMillis())));}/*** 每次调用都会执行* @param req* @param resp* @throws ServletException* @throws IOException*/@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Servlet被调用了..." + formatter.format(new Date(System.currentTimeMillis())));}/*** 系统方法,服务器自动调用,只执行一次*/@Overridepublic void destroy() {System.out.println("Servlet被销毁了..." + formatter.format(new Date(System.currentTimeMillis())));}
}
运行结果:
从图中可以看出,不管浏览器访问调用多少次,初始化和销毁方法只会执行一次,但是Service在每次访问都会执行。
HttpServletRequest对象
简单来讲,HttpServletRequest就是封装用户传过来的请求信息,对象由Tomcat封装好传过来,同时该对象是一个接口。service() 方法中传递的HttpServletRequest对象是该接口的实例化对象。
常用api方法
@WebServlet("/ser01")
public class Servlet01 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1. 完整的请求urlString url = req.getRequestURL().toString();System.out.println("获取客户端请求的完整url: " + url);// 2. 部分url(站点名开始,到?前面结束)String uri = req.getRequestURI();System.out.println("客户端请求的部分url: " + uri);// 3. 获取请求行中的参数部分String queryString = req.getQueryString();System.out.println("获取请求行中的参数部分: " + queryString);// 4. 获取客户端请求方式String method = req.getMethod();System.out.println("获取客户端的请求方式: " + method);// 5. 获取http版本号String protocol = req.getProtocol();System.out.println("http版本号为: " + protocol);// 6. 获取webapp名字String contextPath = req.getContextPath();System.out.println("webapp名字为: " + contextPath);// 7. 获取请求参数// (1)、获取指定名称参数String username = req.getParameter("username");String pwd = req.getParameter("pwd");System.out.println("username: " + username + " pwd: " + pwd);// (2)、获取指定名称参数的所有值String[] hobbys = req.getParameterValues("hobby");System.out.println("hobbys: " + Arrays.toString(hobbys));if(hobbys != null && hobbys.length > 0) {for (String hobby : hobbys) {System.out.println("爱好: " + hobby);}}}
}
请求url:
http://localhost:8080/s01/ser01?username=suxuchao&pwd=123456&hobby=sing&hobby=dance&hobby=computer
运行结果:
获取客户端请求的完整url: http://localhost:8080/s01/ser01
客户端请求的部分url: /s01/ser01
获取请求行中的参数部分: username=suxuchao&pwd=123456&hobby=sing&hobby=dance&hobby=computer
获取客户端的请求方式: GET
http版本号为: HTTP/1.1
webapp名字为: /s01
username: suxuchao pwd: 123456
hobbys: [sing, dance, computer]
爱好: sing
爱好: dance
爱好: computer
请求乱码问题
在Tomcat8以上,GET请求有中文的话不会出现乱码,但是使用POST请求就会出现乱码,如下:
代码:
@WebServlet("/ser03")
public class Servlet03 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取客户端传递的参数String username = req.getParameter("username");String pwd = req.getParameter("pwd");String method = req.getMethod();System.out.println("请求方法为: " + method);System.out.println("username: " + username);System.out.println("pwd: " + pwd);}
}
浏览器输入:
运行结果:
请求方法为: POST
username: å¼ ä¸‰
pwd: å¼ ä¸‰
解决方法:
首先我们需要知道,乱码是因为在解析过程中,request默认使用的编码是ISO-8859-1 (此编码不支持中文),所以解析一定会有乱码
//设置编码req.setCharacterEncoding("UTF-8");
将该代码放在方法一开始,即可解决中文乱码问题
更正后结果:
请求方法为: POST
username: 张三
pwd: 张三
请求转发
请求转发有几个特点
- 服务端行为
- 地址栏的url不发生变化
- 从始至终只有一个请求
- request数据可以共享
- 代码中getRequestDispatcher只能转发一次
请求url:
http://localhost:8080/s01/ser03?username=张三
Servlet3代码:
String username = req.getParameter("username");System.out.println("Servlet03: " + username);//请求转发跳转到Servlet04req.getRequestDispatcher("ser04").forward(req, resp);
Servlet4代码:
// 接收客户端请求的参数String username = req.getParameter("username");System.out.println("Servlet04: " + username);
运行结果:
Servlet03: 张三
Servlet04: 张三
同时,重定向可以重定向.html/.jsp文件等页面:
req.getRequestDispatcher("login.jsp").forward(req, resp);
request域对象
request域对象中的数据在一次请求中有效,经过请求转发,request域中的数据仍然存在,在请求转发过程中可以通过request来传输/共享数据。
Servlet05代码:
System.out.println("Servlet05...");//设置域对象内容req.setAttribute("name", "admin");req.setAttribute("age", 18);List<String> list = new ArrayList<>();list.add("aaa");list.add("bbb");req.setAttribute("list", list);req.getRequestDispatcher("ser06").forward(req, resp);
Servlet06代码:
System.out.println("Servlet06...");//获取域对象内容String name = (String) req.getAttribute("name");Integer age = (Integer) req.getAttribute("age");List<String> list = (List<String>) req.getAttribute("list");System.out.println("name: " + name);System.out.println("age: " + age);System.out.println("list: " + Arrays.toString(list.toArray()));
请求url:
http://localhost:8080/s01/ser05
访问结果:
Servlet05...
Servlet06...
name: admin
age: 18
list: [aaa, bbb]
HttpServletResponse对象
简单来讲,HttpServletResponse就是封装服务器处理后,要响应给客户端的数据,封装的数据有 (发送数据,发送响应头,发送响应状态码) 的方法。service() 方法中传递的HttpServletResponse对象是该接口的实例化对象
响应数据
使用字符流:
// 获取字符输出流PrintWriter writer = resp.getWriter();// 输出数据writer.write("Hello");
使用字节流:
//字节输出流ServletOutputStream outputStream = resp.getOutputStream();outputStream.write("Hi".getBytes());
注意:
两个流只能选择一个来用,否则就会报错。
响应乱码问题
s02代码:
PrintWriter writer = resp.getWriter();writer.write("<h2>你好</h2>");
s03代码:
ServletOutputStream os = resp.getOutputStream();os.write("<h2>你好</h2>".getBytes("UTF-8"));
运行结果:
<h2>??</h2>
<h2>浣犲ソ</h2>
解决方式:
在代码最开头添加一行这个代码,类比request的解决方法
resp.setCharacterEncoding("UTF-8");
但是我们发现此时两种输出流打印的结果最后都变成了相同的乱码,如下:
<h2>浣犲ソ</h2>
这是因为我们只设置了服务端的编码,request请求数据只在服务端之间传递,因此这样设置可以解决问题,但是response格式的话,我们不但要设置服务端,还有设置客户端的编码,解决方法如下:
// 设置服务端的编码resp.setCharacterEncoding("UTF-8");// 设置客户端的编码resp.setHeader("content-type", "text/html;charset=UTF-8");
或者更简单的解决方法
//同时设置编码resp.setContentType("text/html;charset=UTF-8");
这样就可以解决乱码和无法识别html的问题了。
请求重定向
- 重定向是客户端行为,由服务端指导
- 地址栏url会发生改变
- 存在两次请求
- 两次请求的数据不共享
Servlet04代码:
System.out.println("Servlet04....");resp.setContentType("text/html;charset=UTF-8");String username = req.getParameter("username");System.out.println("username: " + username);resp.sendRedirect("s05");
Servlet05代码:
System.out.println("Servlet05....");resp.setContentType("text/html;charset=UTF-8");String username = req.getParameter("username");System.out.println("username: " + username);
第一次请求url:
http://localhost:8080/s01/s04?username=zhangsan
重定向后的url:
http://localhost:8080/s01/s05
打印结果:
Servlet04....
username: zhangsan
Servlet05....
username: null
请求转发与重定向区别
Cookie对象
Cookie就是通过浏览器的一些程序,将只在客户端进行操作的数据,存在cookie中,以此来减轻服务器的压力,例如:记住密码的操作。
cookie就是简单的键值对形式存储,key和value之间用"="连接,不同kv之间用“;” 来分割。
Cookie的创建与获取
创建Cookie对象
// Cookie的创建Cookie cookie = new Cookie("username", "zhangsan");// 发送(响应)Cookie对象resp.addCookie(cookie);
获取Cookie对象:
// 获取Cookie数组Cookie[] cookies = req.getCookies();// 判断Cookie是否为空if(cookies != null && cookies.length > 0) {for (Cookie cookie : cookies) {String name = cookie.getName();String value = cookie.getValue();System.out.println("name: " + name);System.out.println("value: " + value);}}
运行结果:
name: username
value: zhangsan
Cookie设置到期时间
如下:
// 到期时间为负数(浏览器关闭就失效)Cookie cookie1 = new Cookie("username01", "zhangsan");cookie1.setMaxAge(-1);res.addCookie(cookie1);// 到期时间为整数(cookie存在指定时间)Cookie cookie2 = new Cookie("username02", "lisi");cookie2.setMaxAge(30);res.addCookie(cookie2);// 到期时间为0(删除cookie)Cookie cookie3 = new Cookie("username03", "wangwu1");cookie3.setMaxAge(0);res.addCookie(cookie3);
Cookie注意点
-
Cookie只在当前浏览器有用,Cookie无法跨浏览器,且只保存在当前电脑
-
Cookie存中文问题
// 使用URLEncoder进行编码String name = "姓名";String value = "张三";name = URLEncoder.encode(name);value = URLEncoder.encode(value);// 创建Cookie对象Cookie cookie1 = new Cookie(name, value);resp.addCookie(cookie1);//获取CookieCookie[] cookies = req.getCookies();if(cookies != null && cookies.length > 0) {for (Cookie cookie : cookies) {String dname = URLDecoder.decode(cookie.getName());String dvalue = URLDecoder.decode(cookie.getValue());System.out.println("dname: " + dname);System.out.println("dvalue: " + dvalue);}}
存储效果:
- 同名Cookie问题
如果服务端发送重复的Cookie,那么会覆盖原有的Cookie.
- 浏览器存放Cookie的数量
浏览器对于Cookie的存放数量也是有上限的,Cookie存放在浏览器,而且一般由服务端创建和设定,后期结合Session来进行会话追踪。
Cookie的路径
简单总结,如果访问路径中带上了Cookie设置的路径,就可以访问到Cookie,否则就访问不到。
http://localhost:8080/s01/cookie01
对于上述url,
如果Cookie设置如下就可以访问到
cookie.setPath("/");
cookie.setPath("/s01");
cookie.setPath("/s01/cookie01");
如果设置如下就访问不到
cookie.setPath("/s02");
cookie.setPath("/s01/cookie02");
HttpSession对象
- Session 数据本身只存储在服务端
- 客户端仅持有用于查找 Session 的 ID(相当于钥匙)
- 若客户端禁用 Cookie,需通过 URL 参数传递 Session ID
- 每一个Session只在当前浏览器保存,开新浏览器就无法获得当前Session
Session对象获取和常用Api
// 获取Session对象HttpSession session = req.getSession();// 获取Session的会话标识符String id = session.getId();System.out.println(id);// 获取Session的创建时间System.out.println(session.getCreationTime());// 获取最后一次访问时间System.out.println(session.getLastAccessedTime());// 判断是否是新的Session对象System.out.println(session.isNew());
运行结果:
A07655B90CBD6033B4D2F4FCC3C5FBE3
1745488955622
1745488955622
true
标识符JSESSIONID
服务器每次会先检查从客户端传过来数据中有没有JSESSIONID标识符,该标识符存放于cookie,服务器收到JSESSIONID之后会先查看是否含有该值的Session对象,如果没有,则认为这是一次新对话,创建一个新Session对象,如果由,就认为是标志过的会话,返回该Session对象,实现数据共享。
session域对象
整体与request的域对象的api是一样的,但是与request域对象的区别是,Session域对象只要你这次会话没有结束,即浏览器没有和服务器断开,无论开多少个页面都能访问到Session中的数据,request则是只要换了一次请求,就无法共享域对象数据。
// 获取Session域对象HttpSession session = req.getSession();// 设置域对象session.setAttribute("username", "zhangsan");session.setAttribute("pwd", "123456");//移除域对象session.removeAttribute("pwd");//获取域对象String username = (String) session.getAttribute("username");
session对象的销毁
- 默认销毁时间
Tomcat/config/web.xml,在该文件下,默认session在不操作的情况下,存活时间为30min。
<session-config><session-timeout>30</session-timeout></session-config>
- 自己设定销毁时间
HttpSession session = req.getSession();session.setMaxInactiveInterval(15); // 15秒过期
- 立即销毁
session.invalidate();// 立即销毁
- 关闭浏览器失效
Session 底层依赖Cookie来实现,而Cookie存在浏览器内存中,因此关闭浏览器导致Cookie失效,也会导致Session失效。
ServletContext对象
- 每个web程序,有且仅有一个Servlet Context对象,又称Application对象,在WEB程序启动后,一般会创建一个对应的ServletContext对象。
- 对象中保存了当前服务器的信息还有getRealPath获取资源真实路径等。
常用aip
代码:
// 获取servletContext对象
// (1)、通过request对象获取
ServletContext servletContext1 = req.getServletContext();
// (2)、通过Session对象获取
ServletContext servletContext2 = req.getSession().getServletContext();
// (3)、通过ServletConfig对象获取
ServletConfig servletConfig = getServletConfig();
ServletContext servletContext3 = servletConfig.getServletContext();
// (4)、直接获取
ServletContext servletContext4 = getServletContext();//常用方法
//1. 获取当前服务器的版本信息
String serverInfo = req.getServletContext().getServerInfo();
System.out.println("获取当前服务器的版本信息: " + serverInfo);
//2. 获取当前项目真实路径
String realPath = req.getServletContext().getRealPath("/");
System.out.println(" 获取当前服务器的真实路径: " + realPath);
运行结果:
获取当前服务器的版本信息: Apache Tomcat/8.5.47
获取当前服务器的真实路径: D:\code_study\servlet01\target\servlet01-1.0-SNAPSHOT\
ServletContext域对象
该域对象数据不建议存过多数据,因为如果不手动移除,服务器启动后会一直存在。
ServletContext servletContext = req.getServletContext();
// 设置域对象
servletContext.setAttribute("name", "zhangsan");
// 获取域对象
String name = (String) servletContext.getAttribute("name");
// 移除域对象
System.out.println("name = " + name);
servletContext.removeAttribute("name");
Servlet三大域对象总结
- request域对象
在一次request请求中生效。 - Session域对象
在一次会话中生效。 - ServletContext域对象
在服务器启动期间一直生效,除非重启服务器。
Servlet文件上传
前端页面实现
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>文件上传</title>
</head>
<body>
<!--文件上传1.准备表单2.设置表单的提交类型3.设置表单类型问文件上传表单 enctype="multipart/form-data"4.设置文件提交的地址5.准备表单元素1. 普通的表单项 type="text"2. 文件项 type="file"
-->
<form method="post" enctype="multipart/form-data" action="uploadServlet">姓名: <input type="text" name="username"> <br>文件: <input type="file" name="myfile"> <br><button>提交</button>
</form>
</body>
</html>
后台代码实现
@WebServlet("/uploadServlet")
@MultipartConfig //文件上传表单一定要加这个注释
public class uploadServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("文件上传....");// 设置请求编码格式req.setCharacterEncoding("UTF-8");// 获取普通表单项String username = req.getParameter("username");System.out.println("username: " + username);// 获取Part对象(Serlet将mutipart/form-data的POST请求封装成Part对象)Part part = req.getPart("myfile");// 通过part对象得到上传的文件名String fileName = part.getSubmittedFileName();System.out.println("上传文件名: " + fileName);String realPath = req.getServletContext().getRealPath("/");System.out.println("文件存放路径: " + realPath);// 上传文件到指定目录part.write(realPath + "/" + fileName);}
}
最后文件上传的路径可以改成你想要指定的。
注意:上传文件一定要加@MultipartConfig 注解,否则文件无法上传成功
Servlet文件下载
就是将浏览器上的文件下载到本地
超链接下载
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>文件下载</title>
</head>
<body><!--浏览器可识别的文件可以直接浏览器中查看,不可识别的文件需要先浏览器下载。--><!--浏览器可以识别的资源--><a href="download/hello.txt">文本文件</a><a href="download/ai.jpg">图片文件</a><!--浏览器不可以识别的资源--><a href="download/yasuo.zip">压缩文件</a><hr><!--添加了download属性,可以直接在浏览器中下载对应文件--><a href="download/hello.txt" download>文本文件</a><a href="download/ai.jpg" download="ai.jpg">图片文件</a>
</body>
</html>
后台代码下载
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("文件下载开始....");// 1. 设置请求的编码req.setCharacterEncoding("UTF-8");// 2. 获取参数String fileName = req.getParameter("fileName");// 3. 参数的非空判断if(fileName == null || "".equals(fileName.trim())) {resp.setContentType("text/html;charset=utf-8");resp.getWriter().write("请输入要下载的文件名");resp.getWriter().close();return;}// 得到图片存放的路径String path = req.getServletContext().getRealPath("/download/");// 通过路径得到file对象File file = new File(path + fileName);// 判断文件对象是否存在if(file.exists() && file.isFile()) {// 设置相应类型(浏览器无法处理或激活某个程序来处理的MIME类型)resp.setContentType("application/x-msdownload");// 设置响应头resp.setHeader("content-Disposition", "attachment;filename" + fileName);// 得到file文件输入流InputStream is = new FileInputStream(file);// 得到字节输出流ServletOutputStream os = resp.getOutputStream();// 定义字节数组byte[] bytes = new byte[1024];//定义长度int len = 0;// 循环输出while((len = is.read(bytes)) != -1) {// 输出os.write(bytes, 0, len);}// 关闭资源os.close();is.close();} else {resp.getWriter().write("文件不存在,请重试!");resp.getWriter().close();}}
}
至此,Servlet基本流程就学习结束。
相关文章:

一天学完Servlet!!!(万字总结)
文章目录 前言Servlet打印Hello ServletServlet生命周期 HttpServletRequest对象常用api方法请求乱码问题请求转发request域对象 HttpServletResponse对象响应数据响应乱码问题请求重定向请求转发与重定向区别 Cookie对象Cookie的创建与获取Cookie设置到期时间Cookie注意点Cook…...

E3650工具链生态再增强,IAR全面支持芯驰科技新一代旗舰智控MCU
近日,全球嵌入式软件开发解决方案领导者IAR与全场景智能车芯引领者芯驰科技正式宣布,IAR Embedded Workbench for Arm已全面支持芯驰E3650,为这一旗舰智控MCU提供开发和调试一站式服务,进一步丰富芯驰E3系列智控芯片工具链生态&am…...
Spring Boot Controller 单元测试撰写
文章目录 引言标准用法必需依赖项核心注解说明代码示例 当涉及静态方法时的测试策略必需依赖项核心注解说明代码示例 引言 之前在编写 Controller 层的单元测试时,我一直使用 SpringBootTest 注解,但它会加载整个 Spring 应用上下文,资源开销…...
TypeScripts前端基础篇(4)--- 如何定义泛型?
在 TypeScript 中,泛型(Generics)是语言内置的功能,不需要额外下载或安装任何东西;泛型(Generics)允许你创建可重用的组件,这些组件可以支持多种类型。现在给出的两个例子展示了不同的用法&…...
在深度学习中FLOPs和GFLOPs的含义及区别
在深度学习中,FLOPs和GFLOPs是衡量计算性能的关键指标,但两者的定义和应用场景不同: 1. 定义与区别 • FLOPs(Floating-point Operations) 表示模型或算法执行时所需的浮点运算总次数,用于衡量模型的计算复…...

MSSQL-数据库还原报错-‘32(另一个程序正在使用此文件,进程无法访问。)‘
这里是引用 标题: Microsoft SQL Server Management Studio 还原 对于 服务器“<<服务器名称>>”失败。 (Microsoft.SqlServer.SmoExtended) 有关帮助信息,请单击: http://go.microsoft.com/fwlink?ProdNameMicrosoftSQLServer&ProdVer12.0.2000.8…...

卷积神经网络:视觉炼金术士的数学魔法
引言:当数学遇见视觉炼金术 在人工智能的奇幻世界里,卷积神经网络(CNN)犹如掌握视觉奥秘的炼金术士,将原始像素的"铅块"淬炼成认知的"黄金"。这种融合数学严谨性与生物灵感的算法架构,…...

立马耀:通过阿里云 Serverless Spark 和 Milvus 构建高效向量检索系统,驱动个性化推荐业务
作者:厦门立马耀网络科技有限公司大数据开发工程师 陈宏毅 背景介绍 行业 蝉选是蝉妈妈出品的达人选品服务平台。蝉选秉持“陪伴达人赚到钱”的品牌使命,致力于洞悉达人变现需求和痛点,提供达人选高佣、稳变现、速响应的选品服务。 业务特…...
青少年编程与数学 02-018 C++数据结构与算法 07课题、堆
青少年编程与数学 02-018 C数据结构与算法 07课题、堆 一、堆1. 定义2. 堆的存储方式3. 堆的常见操作4. 堆的应用 二、最大堆的实现1. 堆的存储2. 基本操作3. C代码实现4. 代码说明5. 示例输出 三、最小堆的实现四、建堆操作1. 建堆操作的原理2. 为什么从最后一个非叶子节点开始…...
机器学习特征工程中的数值分箱技术:原理、方法与实例解析
标题:机器学习特征工程中的数值分箱技术:原理、方法与实例解析 摘要: 分箱技术作为机器学习特征工程中的关键环节,通过将数值数据划分为离散区间,能够有效提升模型对非线性关系的捕捉能力,同时增强模型对异…...
安装Github软件详细流程,win10系统从配置git到安装软件详解,以及github软件整合包制作方法(
win10系统部署安装开源ai必备 一、安装git应用程序(用来下来github软件) 官网下载git的exe可执行文件,Git - Downloads 或者这里下夸克网盘分享 运行git应用程序,一路’Next’到底即可。 配置安装路径 此时如果直接运行git命…...

专业热度低,25西电光电工程学院(考研录取情况)
1、光电工程学院各个方向 2、光电工程学院近三年复试分数线对比 学长、学姐分析 由表可看出: 1、光学工程25年相较于24年下降20分, 2、光电信息与工程(专硕)25年相较于24年上升15分 3、25vs24推免/统招人数对比 学长、学姐分析…...

java—11 Redis
目录 一、Redis概述 二、Redis类型及编码 三、Redis对象的编码 1. 类型&编码的对应关系 2. string类型常用命令 (1)string类型内部实现——int编码 (2)string类型内部实现——embstr编码 编辑 (3&#x…...
C语言编程--14.电话号码的字母组合
题目: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits “23” …...

热门算法面试题第19天|Leetcode39. 组合总和40.组合总和II131.分割回文串
39. 组合总和 力扣题目链接(opens new window) 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明: 所有数字(包括 ta…...
OpenCv高阶(十一)——物体跟踪
文章目录 前言一、OpenCV 中的物体跟踪算法1、均值漂移(Mean Shift):2、CamShift:3、KCF(Kernelized Correlation Filters):4、MIL(Multiple Instance Learning)…...

2194出差-节点开销Bellman-ford/图论
题目网址: 蓝桥账户中心 我先用Floyd跑了一遍,不出所料TLE了 n,mmap(int,input().split())clist(map(int,input().split()))INFfloat(inf) ma[[INF]*n for i in range(n)]for i in range(m):u,v,wmap(int,input().split())ma[u-1][v-1]wma[v-1][u-1]w#“…...

Docker安装beef-xss
新版的kali系统中安装了beef-xss会因为环境问题而无法启动,可以使用Docker来安装beef-xss,节省很多时间。 安装步骤 1.启动kali虚拟机,打开终端,切换到root用户,然后执行下面的命令下载beef的docker镜像 wget https:…...
产品经理学习过程
一:扫盲篇(初始产品经理) 阶段1:了解产品经理 了解产品经理是做什么的、产品经理的分类、产品经理在实际工作中都会接触什么样的岗位、以及产品经理在实际工作中具体要做什么事情。 二:准备篇 阶段2:工…...

时间序列-数据窗口进行多步预测
在时间序列预测领域,多步预测旨在基于历史数据预测未来多个时间点的值,而创建数据窗口是实现这一目标的常用且高效的技术手段。数据窗口技术的核心是通过滑动窗口机制构建训练数据集,其核心逻辑可概括为:利用历史时间步的序列模式…...
【系统架构设计师】嵌入式微处理器
目录 1. 说明2. 微处理器(MPU)3. 微控制器(MCU)4. 信号处理器(DSP)5. 图形处理器(GPU)6. 片上系统(SoC)7. 例题7.1 例题1 1. 说明 1.嵌入式微处理器主要用于处理相关任务。2.由于嵌入式系统通常都在室外使用,可能处于不同环境,因此,选择处理…...
Oracle创建触发器实例
一 创建DML 触发器 DML触发器基本要点: 触发时机:指定触发器的触发时间。如果指定为BEFORE,则表示在执行DML操作之前触发,以便防止某些错误操作发生或实现某些业务规则;如果指定为AFTER,则表示在执行DML操作…...

(三)mac中Grafana监控Linux上的Redis(Redis_exporter安装使用)
框架:GrafanaPrometheusRedis_exporter Grafana安装-CSDN博客 普罗米修斯Prometheus监控安装(mac)-CSDN博客 1.Redis_exporter安装 直接下载 wget https://github.com/oliver006/redis_exporter/releases/download/v1.0.3/redis_expor…...

Linux Sed 深度解析:从日志清洗到 K8s 等12个高频场景
看图猜诗,你有任何想法都可以在评论区留言哦~ 摘要:Sed(Stream Editor)作为 Linux 三剑客之一,凭借其流式处理与正则表达式能力,成为运维场景中文本批处理的核心工具。本文聚焦生产环境高频需求ÿ…...

基于java的网络编程入门
1. 什么是IP地址 由此可见,32位最大为255.255.255.255 打开cmd查询自己电脑的ip地址:ipconfig 测试网络是否通畅:ping 目标ip地址 2. IP地址的组成 注意:127.0.0.1是回送地址,指本地机,一般用来测试使用 …...
CV和NLP领域常见模型列表
图像分类(Image Classification) 模型名特点备注ConvNeXt V2卷积改进,媲美 Transformer强于 ResNet、EfficientNetVision Transformer (ViT)全 Transformer 架构开创图像 transformer 浪潮Swin Transformer V2局部注意力 金字塔结构更强的多…...

Git简介与入门
Git的发明 Git由著名的Linux创始人linus于2005年发明(所以git的界面、使用方式与Linux挺像的,即命令行方式) 经过发展,现在广泛应用于代码管理与团队协作。 Git特性 Git是分布式版本控制系统 分布式 每个开发者拥有完整仓库&…...

Linux 网络基础三 (数据链路层协议:以太网协议、ARP 协议)
一、以太网 两个不同局域网的主机传递数据并不是直接传递的,而是通过路由器 “一跳一跳” 的传递过去。 跨网络传输的本质:由无数个局域网(子网)转发的结果。 所以,要理解数据跨网络转发原理就要先理解一个局域网中数…...

16.QT-Qt窗口-菜单栏|创建菜单栏|添加菜单|创建菜单项|添加分割线|添加快捷键|子菜单|图标|内存泄漏(C++)
Qt窗⼝是通过QMainWindow类来实现的。 QMainWindow是⼀个为⽤⼾提供主窗⼝程序的类,继承⾃QWidget类,并且提供了⼀个预定义的布局。QMainWindow包含⼀个菜单栏(menu bar)、多个⼯具栏(tool bars)、多个浮动窗⼝(铆接部…...

[特殊字符] 分布式定时任务调度实战:XXL-JOB工作原理与路由策略详解
在微服务架构中,定时任务往往面临多实例重复执行、任务冲突等挑战。为了解决这一问题,企业级调度框架 XXL-JOB 提供了强大的任务统一调度与执行机制,特别适合在分布式系统中使用。 本文将从 XXL-JOB 的核心架构入手,详细讲解其调…...