【JavaEE】_Servlet API
目录
1. HttpServlet
1.1 init方法
1.2 destroy方法
1.3 service方法
1.4 Servlet的生命周期
1.5 代码示例
1.5.1 使用postman构造请求
1.5.2 使用ajax构造请求
2. HttpServletRequest
2.1 核心方法
2.2 代码示例1:打印请求信息
3. 前端给后端传参
3.1 通过GET的query string
3.2 通过POST,借助form表单
3.3 通过POST,使用json格式构造body
4. HttpServletResponse
[便捷起见,非必要时Servlet程序均以smart tomcat方式部署程序]
Servlet有3个重要类,分别为HttpServlet,HttpServletRequest,HttpServletResponse;
1. HttpServlet
编写Servlet程序第一步就是创建一个类继承自HttpServlet类并重写其doGet方法;
其核心方法有:
| 方法名称 | 调用时机 |
| init | 在HttpServlet实例化之后被调用一次 |
| destroy | 在HttpServlet实例不再使用的时候调用一次 |
| service | 收到HTTP请求的时候调用 |
| doGet | 收到GET请求时调用(由service方法调用) |
| doPost | 收到POST请求时调用(由service方法调用) |
| doPut/doDelete/do Options/... | 收到其他请求时调用(由service方法调用) |
1.1 init方法
1. 不由程序员手动调用,由tomcat自动调用;
2. 当tomcat首次收到了和该类相关联的请求时,才会进行实例化:
以上一篇用Servlet的hello world程序为例:

WebServlet注解就是将/hello类和HelloServlet类绑定在一起,表示:
如果Tomcat收到了/hello这样路径的请求,就会调用HelloServlet,于是就对HelloServlet进行实例化;
实例化只进行一次,后续再收到/hello,就不必再重复实例化了,直接复用之前的HelloServlet实例即可;
3. 可以重写init方法,插入一些我们自己的初始化的逻辑:
运行以下代码:
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {@Overridepublic void init() throws ServletException {// 重写init方法System.out.println("init");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 把数据显示在服务器控制台System.out.println("Hello world");
// 把数据写回浏览器resp.getWriter().write("Hello world");}
}
(1)运行程序,仅启动服务器时,在控制台并未打印init:
原因:只有当请求关联到hello路径时才会打印;
(2)在浏览器中打开页面,即触发了请求,此时服务器的日志上就会调用init进行实例化:

(3)多次刷新页面,即多次发送请求:

doGet方法多次被调用,而init方法仅被调用一次;
4. 也可以通过修改web.xml配置让tomcat启动时立即实例化该servlet;
5. servlet是服务器上运行的代码,只要服务器不重新启动,init就不会再执行;
1.2 destroy方法
1. 可以使用destroy方法进行一些清理工作;
2. 只要服务器在运行,都有可能再使用,服务器终止时就不可再使用了;
3. 重写destroy方法:
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {@Overridepublic void init() throws ServletException {// 重写init方法System.out.println("init");}@Overridepublic void destroy() {
// 重写destroy方法System.out.println("destroy");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 把数据显示在服务器控制台System.out.println("Hello world");
// 把数据写回浏览器resp.getWriter().write("Hello world");}
}
启动服务器并刷新页面后,点击停止后,可见服务器日志调用了destroy方法:

注:但此处的destroy方法是否能被执行到并不确定:
第一种情况:如果是使用smart tomcat的停止按钮终止程序,这个操作本质上是通过tomcat的8005端口来主动停止,可以触发destroy方法;
第二种情况:如果是直接杀进程,此时可能就来不及执行destroy方法;
故而并不推荐使用destroy方法;
1.3 service方法
当收到路径匹配的HTTP请求就会触发service方法,
比如doGet方法就是在service方法中调用的:
父类HttpServlet有一个service方法,其内部就会调用doGet方法;
1.4 Servlet的生命周期
开始时,执行 init;
每次收到请求,执行 service;
销毁前执行 destroy;

注:一个servlet程序包含很多个servlet,某个servlet的生死,不影响整个sevlet程序;
1.5 代码示例
在java目录下再创建一个类:MethodServlet;
其内容如下:
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("/method")
public class MethodServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doGet");resp.getWriter().write("doGet");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doPost");resp.getWriter().write("doPost");}@Overrideprotected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doPut");resp.getWriter().write("doPut");}@Overrideprotected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doDelete");resp.getWriter().write("doDelete");}
}
直接在浏览器输入地址访问,只能发送GET请求,其他请求类型可以通过ajax或postman进行构造。
1.5.1 使用postman构造请求

基于一次浏览器地址访问后(即已构造一个GET请求),使用postman依次构造:GET,POST,PUT,DELETE请求并发送,再查看服务器日志:

1.5.2 使用ajax构造请求
1. 在IDEA中创建.html文件:

tomcat要求:.html文件设置在webapp目录下,与WEB-INF同级;
可以使用vscode进行编写:

用vscode打开即可;
2. 编写代码:
<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head>
<body><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script>$.ajax({type:'get',url:'method',// 此处url为相对路径,此时基准路径为当前html所在的路径:127.0.0.1:8080/hello_servletsuccess:function(body, status){console.log(body);}})</script>
</body>
</html>
在浏览器输入地址:

按f12进入chrome的console标签页:

同样在服务器日志也可见:

3. 依次修改请求类型为post,put,delete,再运行,即可得到不同的结果:

注:使用ajax构造HTTP请求的注意点:
(1)html文件的位置:webapp下,与WEB-INF同级;
(2)在html文件中使用ajax构造HTTP请求时的url可以写为相对路径,该相对路径的基准路径就是当前html文件的路径,在此例中为:127.0.0.1:8080/hello_servlet;
也可以写为绝对路径:(浏览器要求:以 / 开头的为绝对路径)
$.ajax({type:'get',url:'/hello_servlet/method',success:function(body, status){console.log(body);}})
(3)注意@WebServlet注解的路径必须 / 开头,此处的含义不是绝对路径,而是servlet的要求;
2. HttpServletRequest
HttpServletRequest表示一个HTTP请求,这个对象是tomcat自动构造的,
tomcat其实会自动监听端口,接受连接,读取请求,解析请求,构造请求对象等一系列工作;
2.1 核心方法
| 方法 | 描述 |
| String getProtocal() | 返回请求协议的名称和版本 |
| String getMethod() | 返回请求的HTTP方法的名称,如GET、POST或PUT |
| String getQequestURI() | 从协议名称直到HTTP请求的第一行的查询字符串中,返回该请求的URL的一部分 |
| String getContexPath() | 返回指示请求上下文的请求URI部分 |
| String getQueryString() | 返回包含在路径后的请求URL中的查询字符串(?后的参数) |
| Enumeration getParameterNames() | 返回一个String对象的枚举,包含在该请求中包含的参数的名称 |
| String getParameter(String name) | 以字符串形式返回请求参数的值,或者如果参数不存在则返回null |
| String[] getParameterValues(String name) | 返回一个字符串对象的数组,包含所有给定的请求参数的值,如果参数不存在则返回null |
| Enumeration getHeaderNames() | 返回一个枚举,包含在该请求中包含的所有头名 |
| String getHeader(String name) | 以字符串形式返回指定的请求头的值 |
| String getCharacter Encoding() | 返回请求主题中使用的字符编码的名称 |
| String getContentType() | 返回请求主题的MIME类型,如果不知道类型则返回null |
| int getContentLength() | 以字节为单位返回请求主体的长度,并提供输入流,或者如果长度未知则返回-1 |
| InputStream getInputStream() | 用于读取请求的body内容,返回一个InputStream对象 |
注:(1)query string是键值对结构,此处可以通过getParameter方法来根据key获取到value;
(2)InputStream就是输入流对象,进行read操作即可把body数据读取出来;
2.2 代码示例1:打印请求信息
基于hello_servlet项目,创建一个ShowRequestServlet.java文件,其内容如下:
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 ShowRequestServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 设置响应的content-type,即表明body里的数据格式是何种类型resp.setContentType("text/html");// 创建一个StringBuilder,把这些api的结果拼起来统一写回响应中StringBuilder stringBuilder = new StringBuilder();stringBuilder.append(req.getProtocol());stringBuilder.append("<br>");stringBuilder.append(req.getMethod());stringBuilder.append("<br>");stringBuilder.append(req.getRequestURI());stringBuilder.append("<br>");stringBuilder.append(req.getContextPath());stringBuilder.append("<br>");stringBuilder.append(req.getQueryString());stringBuilder.append("<br>");stringBuilder.append("<br>");stringBuilder.append("<br>");// 获取到header中的所有键值对Enumeration<String> headerNames = req.getHeaderNames();while(headerNames.hasMoreElements()){String headerName = headerNames.nextElement();stringBuilder.append(headerName+" : "+req.getHeader(headerName));stringBuilder.append("<br>");}resp.getWriter().write(stringBuilder.toString());}
}
运行后根据url打开页面:

注:(1)此处实现html页面的换行操作不能使用\n,而使用<br>标签,同时设置响应的content-type为text/html,告诉浏览器,响应的body里的数据格式是何种类型;
(2)按照没有添加query string时,默认响应为null,比如增加query string 为a=10&b=20,响应的query string便为a=10&b=20;
3. 前端给后端传参
3.1 通过GET的query string
(1)前端:test.html:
<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head>
<body><form action="postParameter" method="post"><input type="text" name="studentId"><input type="text" name="classId"><input type="submit" value="提交"></form><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script></script>
</body>
</html>
(2)后端:GetParameterServlet.java:
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 {// 预期浏览器会发一个形如 /getParameter?studentId=001&classId=2001;// 借助req的getParameter方法就能拿到query string 中的键值对内容了// getParameter得到的是一个String类型的值String studentId = req.getParameter("studentId");String classId = req.getParameter("classId");resp.setContentType("text/html");resp.getWriter().write("studentId = "+studentId +" classId = "+classId);}
}
运行程序后,根据url打开浏览器页面如下:

注:(1)输入在url后的查询字符串键值对会被Tomcat处理成形如Map这样的结构,后续就可以随时通过key来获取到value了;
(2)如果key在query string中不存在,则返回值为空;
3.2 通过POST,借助form表单
form表单也是键值对形式组织数据的,只是这部分内容在body中;
对于前端是form表单这样格式的数据,后端还是使用paraMeter来获取;
(1)前端:test.html:
<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head>
<body><form action="postParameter" method="post"><input type="text" name="studentId"><input type="text" name="classId"><input type="submit" value="提交"></form><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script></script>
</body>
</html>
(2)后端:PostParameterSrvlet.java:
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("/postParameter")
public class PostParameterServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String studentId = req.getParameter("studentId");String classId = req.getParameter("classId");resp.setContentType("text/html");resp.getWriter().write("studentId = "+studentId+" classId = "+classId);}
}
运行程序后根据url打开浏览器页面:

提交后,页面如下:

注:(1)使用query string和使用form表单的后端代码格式基本相同,都是通过getParameter根据key获取value,只是使用form表单构造的键值对不在query string中,而是在body中;
(2)getParameter方法不仅能获取到请求中query string中的键值对,还可以获取到form表单构造的body中的键值对;
(3)以form表单形式构造并发送的请求一定会触发页面跳转;
(4).html及请求、浏览器页面的对应关系图:

(5)前端后端交互的过程:
图1:

图2:

3.3 通过POST,使用json格式构造body
json也是键值对结构的数据格式,可以把body按照该形式组织;
在前端,可以通过ajax方式构造该内容,也可以使用postman;
(1)postman构造请求:

(2)后端:PostParameter2Sevlet.java
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.io.InputStream;@WebServlet("/postParameter2")
public class PostParameter2Servlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 通过这个方法处理 body 为 json 格式的数据// 直接把 req 对象中的 body 完整地读取出来// 获取请求的body长度并构造数组int length = req.getContentLength();byte[] buffer = new byte[length];InputStream inputStream = req.getInputStream();inputStream.read(buffer);//把这个字节数组构造成 String, 打印出来String body = new String(buffer, 0, length,"utf8");System.out.println("body = "+body);resp.setContentType("text/html");resp.getWriter().write(body);}
}
使用fiddler可以查看到构造的json请求:

当请求到达tomcat后,tomcat就会将其解析为req对象;
在servlet代码中,req.getInputStrea,,读取body内容,又把body的内容构造成一个响应结果返回给浏览器(此例中为postman),在post页面中就有响应结果:

注:(1)使用form表单构造请求传参与json格式请求传参的代码执行流程是类似的,只是传输数据的格式不同,
form表单的格式形如:

json格式形如:

但是当前通过json传递数据,服务器只是将整个body都读出来,没有按照键值对的方式处理,还不能根据key获取到value,可以使用第三方库来解析json的body,如jackson,gson,fastjson,由于spring mvc内置了jackson这个库,故而天然就支持处理jackson的数据。
故而,以引入jackson库为例:
通过maven引入第三方库:

基于jackson库,修改代码使得获取到请求body内部的键值对:
class Student{public int studentId;public int classId;
}
@WebServlet("/postParameter2")
public class PostParameter2Servlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 使用jackson的核心对象:ObjectMapper objectMapper = new ObjectMapper();// readValue就是把一个json格式的字符串转为java对象:Student student = objectMapper.readValue(req.getInputStream(), Student.class);}
}
注意:(1)objectMapper对象的readValue方法的作用:
① 将json格式的字符串读取出来;
② 根据第二个参数类对象创建Student实例,第二个参数是一个类对象;
③ 解析json格式的字符串,处理成map键值对结构;
④ 遍历所有键值对,看键的名字和Student实例的哪个属性名匹配,就把对应的value设置到该属性中;
⑤ 返回该Student实例;
(2)readValue方法用于将json字符串转成java对象,writeValue方法用于把一个java对象转成json格式字符串;
(3)在上文代码中,将Student类内的属性设置为public修饰,这在Java中并不常见。但是如果要把一个类作为jackson返回的对象,就需要让jackson能够看到类中的属性,可以采取的方法有:
① 把属性设置为public;② 给该属性提供public修饰的getter与setter方法;
4. HttpServletResponse
servlet代码种的doXXX方法就是根据请求计算响应后,将响应的数据设置到HttpServletResponse对象中。tomcat就会将这个HttpServletResponse对象按照HTTP协议的格式,转成一个字符串,并通过socket写回给浏览器;
其核心方法有:
| 方法 | 描述 |
| void setStatus(int sc) | 为该响应设置状态码 |
| void setHeader(String name, String value) | 设置一个带有给定的名称和值的header,如果name已经存在,则覆盖旧值 |
| void addHeader(String name, String value) | 添加一个带有给定的名称和值的header,如果name已经存在,不覆盖旧值,并列添加新的键值对 |
| void setContentType(String type) | 设置被发送到客户端的响应的内容类型 |
| void setCharacterEncoding(String charset) | 设置被发送到客户端的响应的字符编码(MIME字符集),例如UTF-8 |
| void sendRedirect(String Location) | 使用指定的重定向URL发送临时重定向响应到客户端 |
| PrintWriter getWriter() | 用于往body中写入文本格式数据 |
| OutputStream getOutputStream() | 用于往body中写入二进制格式数据 |
(1)一个HTTP响应中报头的key是可以存在多个重复的;
(2)可以通过setCharacterEncoding指定响应的编码格式:
浏览器默认不知道程序员的页面编码方式,会采取猜测的方式使用字符集进行解析,比如在getParameterServlet.java中将写回浏览器的响应格式写为:
resp.setContentType("text/html");
resp.getWriter().write("学生id: "+studentId +" 班级id: "+classId);
此时根据路径打开浏览器页面,就会出现乱码:

为了避免这种情况,我们需要在写回响应前,显式指定响应的编码格式字符集:
resp.setContentType("text/html");resp.setCharacterEncoding("utf-8");resp.getWriter().write("学生id: "+studentId +" 班级id: "+classId);
刷新浏览器页面,有:

(3)也可以把字符集和ContentType一起设置:
resp.setContentType("text/html; charset=utf8");resp.getWriter().write("学生id: "+studentId +" 班级id: "+classId);
(4)void sendRedirect用于构造重定向响应,3xxx的状态码就会跳转到另外一个页面:
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.sendRedirect("https://www.sogou.com");}
}
运行代码后,根据路径打开浏览器页面,即可跳转至搜狗主页:

前后端交互逻辑如下:

实现重定向,尤其是返回错误页面有多种方式:

相关文章:
【JavaEE】_Servlet API
目录 1. HttpServlet 1.1 init方法 1.2 destroy方法 1.3 service方法 1.4 Servlet的生命周期 1.5 代码示例 1.5.1 使用postman构造请求 1.5.2 使用ajax构造请求 2. HttpServletRequest 2.1 核心方法 2.2 代码示例1:打印请求信息 3. 前端给后端传参 3.1…...
macOS下matplotlib如何显示中文字体?
一般要显示中文会使用: plt.rcParams[font.sans-serif][SimHei] #用来正常显示中文标签 plt.rcParams[axes.unicode_minus]False #用来正常显示负号不过在macOS下通常会显示方块字: 解决方案: 把上面两句注释掉,更换为…...
7-Zip怎么设置字典大小 单词大小 固实数据大小,把大文件9.35G压缩成小1.56G
环境: Win10 专业版 7-Zip v23.01 问题描述: 7-Zip怎么设置字典大小 单词大小 固实数据大小,把大文件9.28G压缩成小1.56G 解决方案: 要在7-Zip中设置字典大小、单词大小和固实数据大小,可以按照以下步骤进行操作: 打开7-Zip文件管理器,并导航到你要压缩的文件所在的…...
使用CPR库和Python编写程序
以下是一个使用CPR库和Python编写的爬虫程序,用于爬取。此程序使用了proxy的代码。 import requests from cpr import CPR def get_proxy():url "https://www.duoip.cn/get_proxy"headers {"User-Agent": "Mozilla/5.0 (Windows NT …...
axios 请求的缓存封装
前言 咱们的网站或者程序,每一个页面和操作都需要请求后端接口来获取响应和渲染页面,抛开post请求方式的接口不说,部分get请求得到的数据,短时间内不会更新,或者短时间得到的响应数据不会变化,这个时候就可…...
Oracle性能调优实践中的几点心得
很多的时侯,做OracleDBA的我们,当应用管理员向我们通告现在应用很慢、数据库很慢的时侯,我们到数据库时做几个示例的Select也发现同样的问题时,有些时侯我们会无从下手,因为我们认为数据库的各种命种率都是满足Oracle文…...
勒索病毒最新变种.halo勒索病毒来袭,如何恢复受感染的数据?
引言: 在当今数字化时代,勒索病毒的威胁不断升级,其中.halo勒索病毒引起了广泛关注。本文91数据恢复将深入研究.halo勒索病毒的特点,探讨如何有效地恢复被其加密的数据文件,并分享预防这一威胁的关键措施。 .halo勒索…...
大厂秋招真题【前缀和】美团20230826秋招T5-平均数为k的最长连续子数组
文章目录 【前缀和】美团20230826秋招T5-平均数为k的最长连续子数组题目描述与示例题目描述输入描述输出描述示例输入输出说明 解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 【前缀和】美团20230826秋招T5-平均数为k的最长连续子数组 题目描…...
bazel远程构建(Remote Execution) --- linux安装Redis
采用源码安装方式 下载地址:Download | Redis,下载最新稳定版本。 step1: 下载最新稳定版本 wget https://download.redis.io/redis-stable.tar.gz step2: 解压安装 tar -xzvf redis-stable.tar.gz cd redis-stable make 执行完 make 命令后&#…...
Maven在开发中的使用及理解
在JAVA项目中,我们通常需要对项目的构建和依赖进行管理,这个时候我们就需要MAVEN来对项目进行支持。 一.MAVEN构建 在整个MAVEN构建的过程中包含以下环节,也对应IDEA中MAVEN的对应功能。 清理Maven Clean 清理,则代表删除上一…...
2023/10/30-LED灯驱动开发
k1.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include "head.h" char kbuf[128] {}; unsigned int major; //定义三个指针指向映射后的虚拟内…...
华为OD 报文解压缩(100分)【java】B卷
华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...
二、vue基础语法
一、模板语法 1、文本渲染 使用双花括号语法插入文本 <template><div><h3>msg: {{ message }}</h3></div> </template><script> export default {data() {return {message: "输出信息"}} } </script><style s…...
Java —— 程序逻辑控制
目录 1. 顺序结构 2. 分支结构 2.1 if 语句 2.1.1 语法格式1 2.1.2 语法格式2 2.1.3 语法格式3 2.2 switch 语句 3. 循环结构 3.1 while循环 3.2 break与continue 3.3 for循环 4. 输入输出 4.1 输出到控制台 格式化字符串 4.2 从键盘输入 5. 练习 和C语言类似地, Java的程序逻辑…...
I - Bob vs ATM(博弈论)
传送门:nefu_10-18 - Virtual Judge (vjudge.net) 思路: nim游戏的变形。 (())相当于在一堆n个石子中取任意个,sg(n)n; ((()))(())(),相当于可以在3堆石子分别为3&am…...
请解释一下 CSS3 的 Flexbox(弹性盒布局模型), 以及适用场景?
解析: CSS3的Flexbox(弹性盒布局模型)是一种强大的布局技术,用于创建灵活和响应式的布局。它解决了传统CSS布局模型在垂直和水平居中、等高列、自适应宽度等方面的一些挑战,使开发人员能够更轻松地构建各种复杂的布局。在下面的详…...
MYSQL 根据唯一索引键更新死锁问题
mysql 死锁问题及死锁权重分析 问题发生过程:1、生产发现死锁一次 语句为sql1:UPDATE table set data ‘123’ where business_no ABC; 该行数据的id1, business_no ABC tablbe 字段 id:主键 business_no为唯一索引字段,其…...
Appium+python+unittest搭建UI自动化框架!
阅读本小节,需要读者具备如下前提条件: 1. 掌握一种编程语言基础,如java、python等。 2. 掌握一种单元测试框架,如java语言的testng框架、python的unittest框架。 3. 掌握目前主流的UI测试框架,移动端APP测试框架Appiu…...
使用kubekey部署k8s集群和kubesphere、在已有k8s集群上部署kubesphere
目录 前言什么是kubekey(简称kk)单节点上安装 kubesphere(all in one 快速熟悉kubesphere)部署 kubernetes和和kubesphere 多节点安装部署 kubernetes和和kubesphere 离线安装k8s v1.22.17和kubesphere v3.3.2联网-在已有k8s集群上…...
React useMemo useCallback useEffect 的区别(保姆级教程)
因个人工作原因,在2023年学起了React TS 这个 “前端大佬” “高阶玩家” 标配的技术栈,一套学习下来个人总结就是:React真特么难用!传染病式的渲染逻辑是真让人难受!维护之前的代码就是深渊!难怪React项目…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
