JavaWeb:Request Response

news2024/10/2 5:39:09

文章目录

      • 1、Request和Response的概述
      • 2、Request继承体系
      • 3、Request获取请求数据
        • 3.1、获取请求行数据
        • 3.2、获取请求头
        • 3.3、获取请求体
      • 4、Request通用方式请求参数
      • 5、POST请求参数乱码解决
      • 6、Request请求转发
      • 7、Response的响应状态码和响应头
      • 8、Response重定向
      • 9、Response响应字符数据
      • 10、Response响应字节输出流

1、Request和Response的概述

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

image-20240118152626560

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

2、Request继承体系

首先,我们先来看下Request的继承体系:

image-20240118152856290

从上图中可以看出,ServletRequest和HttpServletRequest都是Java提供的所以ServletRequest和HttpServletRequest是继承关系,并且两个都是接口,接口是无法创建对象,这个时候就引发了下面这个问题:

image-20240118153606346

这个时候,我们就需要用到Request继承体系中的RequestFacade:

  • 该类实现了HttpServletRequest接口,也间接实现了ServletRequest接口。
  • Servlet类中的service方法、doGet方法或者是doPost方法最终都是由Web服务器来调用的,所以Tomcat提供了方法参数接口的具体实现类,并完成了对象的创建

3、Request获取请求数据

HTTP请求数据总共分为三部分内容,分别是请求行、请求头、请求体,对于这三部分内容的数据,分别该如何获取?

3.1、获取请求行数据
方法说明
String getMethod()获取请求方式
String getContextPath()获取虚拟目录(项目访问路径)
StringBuffer getRequestURL()获取URL(统一资源定位符)
String getQueryString()获取请求参数(GET方式)
String getRequestURI()获取URI(统一资源标识符)

代码演示:

前端页面

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
<h2>GET方式提交</h2>
<form action="req02" 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" value="登录">
</form>
</body>
</html>

后端代码

@WebServlet(value = "/req02")
public class request01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // String getMethod()获取请求方式
        String method = request.getMethod();
        System.out.println(method);

        //String getContextPath()获取虚拟目录(项目访问路径)
        String contextPath = request.getContextPath();
        System.out.println(contextPath);

        //StringBuffer getRequestURL()获取URL(统一资源定位符)
        StringBuffer requestURL = request.getRequestURL();
        System.out.println(requestURL);

        //String getRequestURI()获取URI(统一资源标识符)
        String requestURI = request.getRequestURI();
        System.out.println(requestURI);

        //String getQueryString()获取请求参数(GET方式)
        String queryString = request.getQueryString();
        System.out.println(queryString);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
    }
}
3.2、获取请求头

对于请求头的数据,格式为key: value如下:

image-20240118161834735

所以根据请求头名称获取对应值的方法为:

String getHeader(String name) // 根据请求头名称,获取值

代码演示:

@WebServlet(value = "/req02")
public class request01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取浏览 器版本
        String header = request.getHeader("User-Agent");
        System.out.println(header);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
    }
}

因为各个版本的浏览器不太一样,所以一般都有去获取user-agent这个请求头

3.3、获取请求体

浏览器在发送GET请求的时候是没有请求体的,所以需要把请求方式变更为POST,请求体中的数据格式如下:

image-20240118162532866

对于请求体中的数据,Request对象提供了如下两种方式来获取其中的数据,分别是:

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

代码演示:

前端代码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
<h2>POST方式提交</h2>
<form action="req02" method="post">
    用户名:<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" value="登录">
</form>
</body>
</html>

后端代码

@WebServlet(value = "/req02")
public class request01 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1、获取字符输入流
        BufferedReader reader = request.getReader();

        // 2、读取数据 
        String s = reader.readLine();
        System.out.println(s);
    }
}

4、Request通用方式请求参数

对于请求参数的获取,常用的有以下两种:

  • GET方式:
String getQueryString()
  • POST方式:
BufferedReader getReader();

有了上述的知识储备,我们来实现一个案例需求:

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

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

此处大家需要注意的是GET请求和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);
    }
}

image-20240118165230918

GET请求方式和POST请求方式区别主要在于获取请求参数的方式不一样,是否可以提供一种统一获取请求参数的方式,从而统一doGet和doPost方法内的代码?

解决方案

(1)根据不同的请求方式获取请求参数,获取的内容如下:

1628778931277

(2)把获取到的内容进行分割,内容如下:

1628779067793

(3)把分割后端数据,存入到一个Map集合中:

1628779368501

注意:因为参数的值可能是一个,也可能有多个,所以Map的值的类型为String数组。

基于上述理论,request对象为我们提供了如下方法:

  • 获取所有参数Map集合
Map<String,String[]> getParameterMap()
  • 根据名称获取参数值(数组)
String[] getParameterValues(String name)
  • 根据名称获取参数值(单个值)
String getParameter(String name)

接下来,我们通过案例来把上述的实例演示:

前端代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
<h2>GET方式提交</h2>
<form action="req03" 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" value="登录">
</form>
<hr>
<br>
<br>
<h2>POST方式提交</h2>
<form action="req03" method="post">
    用户名:<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" value="登录">
</form>
</body>
</html>

后端代码:

@WebServlet(value = "/req03")
public class request02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1、获取map集合
        Map<String, String[]> parameterMap = request.getParameterMap();
        parameterMap.forEach((key,values)->{
            System.out.println(key+"::"+ Arrays.toString(values));
        });

        // 2、根据参数名称获取参数值
        String username = request.getParameter("username");
        System.out.println(username);

        // 3、根据参数名称获取参数数组
        String[] hobbies = request.getParameterValues("hobby");
        System.out.println(Arrays.toString(hobbies));

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }
}

5、POST请求参数乱码解决

  • 分析出现中文乱码的原因:
    • POST的请求参数是通过request的getReader()来获取流中的数据
    • tomcat在获取流的时候采用的编码是ISO-8859-1
    • ISO-8859-1编码是不支持中文的,所以会出现乱码
  • 解决方案:
    • 页面设置的编码格式为UTF-8
    • 把tomcat在获取流数据之前的编码设置为UTF-8
    • 通过request.setCharacterEncoding(“UTF-8”)设置编码,UTF-8也可以写成小写

image-20240118172657212

解决方案

设置输入流编码

request.setCharacterEncoding("UTF-8");

重新发送POST请求,就会在控制台看到正常展示的中文结果。

6、Request请求转发

请求转发(forward):一种在服务器内部的资源跳转方式。

image-20240118182852432

​ 浏览器发送请求给服务器,服务器中对应的资源A接收到请求,资源A处理完请求后将请求发给资源B,资源B处理完后将结果响应给浏览器,请求从资源A到资源B的过程就叫请求转发

实现方式

request.getRequestDispatcher("资源B路径").forward(request,response)

代码演示

1.创建一个Aservlet类,接收/a的请求,在doGet方法中打印a请求,同时进行请求转发

@WebServlet(value = "/a")
public class AServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("a 请求");

        // 请求转发
        request.getRequestDispatcher("b").forward(request,response);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
    }
}

2.创建一个Bservlet类,接收/b的请求,在doGet方法中打印b请求

@WebServlet(value = "/b")
public class BServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("b 请求");

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
    }
}

3、启动tomcat访问a资源

image-20240118183919823

请求转发资源间共享数据:使用Request对象

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

  • 存储数据到request域[范围,数据是存储在request对象]中
void setAttribute(String name,Object o);
  • 根据key获取值
Object getAttribute(String name);
  • 根据key删除该键值对
void removeAttribute(String name);

接着上个需求来:

1、在a请求转发前保存资源

@WebServlet(value = "/a")
public class AServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("a 请求");

        // 保存数据到request中,要在请求转发之前
        request.setAttribute("name","张三");

        // 请求转发
        request.getRequestDispatcher("b").forward(request,response);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
    }
}

2、在b资源获取数据

@WebServlet(value = "/req03")
public class request02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1、获取map集合
        Map<String, String[]> parameterMap = request.getParameterMap();
        parameterMap.forEach((key,values)->{
            System.out.println(key+"::"+ Arrays.toString(values));
        });

        // 2、根据参数名称获取参数值
        String username = request.getParameter("username");
        System.out.println(username);

        // 3、根据参数名称获取参数数组
        String[] hobbies = request.getParameterValues("hobby");
        System.out.println(Arrays.toString(hobbies));

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        doGet(request,response);
    }
}

请求转发的特点

  • 浏览器地址栏路径不发生变化

  • 只能转发到当前服务器的内部资源,不能从一个服务器通过转发访问另一台服务器

  • 一次请求,可以在转发资源间使用request共享数据

7、Response的响应状态码和响应头

HTTP响应数据总共分为三部分内容,分别是响应行、响应头、响应体,对于这三部分内容的数据,respone对象都提供了哪些方法来进行设置?

响应行

image-20240118190136774

对于响应头,比较常用的就是设置响应状态码:

void setStatus(int sc);

响应头

1628859051368

设置响应头键值对:

void setHeader(String name,String value);

响应体

1628859268095

对于响应体,是通过字符、字节输出流的方式往浏览器写

获取字符输出流:

PrintWriter getWriter();

获取字节输出流

ServletOutputStream getOutputStream();

代码演示

@WebServlet(value = "/resp1")
public class response01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1、设置响应行
        response.setStatus(200);
        // 2、设置响应头
        response.setHeader("Content-Type","text/html");

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
    }
}

8、Response重定向

Response重定向(redirect):一种资源跳转方式。

image-20240118191235497

  1. 浏览器发送请求给服务器,服务器中对应的资源A接收到请求
  2. 资源A现在无法处理该请求,就会给浏览器响应一个302的状态码+location的一个访问资源B的路径
  3. 浏览器接收到响应状态码为302就会重新发送请求到location对应的访问地址去访问资源B
  4. 资源B接收到请求后进行处理并最终给浏览器响应结果

这整个过程就叫重定向

实现方式

方法一:

response.setStatus(302);
response.Header("location","资源B的路径")

方法二:

response.sendRedirect("资源B的路径")

代码实现

创建CServlet,输出C并重定向到D

@WebServlet(value = "/c")
public class CServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("C请求");
        //设置重定向
        response.sendRedirect("d");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
    }
}

创建DSelvet,输出D

@WebServlet(value = "/d")
public class DServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("D请求");

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
    }
}

重定向的特点

  • 浏览器地址栏路径发送变化

    当进行重定向访问的时候,由于是由浏览器发送的两次请求,所以地址会发生变化

    1628861893130

  • 可以重定向到任何位置的资源(服务内容、外部均可)

    因为第一次响应结果中包含了浏览器下次要跳转的路径,所以这个路径是可以任意位置资源。

  • 两次请求,不能在多个资源使用request共享数据

    因为浏览器发送了两次请求,是两个不同的request对象,就无法通过request对象进行共享数据

介绍完请求重定向和请求转发以后,接下来需要把这两个放在一块对比下:

image-20240118192353751

9、Response响应字符数据

实现方式

1、通过response对象获取字符输出流

PrintWriter writer = response.getWriter();

2、写数据

writer.writer("aaa");

注意:

  • 该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭

  • 中文数据乱码:原因通过Response获取的字符输出流默认:ISO-8859-1

    response.setContentType("text/html;charset=utf-8");
    

代码演示

@WebServlet(value = "/resp2")
public class respon02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1、获取响应输出流
        PrintWriter writer = response.getWriter();
        // 2、写数据
        writer.write("aaa");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
    }
}

10、Response响应字节输出流

实现方式

1、通过Response对象获取字节输出流

ServletOutStream outputStream = response.getOutputStream();

2、写数据

outputStream.write("字节数据");

代码演示

@WebServlet(value = "/resp3")
public class response3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1、获取字节输入流
        FileInputStream fileInputStream = new FileInputStream("D:\\file\\java\\response-request\\src\\main\\webapp\\imgs\\Desert.jpg");

        // 2、获取字节输出流
        ServletOutputStream outputStream = response.getOutputStream();

        // 3、写数据
        byte[] bytes = new byte[1024 * 8];
        int len;
        while ((len = fileInputStream.read(bytes)) != -1){
            outputStream.write(bytes,0,len);
        }

        fileInputStream.close();
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
    }
}

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

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

相关文章

关于linux 救援模式出现xfs 文件系统挂载报 bad supperblock

关于linux 救援模式出现xfs 文件系统挂载报 bad supperblock 一种情况说明 挂载ISO文件进入救援模式&#xff0c;无法挂载XFS文件系统&#xff0c;xfs_repair也是报未知的超级块 使用 xfs_info 可以取到 xfs文件系统分区信息 xfs_db -c “sb 0” -c “p” $your_xfs_dev 也能…

2024年【建筑电工(建筑特殊工种)】考试报名及建筑电工(建筑特殊工种)免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 建筑电工(建筑特殊工种)考试报名是安全生产模拟考试一点通总题库中生成的一套建筑电工(建筑特殊工种)免费试题&#xff0c;安全生产模拟考试一点通上建筑电工(建筑特殊工种)作业手机同步练习。2024年【建筑电工(建筑特…

HarmonyOS 转场动画 ForEach控制

本文 我们继续说组件的专场特效 上文 HarmonyOS 转场动画 我们通过if控制了转场效果 本文 我们通过 ForEach 控制它的加载和删除 这时候就有人会好奇 ForEach 怎么控制删除呢&#xff1f; 很简单 循环次数不同 例如 第一次 10个 第二次 5个 那么后面的五个就相当于删除啦 我们…

ubuntu开放ssh服务

&#x1f4d1;前言 本文主要是【ubuntu】——ubuntu开放ssh服务的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一…

由于找不到d3dcompiler_43.dll缺失,无法打开软件的解决方法分享

d3dcompiler43.dll是什么文件&#xff1f;为什么会出现丢失的情况&#xff1f;又该如何解决呢&#xff1f;本文将详细介绍d3dcompiler43.dll的作用和影响&#xff0c;并提供6个有效的解决方法。 一、d3dcompiler43.dll是什么文件&#xff1f; d3dcompiler43.dll是DirectX SDK…

Linux网络--- SSH服务

一、ssh服务简介 1、什么是ssh SSH&#xff08;Secure Shell&#xff09;是一种安全通道协议&#xff0c;主要用来实现字符界面的远程登录、远程复制等功能。SSH 协议对通信双方的数据传输进行了加密处理&#xff0c;其中包括用户登录时输入的用户口令&#xff0c;SSH 为建立在…

linux 更新镜像源

打开终端&#xff0c;备份一下旧的 源 文件&#xff0c;以防万一 cd /etc/apt/ ls sudo cp sources.list sources.list.bak ls然后打开清华大学开源软件镜像站 搜索一下你的linux发行版本&#xff0c;我这里是ubuntu发行版本 点击这个上面图中的问号 查看一下自己的版本号&a…

Docker之nacos的安装和使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Docker之Dockerfile构建镜像》。&#x1f3af;&…

推荐 10 个基于 Stable Diffusion 的 AI 绘画网站

在当今快速发展的人工智能领域&#xff0c;AI 绘画已经成为一个不可忽视的趋势。特别是基于 Stable Diffusion 技术的 AI 绘画工具&#xff0c;以其强大的图像生成能力和丰富的创意潜力吸引了众多艺术家和设计师的目光。对于那些热爱艺术创作&#xff0c;但又缺乏专业绘画技巧的…

滚动菜单ListView

activity_main.xml <include layout"layout/title"/> 引用上章自定义标题栏 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app&qu…

拿出最少数目的魔法豆

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 请你从每个袋子中 拿出 一些豆子&#xff08;也可以 不拿出&#xff09;&#xff0c;使得剩…

【学习总结】动力学方程的龙格库塔积分法(含具体例子与代码)

本文仅用于个人学习总结&#xff0c;如有错误请批评指正。 参考资料 徐超江等&#xff0c;常微分方程基础教程&#xff0c;高等教育出版社&#xff0c;2023年。 1、欧拉法 1.1 前向欧拉 欧拉积分部分不用展开介绍&#xff0c;较为简单。直接拍照课本。 1.2 梯形法/隐式格式…

WebX代码和接口文档自动生成器

朋友最近自己搞了一个代码和接口文档自动生成平台WebX。大家有兴趣可以体验一下。 平台介绍地址&#xff1a;WebX平台

“深入理解网络科学与自定义网络构建“

目录 深入理解网络科学与自定义网络构建网络概念1.1 什么是网络&#xff1f;子网掩码网关规则 网络模式docker网络配置bridge模式host模式 none模式使用自定义网络结语 深入理解网络科学与自定义网络构建 网络概念 1.1 什么是网络&#xff1f; 在计算机科学中&#xff0c;网…

高精度AGV小车N/S极磁条导航传感器CNS-MGS-080N参数配置操作方法

高精度AGV小车N/S极磁条导航传感器CNS-MGS-080N主要运用于自主导航机器人、室内室外巡检机器人、自主导航运输车AGV(AGC)、自动手推车等自主导航设备&#xff0c;完成自主导航设备的预设运行路线检测及定位。基于预设磁轨迹的导航方式是自主移动平台如AGV、巡检机器人、无轨货架…

群晖Drive搭建云同步服务器结合内网穿透实现Obsidian笔记文件远程多端同步

文章目录 一、简介软件特色演示&#xff1a; 二、使用免费群晖虚拟机搭建群晖Synology Drive服务&#xff0c;实现局域网同步1 安装并设置Synology Drive套件2 局域网内同步文件测试 三、内网穿透群晖Synology Drive&#xff0c;实现异地多端同步Windows 安装 Cpolar步骤&#…

ros2 基础学习16 - RQT:模块化可视化工具

RQT&#xff1a;模块化可视化工具 ROS中的Rviz功能已经很强大了&#xff0c;不过有些场景下&#xff0c;我们可能更需要一些简单的模块化的可视化工具&#xff0c;比如只显示一个摄像头的图像&#xff0c;使用Rviz的话&#xff0c;难免会觉得操作有点麻烦。 此时&#xff0c;我…

如何获取一个德国容器

1.注册discord账号 discord注册网址&#xff1a;https://discord.com/ 下面是容器的discord邀请链接 https://discord.com/Discord邀请链接&#xff1a;https://discord.com/invite/jVMSWrchC4 2.进入discord群聊点击link 在点击网址&#xff0c;这个网址每星期都会变就是图…

基于springboot+vue的在线视频教育平台系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

【驱动】I2C驱动分析(四)-关键API解析

简介 在Linux内核源代码中的driver目录下包含一个i2c目录 i2c-core.c这个文件实现了I2C核心的功能以及/proc/bus/i2c*接口。   i2c-dev.c实现了I2C适配器设备文件的功能&#xff0c;每一个I2C适配器都被分配一个设备。通过适配器访设备时的主设备号都为89&#xff0c;次设备号…