Request+Response

news2025/1/21 3:01:14

文章目录

    • 1. 介绍
    • 2. Request对象
      • 2.1 Request继承体系
      • 2.2 Request获取请求数据
        • 1.获取请求行
        • 2.获取请求头
        • 3.获取请求体
        • 4. 请求参数的通用方式
        • 5. 解决中文乱码问题
      • 2.3 Request请求转发
          • 请求转发资源间共享数据:
    • 3. Response对象
      • 3.0 Response 继承体系
      • 3.1 Response设置响应数据的功能介绍
        • 1.设置响应行
        • 2.设置响应头
        • 3.设置响应体
      • 3.2 Response完成重定向
      • 3.3 设置响应数据
        • 1. Response响应字符数据
        • 2. Response响应字节数据
    • 4.案例:用户登录/用户注册

1. 介绍

Request+Response

Request是请求对象,Response是响应对象

  • request: 获取请求数据
    • 浏览器会发送HTTP请求到后台服务器[Tomcat]
    • HTTP的请求中会包含很多请求数据[请求行+请求头+请求体]
    • 后台服务器[Tomcat]会对HTTP请求中的数据进行解析并把解析结果存入到一个对象中
    • 所存入的对象即为request对象,所以我们可以从request对象中获取请求的相关参数
    • 获取到数据后就可以继续后续的业务,比如获取用户名和密码就可以实现登录操作的相关业务
  • response:设置响应数据
    • 业务处理完后,后台就需要给前端返回业务处理的结果即响应数据
    • 把响应数据封装到response对象中
    • 后台服务器[Tomcat]会解析response对象,按照[响应行+响应头+响应体]格式拼接结果
    • 浏览器最终解析结果,把内容展示在浏览器给用户浏览

在这里插入图片描述

@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //使用request对象 获取请求数据
        String name = request.getParameter("name");//url?name=zhangsan

        //使用response对象 设置响应数据
        response.setHeader("content-type","text/html;charset=utf-8");
        response.getWriter().write("<h1>"+name+",欢迎您!</h1>");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Post...");
    }
}

2. Request对象

2.1 Request继承体系

在这里插入图片描述

  • Tomcat需要解析请求数据,封装为request对象并且创建request对象传递到service方法中;

Q1: ServletRequest和HttpServletRequest的关系?

  • ServletRequest是Java Servlet规范中定义的一个接口,它是所有Servlet请求对象的顶级接口
  • HttpServletRequest是ServletRequest的子接口,它扩展了ServletRequest接口,提供了更多与HTTP协议相关的方法和功能。
  • 当Servlet类实现的是Servlet接口的时候,service方法中的参数是ServletRequest和ServletResponse
  • 当Servlet类继承的是HttpServlet类的时候,doGet和doPost方法中的参数就变成HttpServletRequest和HttpServletReponse

2.2 Request获取请求数据

HTTP请求数据总共分为三部分内容,分别是 请求行、请求头、请求体

1.获取请求行

请求行包含三块内容,分别是请求方式请求资源路径HTTP协议及版本

请求行 方法说明
String getMethod()获取请求方式: GET
String getContextPath()获取虚拟目录(项目访问路径): /request-demo
StringBuffer getRequestURL()获取URL(统一资源定位符): http://localhost:8080/request-demo/req1
String getRequestURI()获取URI(统一资源标识符): /request-demo/req1
String getQueryString()获取请求参数(GET方式): username=zhangsan&password=123
//获取请求行
@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // String getMethod():获取请求方式: GET
        String method = req.getMethod();
        System.out.println(method);//GET
        // String getContextPath():获取虚拟目录(项目访问路径):/request-demo
        String contextPath = req.getContextPath();
        System.out.println(contextPath);
        // StringBuffer getRequestURL(): 获取URL(统一资源定位符):http://localhost:8080/request-demo/req1
        StringBuffer url = req.getRequestURL();
        System.out.println(url.toString());
        // String getRequestURI():获取URI(统一资源标识符): /request-demo/req1
        String uri = req.getRequestURI();
        System.out.println(uri);
        // String getQueryString():获取请求参数(GET方式): username=zhangsan
        String queryString = req.getQueryString();
        System.out.println(queryString);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }

}

在这里插入图片描述

2.获取请求头

请求头 方法说明
String getHeader(String name)获取指定名称的请求头

在这里插入图片描述

```java
/**
 * request 获取请求数据
 */
@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求头: user-agent: 浏览器的版本信息
        String agent = req.getHeader("user-agent");
		System.out.println(agent);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
}

在这里插入图片描述

3.获取请求体

请求体: 注意get请求没有请求体,post有

请求体 方法说明
ServletInputStream getInputStream()获取字节输入流,如果前端发送的是字节数据,比如传递的是文件数据,则使用该方法
BufferedReader getReader()获取字符输入流,如果前端发送的是纯文本数据,则使用该方法

具体实现的步骤如下:

1.准备一个页面,在页面中添加form表单,用来发送post请求

2.在Servlet的doPost方法中获取请求体数据

3.在doPost方法中使用request的getReader()或者getInputStream()来获取

4.访问测试

package com.itheima.web;

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.BufferedReader;
import java.io.IOException;

@WebServlet("/demo4")
public class ServletDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取post 请求体:请求参数
        //1. 获取字符输入流
        BufferedReader br = req.getReader();
        //2. 读取数据
        String line = br.readLine();
        System.out.println(line);
    }
}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试获取请求体信息</title>
</head>
<body>
<h5>hello</h5>
<form action="/demo4" method="post">
  <input type="text" name="username">
  <input type="password" name="password">
  <input type="submit">

</form>

</body>
</html>

在这里插入图片描述

4. 请求参数的通用方式

请求参数的获取方式:

  • GET方式:

String getQueryString()

  • POST方式:

BufferedReader getReader();

案例:
(1)发送一个GET请求并携带用户名,后台接收后打印到控制台
(2)发送一个POST请求并携带用户名,后台接收后打印到控制台

//实现
@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String result = req.getQueryString();
        System.out.println(result);

    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        BufferedReader br = req.getReader();
        String result = br.readLine();
        System.out.println(result);
    }
}

Q:既然实现的功能一样,是否可以统一doGet和doPost方法内的代码?

解决方案一:

@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求方式
        String method = req.getMethod();
        //获取请求参数
        String params = "";
        if("GET".equals(method)){
            params = req.getQueryString();
        }else if("POST".equals(method)){
            BufferedReader reader = req.getReader();
            params = reader.readLine();
        }
        //将请求参数进行打印控制台
        System.out.println(params);
      
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

解决方案二:

request对象已经将上述获取请求参数的方法进行了封装,并且request提供的方法实现的功能更强大
步骤:
(1)根据不同的请求方式获取请求参数
(2)把获取到的内容进行分割
(3)把分割后端数据,存入到一个Map集合中

方法说明
Map<String,String[]> getParameterMap()获取所有参数Map集合
String[] getParameterValues(String name)根据名称获取参数值(数组)
String getParameter(String name)根据名称获取参数值(单个值)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/req" 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>

在这里插入图片描述


//使用get获取请求信息
@WebServlet("/req")
public class ServletDemo5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //GET请求逻辑
        System.out.println("get....");
        //1. 获取所有参数的Map集合
        Map<String, String[]> map = req.getParameterMap();
        for (String key : map.keySet()) {
            // username:zhangsan lisi
            System.out.print(key+":");

            //获取值
            String[] values = map.get(key);
            for (String value : values) {
                System.out.print(value + " ");
            }

            System.out.println();
            //2.根据key获取值
            System.out.println("------------");
            String[] hobbies = req.getParameterValues("hobby");
            for (String hobby : hobbies) {
                System.out.println(hobby);
            }

            //3.根据key获取单个参数值
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            System.out.println(username);
            System.out.println(password);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

在这里插入图片描述
在这里插入图片描述
IDEA模板创建Servlet:102
https://www.bilibili.com/video/BV1Qf4y1T7Hx
在这里插入图片描述

5. 解决中文乱码问题

在这里插入图片描述

  • GET请求获取请求参数的方式是request.getQueryString()
  • POST请求获取请求参数的方式是request.getReader()

post:

req.setCharacterEncoding("UTF-8");

解决:https://blog.csdn.net/yiqieanhaowzq/article/details/126279078

在这里插入图片描述

username  = new String(username.getBytes(StandardCharsets.ISO_8859_1),
                StandardCharsets.UTF_8);

2.3 Request请求转发

请求转发是指将当前请求转发给另一个Servlet或JSP页面进行处理,转发后的Servlet或JSP页面会继续处理请求并生成响应。

方法说明
request.getRequestDispatcher(“/destination”);获取RequestDispatcher对象
dispatcher.forward(request, response);请求转发
package com.itheima.web;

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("/demo6")
public class ServletDemo6 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo6...get");
        //请求转发
        req.getRequestDispatcher("/demo7").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

package com.itheima.web;

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("/demo7")
public class ServletDemo7 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo7...get");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

在这里插入图片描述

请求转发资源间共享数据:

请求转发资源间共享数据是指在Java
Servlet中,通过请求转发,将请求从一个Servlet或JSP页面转发到另一个Servlet或JSP页面时,可以在它们之间共享数据。

  • 当一个请求被转发到另一个资源(Servlet或JSP页面)时,原始请求的数据,例如请求参数、属性等,可以通过设置和获取request对象的属性来在转发的资源之间传递和共享。这种方式允许在不暴露数据给客户端的情况下,在服务器端的多个组件之间传递信息。

请求转发特点:

  • 浏览器地址栏路径不发生变化
  • 只转发当前服务器内部资源
  • 一次请求,可以在转发的资源间使用request共享数据

需要使用request对象提供的三个方法:

方法说明
void setAttribute(String name,Object o)存储数据到request域中
Object getAttribute(String name);根据key,获取值
void removeAttribute(String name);根据key,删除该键值对
@WebServlet("/demo6")
public class ServletDemo6 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo6...get");

        //存储数据
        req.setAttribute("msg","hello");

        //请求转发
        req.getRequestDispatcher("/demo7").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

@WebServlet("/demo7")
public class ServletDemo7 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo7...get");

        //获取数据
        Object msg = req.getAttribute("msg");
        System.out.println(msg);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

在这里插入图片描述

3. Response对象

  • Request:使用request对象来获取请求数据
  • Response:使用response对象来设置响应数据

3.0 Response 继承体系

在这里插入图片描述

3.1 Response设置响应数据的功能介绍

HTTP响应数据总共分为三部分内容,分别是响应行、响应头、响应体,对于这三部分内容的数据

1.设置响应行

响应行:

  • 状态行包含了HTTP协议版本号、状态码和相应的状态信息。
  • 它的格式为:HTTP版本号 状态码 状态信息。
  • 例如:HTTP/1.1 200 OK。
方法说明
void setStatus(int sc);设置响应状态码

2.设置响应头

响应头部
响应头部包含了关于响应的附加信息,如服务器类型、日期、内容类型等。 它由多个键值对组成,每个键值对占据一行。常见的响应头部字段包括:

  • Content-Type:指定响应体的媒体类型。
  • Content-Length:指定响应体的长度。
  • Date:指定响应的日期和时间。
  • Server:指定响应的服务器软件类型。
方法说明
void setHeader(String name,String value)设置响应头键值对

3.设置响应体

响应体:
响应体包含了具体的响应内容。它可以是HTML、JSON、图片等数据。响应体的格式和内容根据具体的请求和服务器的处理结果而定。

方法说明
PrintWriter getWriter();获取字符输出流
ServletOutputStream getOutputStream();获取字节输出流

3.2 Response完成重定向

在HTTP协议中,重定向(Redirect)是一种服务器响应的行为,它告诉客户端要求的资源已经被移动到另一个位置,并提供了新的资源位置(URL)供客户端重新请求。
重定向状态码:

  • 301:资源已永久移动到新的URL,客户端应更新其链接。
  • 302 :资源临时移动到新的URL,客户端应使用新的URL重新发起请求。
  • 307 :资源临时移动到新的URL,客户端应保持请求方法不变重新发起请求。
  • 308 :资源已永久移动到新的URL,客户端应保持请求方法不变重新发起请求

重定向特点:

  • 浏览器地址栏发生变化
  • 可以重定向到任意位置的资源(服务器内部外部均可)
  • 两次请求,不能在多个资源使用request共享资源
resp.setStatus(302);
resp.setHeader("location","资源B的访问路径");
Q:Response重定向和Request请求转发有什么区别?
- 重定向是一种服务器响应行为,要求客户端重新发起请求。
  客户端会接收到新的URL信息,并据此发起新的请求。
- 请求转发是一种服务器内部行为,将客户端的请求转发给其他资源或处理程序来处理。
  客户端对此转发过程是不可见的。
- 重定向会向客户端发送额外的响应,通常包含重定向的状态码和新的URL信息。
  请求转发不需要额外的响应,客户端不知道请求被转发了。
- 重定向可以用于资源移动、负载均衡和认证授权等场景。
  请求转发通常用于服务器内部组织和处理请求的需要。
- 重定向浏览器地址栏会发生变化,请求转发地址栏不会发生变化

//重定向
@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("resp1......");

        //重定向
        //1.设置响应状态码302
        resp.setStatus(302);

        //2. 设置响应头
        resp.setHeader("Location","/resp2");


        //简化方式重定向
        resp.sendRedirect("/resp2");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}


@WebServlet("/resp2")
public class ResponseDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("resp2......");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

在这里插入图片描述

3.3 设置响应数据

方法说明
PrintWriter getWriter();获取字符输出流
ServletOutputStream getOutputStream();获取字节输出流

1. Response响应字符数据

设置响应的内容类型为text/html
 //resp.setHeader("content-type","text/html");
resp.setContentType("text/html");
resp.setContentType("text/html";charset=utf-8);

设置响应的状态码
resp.setStatus(HttpServletResponse.SC_OK);

设置响应的字符编码:
resp.setCharacterEncoding("UTF-8");

设置响应的头部信息:
resp.setHeader("Cache-Control", "no-cache");
resp.setHeader("Expires", "0");

设置响应的重定向:
resp.sendRedirect("https://www.example.com");

设置响应的Cookie:
Cookie cookie = new Cookie("name", "value");
cookie.setMaxAge(3600); // 设置Cookie的有效期
cookie.setPath("/"); // 设置Cookie的作用路径
resp.addCookie(cookie); // 将Cookie添加到响应中

设置响应的内容长度:
resp.setContentLength(content.length());

设置响应的响应类型:
resp.setContentType("application/json");
@WebServlet("/resp3")
public class ResponseDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("resp3......");
        
        //1.获取字符输出流
        PrintWriter writer = resp.getWriter();
        
        //2.设置响应的内容类型为text/html
        //resp.setHeader("content-type","text/html");
        resp.setContentType("text/html");
        
        //3.向客户端输出文本内容
        writer.write("aaa");
        
        //4.向客户端输出HTML标签
        writer.write("<h1>aaa</h1>");
        
        //5.刷新缓冲区,确保所有内容都被写入响应
        writer.flush();
        
        //6.关闭输出流
        writer.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

在这里插入图片描述

2. Response响应字节数据

//响应字节数据:设置字节数据响应体
@WebServlet("/resp4")
public class ResponseDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("resp4......");

        //0.读取文件
        FileInputStream fileInputStream = new FileInputStream("C:\\Users\\11445\\Pictures\\Saved Pictures\\头像.jpg");


        //1.获取字节输出留,用于向客户端发送响应的字节数据。
        ServletOutputStream outputStream = resp.getOutputStream();

        //2.完成流的copy
        byte[] bytes = new byte[1024];  //创建一个字节数组,用于存储文件内容。
        int len = 0;  //定义一个变量 len,用于记录每次读取的字节长度。

        //循环读取文件内容,每次最多读取 1024 个字节,直到文件末尾
        while ((len = fileInputStream.read(bytes) )!= -1){
            outputStream.write(bytes,0,len);  //将读取到的字节数据写入到输出流中,发送给客户端。
        }

        fileInputStream.close();

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

在这里插入图片描述

简化流的copy

Apache Commons IO 是一个开源的 Java 库,提供了许多实用的 IO
操作工具类,用于简化文件和流的操作。它包含了各种用于文件操作、流操作、拷贝、比较、过滤、监听等功能的工具类。

    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.6</version>
    </dependency>
//2.完成流的copy
        IOUtils.copy(fileInputStream,outputStream);

4.案例:用户登录/用户注册

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

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

相关文章

RK3288Android7.1上10寸mipi屏兼容

需求&#xff1a;RK3288Android7.1上10寸mipi屏兼容 思路&#xff1a; 1、修改屏幕厂商提供的屏幕初始化指令为rk可以识别的格式存放在panel-init-sequence 2、修改屏参display-timings 3、确定reset-gpio 实现&#xff1a; 首先根据屏幕厂商提供的初始化指令将panel-init-seq…

AMS的起源,SystemServer的前世今生

作者&#xff1a;OpenGL 前世 SystemServer的创建还得追溯到之前的Zygote进程中的ZygoteInit代码中。这里的Zygote.forkSystemServer()方法就是实现分裂的关键代码。它内部调用了native方法实现了进程分裂。 执行完这行代码之后。我们的系统中就会出现两个一模一样的进程&…

复现基于PYNQ-Z2的手写数字识别卷积加速器设计

来源雪天鱼 基于PYNQ-Z2的手写数字识别卷积加速器设计【持续更新】_雪天鱼的博客-CSDN博客 一、设计思路 1、输入28 x 28 的图片&#xff0c;非png格式&#xff0c;而是txt格式&#xff0c;将图片数据进行量化&#xff0c;存入到txt文件当中。 2、在PL端实现卷积神经网络LeN…

关于Linux Docker springboot jar 日志时间不正确 问题解决

使用Springboot项目的jar&#xff0c;制作了一个Docker镜像&#xff0c;启动该镜像后发现容器和容器中的Springboot 项目的日志时间不正确。 解决 查看容器时间命令为&#xff1a; docker exec 容器id date 1. 容器与宿主机同步时间 在启动镜像时候把操作系统的时间通过&q…

可白嫖的4家免费CDN,并测试其网络加速情况(2023版)

网站加载速度优化过程中&#xff0c;不可避免的会用上CDN来加速资源的请求速度。但是市面上的CDN资源几乎都是要收费的&#xff0c;而且价格还不便宜&#xff0c;对于小公司站长来讲&#xff0c;这将是一笔不小的开销。不过还是有一些良心公司给我们提供了免费的资源&#xff0…

SASS 学习笔记

SASS 学习笔记 总共会写两个练手项目&#xff0c;成品在 https://goldenaarcher.com/scss-study 可以看到&#xff0c;代码在 https://github.com/GoldenaArcher/scss-study。 什么是 SASS SASS 是 CSS 预处理&#xff0c;它提供了变量&#xff08;虽然现在 CSS 也提供了&am…

【C# 基础精讲】异常的类型和处理方法

异常&#xff08;Exception&#xff09;是在程序执行过程中发生的意外或异常情况&#xff0c;例如除零错误、空引用访问、文件不存在等。在C#及其他编程语言中&#xff0c;异常处理是一种重要的机制&#xff0c;用于捕获和处理程序运行时可能出现的错误&#xff0c;以保证程序的…

939. 最小面积矩形;2166. 设计位集;2400. 恰好移动 k 步到达某一位置的方法数目

939. 最小面积矩形 核心思想&#xff1a;枚举矩形的右边那条边的两个点&#xff0c;并用一个哈希表存储相同纵坐标的最近出现的列的列数,不断更新最近出现的左边那条边。 2166. 设计位集 核心思想&#xff1a;这题主要是时间复杂度的优化&#xff0c;用一个flag来标记当前翻转…

word在页眉页脚添加第几页

如果直接在页脚添加数字&#xff0c;整个文档的页脚会是统一的。 这里我们需要的是每一页按照页码排布的文档&#xff0c;所以首先打开页脚设置&#xff1a; 在插入内选择页脚 在弹出的下拉窗口中选择空白即可 在菜单栏会多出“页眉和页脚”的选项卡&#xff0c;选择其中的页…

使用拦截器+Redis实现接口幂等

文章目录 使用拦截器Redis实现接口幂等1.思路分析2.具体实现2.1 创建redis工具类2.2 自定义幂等注解2.2 自定义幂等拦截器2.3 注入拦截器到容器 3.测试 使用拦截器Redis实现接口幂等 1.思路分析 接口幂等有很多种实现方式&#xff0c;拦截器/AOPRedis&#xff0c;拦截器/AOP本…

以对话为场景本质,AIGC 将如何改变游戏规则

8 月 17 日&#xff08;本周四&#xff09;&#xff0c;融云直播课从排查问题到预警风险&#xff0c;社交产品如何更好保障体验、留住用户&#xff1f;欢迎点击报名~ 生成式 AI 公司 MosaicML 以约 13 亿美元的价格被大数据巨头 Databricks 收购&#xff0c;这个发生于 6 月底的…

python获取音乐文件

浏览器打开音乐地址 http://www.htqyy.com/top/hot 点击第一首歌曲&#xff0c;会打开新的网页并且可以获取 改歌曲的id&#xff0c;就是url中的33 在播放页面点击F12&#xff0c;打开开发者调试功能 如下图所示&#xff0c;在script脚本中可以获取歌曲的下载数据 host&#…

【DICOM医学影像1】数据格式存储于显示,基本知识科普指南

DICOM&#xff08;Digital Imaging and Communications in Medicine&#xff09;数据格式&#xff0c;是医学影像存储中的标准格式。无论是X光、CT&#xff0c;还是MRI等等影像&#xff0c;采集的原理不同&#xff0c;但是存储的格式一般都是统一的。本文就对DICOM文件的图像显…

Hands on RL 之 Deep Deterministic Policy Gradient(DDPG)

Hands on RL 之 Deep Deterministic Policy Gradient&#xff08;DDPG&#xff09; 文章目录 Hands on RL 之 Deep Deterministic Policy Gradient&#xff08;DDPG&#xff09;1. 理论部分1.1 回顾 Deterministic Policy Gradient(DPG)1.2 Neural Network Difference1.3 Why i…

大模型PEFT技术原理(三):Adapter Tuning及其变体

随着预训练模型的参数越来越大&#xff0c;尤其是175B参数大小的GPT3发布以来&#xff0c;让很多中小公司和个人研究员对于大模型的全量微调望而却步&#xff0c;近年来研究者们提出了各种各样的参数高效迁移学习方法&#xff08;Parameter-efficient Transfer Learning&#x…

java17新特性+ZGC

ZGC垃圾收集 11引入的追求低延迟的垃圾回收器 1.ZGC的内存布局 1.1 region 和G1一样&#xff0c;也是基于Region的堆内存布局。但是ZGC的Region具有动态性&#xff1a;动态创建、动态销毁、动态数据容量。 1.2 垃圾回收机制 相较于CMS&#xff0c;ZGC只有6个阶段&#xff1…

同步、异步、协程

目录 同步异步https 异步请求&#xff1a; 协程1.为什么会要协程?2.异步的运行流程是什么3.协程的原语操作4.协程的定义?5.调度器的定义?6.调度的策略?7. api封装, hook8.多核的模式?9.协程的性能?10.要有哪些案例?nty_servernty_ mysql_client.cnty_ mysql oper.cnty_ …

Python项目实战:基于napari的3D可视化(点云+slice)

文章目录 一、napari 简介二、napari 安装与更新三、napari【巨巨巨大的一个BUG】四、napari 使用指南4.1、菜单栏&#xff08;File View Plugins Window Help&#xff09;4.2、Window&#xff1a;layer list&#xff08;参数详解&#xff09;4.3、Window&#xff1a;layer…

city walk结合VR全景,打造新时代下的智慧城市

近期爆火的city walk是什么梗&#xff1f;它其实是近年来备受追捧的城市漫步方式&#xff0c;一种全新的城市探索方式&#xff0c;与传统的旅游观光不同&#xff0c;城市漫步更注重与城市的亲密接触&#xff0c;一步步地感受城市的脉动。其实也是一种自由、休闲的方式&#xff…

vscode搭建java开发环境

一、配置extensions环境变量VSCODE_EXTENSIONS&#xff0c; 该环境变量路径下的存放安装组件&#xff1a; 二、setting配置文件 {"java.jdt.ls.java.home": "e:\\software\\jdk\\jdk17",// java运行环境"java.configuration.runtimes": [{"…