【★前后端的交互★】Servlet API

news2025/5/15 6:14:06

欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)
 
文章字体风格:
红色文字表示:重难点★✔
蓝色文字表示:思路以及想法★✔
 
如果大家觉得有帮助的话,感谢大家帮忙
点赞!收藏!转发!

Servlet API

    • 一、HttpServlet
        • 1.1 面试题:Servlet 生命周期
        • 1.2 ★★★代码示例: 处理 GET 请求
          • 1.创建 MethodServlet.java, 创建 doGet 方法
          • 2.创建 testMethod.html, 放到 webapp 目录中, 形如
            • 一个 Servlet 程序中可以同时部署静态文件. 静态文件就放到 webapp 目录中即可.
          • 3.重新部署程序,
            • **关于乱码问题**
        • 1.3 ★★★ 代码示例: 处理 POST 请求
          • 1.在 MethodServlet.java 中, 新增 doPost 方法.
          • 2. 在 testMethod.html 中, 新增一个按钮, 和对应的点击事件处理函数
          • 3. 重新部署程序,
    • 二、HttpServletRequest(HTTP 协议的格式)
        • 代码示例: 打印请求信息
          • 1. 创建 ShowRequest 类
          • 2. 部署程序.
        • 代码示例: 获取 GET 请求中的参数
          • 1. 创建 GetParameter 类
          • 2. 重新部署程序,
        • 代码示例: 获取 POST 请求中的参数(1)
          • 1. 创建类 PostParameter
          • 2. 创建 testPost.html, 放到 webapp 目录中
        • 代码示例: 获取 POST 请求中的参数(2)
          • 1. 创建 PostParameterJson 类
          • 2. 创建 testPostJson.html
        • 代码示例: 获取 POST 请求中的参数(3)
          • 1. ) 在中央仓库中搜索 Jackson, 选择 JackSon Databind
          • 2) 把中央仓库中的依赖配置添加到 pom.xml 中, 形如:
          • 3) 在 PostParameterJson 类中修改代码
    • HttpServletResponse
        • 代码示例: 设置状态码
          • 1. 创建 StatusServlet 类
          • 2. 部署程序,
        • 代码示例: 自动刷新
          • 1.创建 AutoRefreshServlet 类
        • 代码示例: 重定向
          • 1.创建 RedirectServlet 类

一、HttpServlet

我们写 Servlet 代码的时候, 首先第一步就是先创建类, 继承自 HttpServlet, 并重写其中的某些方法.

核心方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.1 面试题:Servlet 生命周期

回答三个时期的方法 并且 各干什么事情即可
在这里插入图片描述

我们实际开发的时候主要重写 doXXX 方法, 很少会重写 init / destory / service

init / destory / service
这些方法的调用时机, 就称为 “Servlet 生命周期”. (也就是描述了一个 Servlet 实例从生到死的过程).

注意: HttpServlet 的实例只是在程序启动时创建一次. 而不是每次收到 HTTP 请求都重新创建实例.

1.2 ★★★代码示例: 处理 GET 请求

1.创建 MethodServlet.java, 创建 doGet 方法
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 {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.getWriter().write("GET response");
    }
}
2.创建 testMethod.html, 放到 webapp 目录中, 形如

在这里插入图片描述

一个 Servlet 程序中可以同时部署静态文件. 静态文件就放到 webapp 目录中即可.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button onclick="sendGet()">发送 GET 请求</button>
	<script>
	    function sendGet() {
	        ajax({
	            method: 'GET',
	            url: 'method',
	            callback: function (body, status) {
	                console.log(body);
	           }
	       });
	   }
	    // 把之前封装的 ajax 函数拷贝过来
	    function ajax(args) {
	        var xhr = new XMLHttpRequest();
	        xhr.onreadystatechange = function () {
	            // 0: 请求未初始化
	            // 1: 服务器连接已建立
	            // 2: 请求已接收
	            // 3: 请求处理中
	            // 4: 请求已完成,且响应已就绪
	            if (xhr.readyState == 4) {
	                args.callback(xhr.responseText, xhr.status)
	           }
	       }
	        xhr.open(args.method, args.url);
	        if (args.contentType) {
	            xhr.setRequestHeader('Content-type', args.contentType);
	       }
	               if (args.body) {
	            xhr.send(args.body);
	       } else {
	            xhr.send();
	       }
	   }
	</script>
</body>
</html>
3.重新部署程序,

使用 URL http://127.0.0.1:8080/hello/testMethod.html 访问页面.

注意 路径是看之前电脑 自己部署的 名称
在这里插入图片描述
在这里插入图片描述

点击 “发送 GET 请求” 按钮, 即可在控制台看到响应内容

在这里插入图片描述

通过 Fiddler 抓包, 可以看到,

当浏览器中输入 URL 之后, 浏览器先给服务器发送了一个 HTTP GET 请求

通过 Fiddler 抓包, 可以看到
在这里插入图片描述


关于乱码问题

如果我们在响应代码中写入中文, 例如
在这里插入图片描述

在这里插入图片描述

修正如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

此时通过抓包可以看到, 当加上了 resp.setContentType(“text/html; charset=utf-8”); 代码之
后, 响应中多了 Content-Type 字段, 内部指定了编码方式. 浏览器看到这个字段就能够正确解析中文了.

在这里插入图片描述

1.3 ★★★ 代码示例: 处理 POST 请求

1.在 MethodServlet.java 中, 新增 doPost 方法.
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
    resp.setContentType("text/html; charset=utf-8");
    resp.getWriter().write("POST 响应");
}
2. 在 testMethod.html 中, 新增一个按钮, 和对应的点击事件处理函数
<button onclick="sendPost()">发送 POST 请求</button>
<script>
    function sendPost() {
        ajax({
            method: 'POST',
            url: 'method',
            callback: function (body, status) {
                console.log(body);
           }
       })
   }
</script>
3. 重新部署程序,

使用 URL http://127.0.0.1:8080/hello/testMethod.html 访问页面

二、HttpServletRequest(HTTP 协议的格式)

当 Tomcat 通过 Socket API 读取 HTTP 请求(字符串), 并且按照 HTTP 协议的格式把字符串解析成
HttpServletRequest 对象.

核心方法

@WebServlet("/ShowRequest")
public class ShowRequest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
        StringBuilder stringBuilder = new StringBuilder();
        // 返回请求协议的名称和版本号
        stringBuilder.append(req.getProtocol()); // 协议名称: HTTP  版本号: 1.1
        stringBuilder.append("\n");
//        stringBuilder.append("<br>");

        // 放回请求的HTTP方法名称
        stringBuilder.append(req.getMethod()); // GET
        stringBuilder.append("\n");
//        stringBuilder.append("<br>");

        // 从协议名称知道HTTP请求的第一行的查询字符串中, 返回该请求的URL的一部分
        stringBuilder.append(req.getRequestURI()); // /3010/ShowRequest
        stringBuilder.append("\n");
//        stringBuilder.append("<br>");

        stringBuilder.append(req.getRequestURL()); // 返回整个地址 http://127.0.0.1:8080/0310/ShowRequest
//        stringBuilder.append("<br>");
        stringBuilder.append("\n");

        // 返回指示请求上下文的请求URI部分
        stringBuilder.append(req.getContextPath()); // /3010 -
        stringBuilder.append("\n");
//        stringBuilder.append("<br>");

        // 返回包含路径后的请求URL中的查询字符串
        stringBuilder.append(req.getQueryString()); // null 没有QueryString
        stringBuilder.append("\n");
//        stringBuilder.append("<br>");

        // 把请求的header 拼接
        // 获取到所有的headerNames
        // 枚举
        Enumeration<String> headerNames = req.getHeaderNames();
        // has XXX 判断是否有下一个
        while(headerNames.hasMoreElements()) {
            // 遍历获取到每一个header的name值
            String name = headerNames.nextElement(); // next XXX获取下一个
            // 查询header中name对应的值
            String value = req.getHeader(name);
            stringBuilder.append(name + ", " + value);
            stringBuilder.append("\n");

        }
        resp.getWriter().write(stringBuilder.toString());
    }
}

通过这些方法可以获取到一个请求中的各个方面的信息

注意: 请求对象是服务器收到的内容, 不应该修改. 因此上面的方法也都只是 “读” 方法, 而不是 “写” 方法.

代码示例: 打印请求信息

1. 创建 ShowRequest 类
@WebServlet("/showRequest")
public class ShowRequest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
        resp.setContentType("text/html; charset=utf-8");
        StringBuilder respBody = new StringBuilder();
        respBody.append(req.getProtocol());
        respBody.append("<br>");
        respBody.append(req.getMethod());
        respBody.append("<br>");
        respBody.append(req.getRequestURI());
        respBody.append("<br>");
        respBody.append(req.getContextPath());
        respBody.append("<br>");
        respBody.append(req.getQueryString());
        respBody.append("<br>");
        respBody.append("<h3>headers:</h3>");
        Enumeration<String> headerNames = req.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            respBody.append(headerName + " ");
            respBody.append(req.getHeader(headerName));
            respBody.append("<br>");
       }
        resp.getWriter().write(respBody.toString());
   }
}
2. 部署程序.

在浏览器通过 URL http://127.0.0.1:8080/自己的路径/showRequest 访问, 可以看到

在这里插入图片描述

代码示例: 获取 GET 请求中的参数

GET 请求中的参数一般都是通过 query string 传递给服务器的. 形如

https://v.bitedu.vip/personInf/student?userId=1111&classId=100

此时浏览器通过 query string 给服务器传递了两个参数, userId 和 classId, 值分别是 1111 和 100

在服务器端就可以通过 getParameter 来获取到参数的值.

1. 创建 GetParameter 类
@WebServlet("/getParameter")
public class GetParameter extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
        resp.setContentType("text/html; charset=utf-8");
        String userId = req.getParameter("userId");
        String classId = req.getParameter("classId");
        resp.getWriter().write("userId: " + userId + ", " + "classId: " +
classId);
   }
}
2. 重新部署程序,

在浏览器中通过 http://127.0.0.1:8080/hello/getParameter 访问, 可以看到

在这里插入图片描述
当没有 query string的时候, getParameter 获取的值为 null

如果通过 http://127.0.0.1:8080/ServletHelloWorld/getParameter?userId=123&classId=456 访问, 可以看到

在这里插入图片描述

此时说明服务器已经获取到客户端传递过来的参数.

getParameter 的返回值类型为 String. 必要的时候需要手动把 String 转成 int

代码示例: 获取 POST 请求中的参数(1)

POST 请求的参数一般通过 body 传递给服务器. body 中的数据格式有很多种. 如果是采用 form 表单的形式, 仍然可以通过 getParameter 获取参数的值

1. 创建类 PostParameter
@WebServlet("/postParameter")
public class PostParameter extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
        resp.setContentType("text/html; charset=utf-8");
        String userId = req.getParameter("userId");
        String classId = req.getParameter("classId");
        resp.getWriter().write("userId: " + userId + ", " + "classId: " +
classId);
   }
}
2. 创建 testPost.html, 放到 webapp 目录中
<form action="postParameter" method="POST">
    <input type="text" name="userId">
    <input type="text" name="classId">
    <input type="submit" value="提交">
</form>

重新部署程序, 通过 URL http://127.0.0.1:8080/ServletHelloWorld/testPost.html 访问, 可以看到 HTML

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时通过抓包可以看到, form 表单构造的 body 数据的格式为:

在这里插入图片描述
Content-Type: application/x-www-form-urlencoded, 对应的 body 数据格式就形如
userId=123&classId=456

代码示例: 获取 POST 请求中的参数(2)

如果 POST 请求中的 body 是按照 JSON 的格式来传递, 那么获取参数的代码就要发生调整.

1. 创建 PostParameterJson 类
@WebServlet("/postParameterJson")
public class PostParameterJson extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
        resp.setContentType("application/json;charset=utf-8");
        String body = readBody(req);
        resp.getWriter().write(body);
   }
    private String readBody(HttpServletRequest req) throws IOException {
        int contentLength = req.getContentLength();
        byte[] buffer = new byte[contentLength];
        InputStream inputStream = req.getInputStream();
        inputStream.read(buffer);
        return new String(buffer, "utf-8");
   }
}
2. 创建 testPostJson.html
    <button onclick="sendJson()">发送 JSON 格式 POST 请求</button>
	<script>
	    function sendJson() {
	        ajax({
	               url: 'postParameterJson',
	            method: 'POST',
	            contentType: 'application/json; charset=utf-8',
	            body: JSON.stringify({ userId: 123, classId: 456 }),
	            callback: function (body, status) {
	                console.log(body);
	           }
	       });
	   }
	    
	    function ajax(args) {
	 // 函数体略.... 参考之前封装的版本. 
	   }
	</script>

在浏览器中通过 http://127.0.0.1:8080/ServletHelloWorld/testPostJson.html 访问, 可以看到

在这里插入图片描述
点击按钮, 则浏览器就会给服务器发送一个 POST

POST http://127.0.0.1:8080/ServletHelloWorld/postParameterJson HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Content-Length: 28
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, 
like Gecko) Chrome/91.0.4472.114 Safari/537.36
Content-Type: application/json; charset=utf-8
Accept: */*
Origin: http://127.0.0.1:8080
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: http://127.0.0.1:8080/ServletHelloWorld/testPostJson.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
{"userId":123,"classId":456}

服务器收到这个结果之后, 又把数据返回了回去, 浏览器中看到了响应结果.

在这里插入图片描述
注意: 到目前为止, 服务器拿到的 JSON 数据仍然是一个整体的 String 类型, 如果要想获取到 userId 和
classId 的具体值, 还需要搭配 JSON 库进一步解析.

代码示例: 获取 POST 请求中的参数(3)

引入 Jackson 这个库, 进行 JSON 解析.

1. ) 在中央仓库中搜索 Jackson, 选择 JackSon Databind

在这里插入图片描述

2) 把中央仓库中的依赖配置添加到 pom.xml 中, 形如:
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.3</version>
</dependency>
3) 在 PostParameterJson 类中修改代码
// 创建一个新的类表示 JSON 数据, 属性的名字需要和 JSON 字符串中的 key 一致. 
class JsonData {
    public String userId;
    public String classId;
}
@WebServlet("/postParameterJson")
public class PostParameterJson extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        String body = readBody(req);
        // 创建 ObjectMapper 对象. 这个是 Jackson 中的核心类. 
        ObjectMapper objectMapper = new ObjectMapper();
        // 通过 readValue 方法把 body 这个字符串转成 JsonData 对象
        JsonData jsonData = objectMapper.readValue(body, JsonData.class);
        resp.getWriter().write("userId: " + jsonData.userId + ", " + "classId: "
+ jsonData.classId);
   }
    private String readBody(HttpServletRequest req) throws IOException {
        int contentLength = req.getContentLength();
        byte[] buffer = new byte[contentLength];
        InputStream inputStream = req.getInputStream();
        inputStream.read(buffer);
        return new String(buffer, "utf-8");
   }
}

注意:

  • JsonData 这个类用来表示解析之后生成的 JSON 对象. 这个类的属性的名字和类型要和 JSON 字符串的 key 相对应.
  • Jackson 库的核心类为 ObjectMapper. 其中的 readValue 方法把一个 JSON 字符串转成 Java 对象. 其中的 writeValueAsString 方法把一个 Java 对象转成 JSON 格式字符串.
  • readValue 的第二个参数为 JsonData 的 类对象. 通过这个类对象, 在 readValue 的内部就可以借
    助反射机制来构造出 JsonData 对象, 并且根据 JSON 中key 的名字, 把对应的 value 赋值给
    JsonData 的对应字段

HttpServletResponse

Servlet 中的 doXXX 方法的目的就是根据请求计算得到相应, 然后把响应的数据设置到 HttpServletResponse 对象中.

然后 Tomcat 就会把这个 HttpServletResponse 对象按照 HTTP 协议的格式, 转成一个字符串, 并通过Socket 写回给浏览器.

在这里插入图片描述

注意: 响应对象是服务器要返回给浏览器的内容, 这里的重要信息都是程序猿设置的. 因此上面的方法都是 “写” 方法.

注意: 对于状态码/响应头的设置要放到 getWriter / getOutputStream 之前. 否则可能设置失效.

代码示例: 设置状态码

实现一个程序, 用户在浏览器通过参数指定要返回响应的状态码.

1. 创建 StatusServlet 类
@WebServlet("/statusServlet")
public class StatusServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
        String statusString = req.getParameter("status");
        if (statusString != null) {
            resp.setStatus(Integer.parseInt(statusString));
       }
        resp.getWriter().write("status: " + statusString);
   }
}
2. 部署程序,

在浏览器中通过 URL http://127.0.0.1:8080/ServletHelloWorld/statusServlet?
status=200 访问, 可以看到

在这里插入图片描述
抓包结果:

HTTP/1.1 200
Content-Length: 11
Date: Mon, 21 Jun 2021 08:05:37 GMT
Keep-Alive: timeout=20
Connection: keep-alive
status: 200

变换不同的 status 的值, 就可以看到不同的响应结果

代码示例: 自动刷新

实现一个程序, 让浏览器每秒钟自动刷新一次. 并显示当前的时间戳.

1.创建 AutoRefreshServlet 类
@WebServlet("/autoRefreshServlet")
public class AutoRefreshServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
        resp.setHeader("Refresh", "1");
        long timeStamp = new Date().getTime();
        resp.getWriter().write("timeStamp: " + timeStamp);
   }
}
  • 通过 HTTP 响应报头中的 Refresh 字段, 可以控制浏览器自动刷新的时机.
  • 通过 Date 类的 getTime 方法可以获取到当前时刻的毫秒级时间戳

部署程序, 通过 URL http://127.0.0.1:8080/ServletHelloWorld/autoRefreshServlet 访问, 可
以看到浏览器每秒钟自动刷新一次.

在这里插入图片描述
抓包结果

HTTP/1.1 200
Refresh: 1
Content-Length: 24
Date: Mon, 21 Jun 2021 08:14:29 GMT
Keep-Alive: timeout=20
Connection: keep-alive
timeStamp: 1624263269995

代码示例: 重定向

实现一个程序, 返回一个重定向 HTTP 响应, 自动跳转到另外一个页面.

1.创建 RedirectServlet 类
@WebServlet("/redirectServlet")
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
        resp.sendRedirect("http://www.sogou.com");
   }
}

部署程序, 通过 URL http://127.0.0.1:8080/ServletHelloWorld/redirectServlet 访问, 可以看
到, 页面自动跳转到 搜狗主页 了.

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

了解一下Spring核心概念——IOC IOC容器 DI Bean

文章目录 1 Spring家族2 Spring发展史3 Spring系统架构3.1 系统架构图3.2 学习路线 4 Spring核心概念4.1 目前项目中的问题4.2 IOC、IOC容器、Bean、DI4.2.1 IOC&#xff08;Inversion of Control&#xff09;控制反转4.2.2 DI&#xff08;Dependency Injection&#xff09;依赖…

(免费分享)springboot,vue物业管理系统

一、项目技术 后端框架&#xff1a;springboot 前端框架&#xff1a;elementUIvue 主要实现了用户登录、社区信息展示、物业公告、社区设施、物业人员信息。 进入物业系统管理后端。实现了社区的管理&#xff0c;包括基本信息管理、周边设施管理、物业公告管理。楼盘管理包括楼…

AI对话-Free Chat免费无限制

目录 前言 使用方法 提问 推荐线路 前言 chat.4 和 chat.5 线路的响应改成通过在 Netlify 的部署来响应了。Netlify 不像 Vercel 那样还限制 Edge Function 的调用次数,很适合部署本项目。现在这两个线路的成本最低了,最优先推荐大家使用。 使用方法 提问 比如我问他:…

docker学习笔记(3)

目录 Docker命令 进程相关命令 镜像相关命令 查看镜像 Docker 数据管理 数据卷 大家在使用Xftp的时候&#xff0c;千万要先用本地端ping一下虚拟机IP&#xff0c;不然你在那里创建几次都没有用。 Docker命令 进程相关命令 # 启动Docker命令 systemctl start docker # 停…

网络基础学习:ip地址的知识

网络基础学习&#xff1a;ip地址的知识 IP地址是什么&#xff1f;如何查询计算机ipip分为几类IPv4和IPv6IPv4和IPv6的通信 IP地址是什么&#xff1f; IP地址是指用于标识在网络上的设备或节点的一组数字&#xff0c;它是Internet协议&#xff08;IP&#xff09;中使用的一种地…

【C++】C++入门知识

&#x1f601;作者&#xff1a;日出等日落 &#x1f514;专栏&#xff1a;C 不要去等谁&#xff0c;所有的不期而遇都在路上。 前言 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等。熟悉C语言之后&…

通过点云获取碰撞向量

T&#xff1a;what Y&#xff1a;why W&#xff1a;how Y 针对点云的无序性&#xff0c;无法通过坐标索引进行查询&#xff0c;常常将点云地图转换其他类型的地图&#xff0c;如Octomap&#xff0c;从而进行碰撞检测&#xff1b; W 为快速进行机器人与障碍物的位置计算&…

C高级day3

1.编写一个名为myfirstshell.sh的脚本&#xff0c;它包括以下内容。 1、包含一段注释&#xff0c;列出您的姓名、脚本的名称和编写这个脚本的目的 2、和当前用户说“hello 用户名” 3、显示您的机器名 hostname 4、显示上一级目录中的所有文件的列表 5、显示变量PATH和HOM…

【前端技术】Vue3 02:基础语法

接下来介绍下 Vue 的基础语法&#xff0c;包括渐进式框架、单文件组件、组合式 API 和选项式 API等基础要点和 v-xx 指令和其余基础语法&#xff0c;这和官方教程的顺序不大一致&#xff0c;我认为先学习 v-xx 指令可能更有助于大家的理解及学习。 目录 1 前言 1.1 单文件组件…

【Linux】Linux中的编辑器vim

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;Linux的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录 前言一、vim的概念二、命令模式2…

SpringBoot【开发实用篇】---- 数据层解决方案

SpringBoot【开发实用篇】---- 数据层解决方案 1. SQL数据源技术持久化技术数据库技术 2. NoSQLSpringBoot整合Redis安装基本操作整合 SpringBoot整合MonggoDB安装基本操作整合 SpringBoot整合ES安装基本操作整合 开发实用篇前三章基本上是开胃菜&#xff0c;从第四章开始&…

“1+X+N”模式助力企业数字化转型

近期&#xff0c;中电金信顺利完成某股份制银行“基于战略解析与业务架构的全行科技规划项目”交付。针对客户的实际业务需求&#xff0c;中电金信采用“1XN”服务模式&#xff0c;服务客户全面的企业架构转型规划。项目组联合行方协同创新&#xff0c;首次将企架建模方法应用于…

【腾讯云 findops Crane集训营】深入了解 Crane 开源项目之实验操作指南

引言&#xff1a; 最近我参加了由腾讯云联合 CSDN 推出的“腾讯云 Finops Crane 开发者集训营”活动&#xff0c;通过这个活动我对腾讯云的 Finops Crane 开源项目有了更深入的了解。在本篇博客中&#xff0c;我将分享我对该项目的认识和体验&#xff0c;并介绍其中一些关键特性…

C++:使用红黑树封装map和set

目录 一. 如何使用一颗红黑树同时实现map和set 二. 红黑树的节点插入操作 三. 红黑树迭代器的实现 3.1 begin()和end() 3.2 operator和operator-- 3.3 红黑树迭代器实现完整版代码 四. map和set的封装 附录&#xff1a;用红黑树封装map和set完整版代码 1. RBTree.h文件…

表情识别 emotion recognition

facial expression recognition 表情&#xff0c;人脸上的肌肉状态&#xff0c;可以表达人类的情绪。 1970年&#xff0c;Ekman定义了六种基本表情 如何定义&#xff1f; 动作单元(action unit)是定义表情的重要工具。 心理学家和生物学家认为&#xff0c;人的表情可以分解…

【HCIP】三层架构综合实验

目录 需求&#xff1a; 一、拓扑设计 二、配置 ①eth-trunk ②创建vlan & 划分vlan & trunk干道配置 ③STP生成树根节点备份&负责分担 ④SVI及VRRP网关冗余设置 ⑤DHCP ⑥通公网 ⑦验证 三层架构&#xff1a;核心层&#xff0c;汇聚层&#xff0c;接入层 …

QT桌面项目(第一个应用程序 桌面壁纸软件)

文章目录 前言一、壁纸切换程序的布局二、添加资源文件三、代码编写四、主界面代码五、程序的编写思路六、程序效果总结 前言 上节课我们已经做好了APP的按键图标了&#xff0c;这篇文章就让我们来开始制作第一个桌面程序吧。 一、壁纸切换程序的布局 这个是windows上浏览器…

vue3使用指南

vue3使用指南 主要介绍vue3的使用&#xff0c;同时会涉及到vue2&#xff0c;并会讲解其中的一些差异。 安装 CDN引入 如果想快速体验&#xff0c;可以直接通过cdn进行引入。 <div id"app">{{msg}}</div> <script src"https://unpkg.com/vue…

谷歌推出下一代大型语言模型 PaLM 2

谷歌在 2023 年度 I/O 大会上宣布推出了其下一代大型语言模型 PaLM 2&#xff0c;擅长高级推理任务&#xff0c;包括代码和数学、分类和问答、翻译和多语言能力以及自然语言生成。 谷歌声称 PaLM 2 是一种最先进的语言模型&#xff0c;要优于其之前所有的 LLM&#xff0c;包括…

网络拓扑架构规划设计

小型组网架构 1.网络拓扑 终端用户接入到交换机,交换机直连防火墙构成的简单网络,防火墙连接internet,对内网的用户进行安全控制 2.特点 用户接入数量较少:小型网络应用于接入用户数量较少的场景,一般支持几个至几十个用户 网络覆盖范围小:网络覆盖范围一般也是一个…