05 HTTP Tomcat Servlet

news2024/12/24 9:06:58

文章目录

  • HTTP
    • 1、简介
    • 2、请求数据格式
    • 3、响应数据格式
  • Tomcat
    • 1、简介
    • 2、基本使用
    • 3、Maven创建Web项目
    • 4、IDEA使用Tomcat
  • Servlet
    • 1、简介
    • 2、方法介绍
    • 3、体系结构
    • 4、urlPattern配置
    • 5、XML配置

HTTP

1、简介

  1. HTTP概念
    • HyperText Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则
      • 数据传输的规则指的是请求数据和响应数据需要按照指定的格式进行传输
      • 如果想知道具体的格式,可以打开浏览器,点击F12打开开发者工具,点击Network来查看某一次请求的请求数据和响数据具体的格式内容
      • 在浏览器中如果看不到上述内容,需要清除浏览器的浏览数据。chrome浏览器可以使用ctrl+shift+Del进行清除
      • 所以学习HTTP主要就是学习请求和响应数据的具体格式内容
  2. HTTP协议特点
    • 基于TCP协议: 面向连接,安全
      TCP是一种面向连接的(建立连接之前是需要经过三次握手)、可靠的、基于字节流的传输层通信协议,在数据传输方面更安全
    • 基于请求-响应模型:一次请求对应一次响应
    • HTTP协议是无状态协议:对于事物处理没有记忆能力。每次请求-响应都是独立的
      无状态指的是客户端发送HTTP请求给服务端之后,服务端根据请求响应数据,响应完后,不会记录任何信息
      • 优点:速度快
      • 缺点:多次请求间不能共享数据
        可以使用会话技术(Cookie、Session)来解决这个问题

2、请求数据格式

  1. 格式介绍
    请求数据总共分为三部分内容,分别是请求行、请求头、请求体
    • 请求行: HTTP请求中的第一行数据
      • 请求行包含三块内容
      • 分别是 GET[请求方式] /[请求URL路径] HTTP/1.1[HTTP协议及版本]
      • 请求方式有七种,最常用的是GET和POST
    • 请求头: 第二行开始,格式为key: value形式
      • 服务端可以根据请求头中的内容来获取客户端的相关信息
      • 有了这些信息服务端就可以处理不同的业务需求
      • 请求头中会包含若干个属性,常见的HTTP请求头有:
        Host: 表示请求的主机名
        User-Agent: 浏览器版本,例如Chrome浏览器的标识类似Mozilla/5.0 ...Chrome/79,IE浏览器的标识类似Mozilla/5.0 (Windows NT ...)like Gecko;
        Accept:表示浏览器能接收的资源类型,如text/*,image/*或者*/*表示所有;
        Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页;
        Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip, deflate等。
        
    • 请求体: POST请求的最后一部分,存储请求参数
      • GET请求请求参数在请求行中,没有请求体,POST请求请求参数在请求体中
      • GET请求请求参数大小有限制,POST没有

3、响应数据格式

  1. 格式介绍
    响应数据总共分为三部分内容,分别是响应行、响应头、响应体

    • 响应行:响应数据的第一行
      (1)响应行包含三块内容
      (2)分别是 HTTP/1.1[HTTP协议及版本] 200[响应状态码] ok[状态码的描述]
    • 响应头:第二行开始,格式为key:value形式
      (1)响应头中会包含若干个属性
    • 响应体: 最后一部分。存放响应数据
      (1)响应体和响应头之间有一个空行隔开
  2. 响应状态码

    状态码大全:https://cloud.tencent.com/developer/chapter/13553

Tomcat

1、简介

  1. Web服务器

    • Web服务器是一个应用程序(软件)
      (1)对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷
      (2)主要功能是"提供网上信息浏览服务"
  2. Web服务器软件使用步骤

    • 准备静态资源
    • 下载安装Web服务器软件
    • 将静态资源部署到Web服务器上
    • 启动Web服务器使用浏览器访问对应的资源
  3. Tomcat

    • Tomcat是Apache软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范
    • JavaEE: Java Enterprise Edition,Java企业版。指Java企业级开发的技术规范总和。包含13项技术规范:JDBC、JNDI、EJB、RMI、JSP、Servlet、XML、JMS、Java IDL、JTS、JTA、JavaMail、JAF
    • 因为Tomcat支持Servlet/JSP规范,所以Tomcat也被称为Web容器、Servlet容器。Servlet需要依赖Tomcat才能运行
    • Tomcat的官网:https://tomcat.apache.org/

2、基本使用

  1. 启动

    • 双击: bin\startup.bat
  2. 关闭

    • 直接x掉运行窗口:强制关闭[不建议]
    • bin\shutdown.bat:正常关闭
    • ctrl+c: 正常关闭
  3. 配置

    • 修改端口:Tomcat默认的端口是8080,要想修改Tomcat启动的端口号,需要修改 conf/server.xml

      注: HTTP协议默认端口号为80,如果将Tomcat端口号改为80,则将来访问Tomcat时,将不用输入端口号

    • 启动时可能出现的错误

      • Tomcat的端口号取值范围是0-65535之间任意未被占用的端口,如果设置的端口号被占用,启动的时候就会包如下的错误

      • Tomcat启动的时候,启动窗口一闪而过: 需要检查JAVA_HOME环境变量是否正确配置

  4. 部署

    • Tomcat部署项目: 将项目放置到webapps目录下,即部署完成
    • 一般JavaWeb项目会被打包称war包,然后将war包放到Webapps目录下,Tomcat会自动解压缩war文件

3、Maven创建Web项目

  1. Web项目结构
    Web项目的结构分为:开发中的项目和开发完可以部署的Web项目

    • Maven Web项目结构: 开发中的项目
      在这里插入图片描述
    • 开发完成部署的Web项目
      • 开发项目通过执行Maven打包命令package,可以获取到部署的Web项目目录
      • 编译后的Java字节码文件和resources的资源文件,会被放到WEB-INF下的classes目录下
      • pom.xml中依赖坐标对应的jar包,会被放入WEB-INF下的lib目录下
  2. 创建Maven Web项目
    创建方式有两种:使用骨架和不使用骨架

    • 使用骨架
      1.创建Maven项目时,选择使用Web项目骨架

      2.完成项目创建后,删除pom.xml中多余内容

      3.补齐Maven Web项目缺失的目录结构

    • 不使用骨架
      1.创建Maven项目后,在pom.xml设置打包方式为war

      2.补齐Maven Web项目缺失webapp的目录结构

      3.补齐Maven Web项目缺失WEB-INF/web.xml的目录结构

4、IDEA使用Tomcat

在IDEA中集成使用Tomcat有两种方式,分别是集成本地TomcatTomcat Maven插件

  1. 集成本地Tomcat

    • 打开添加本地Tomcat的面板

    • 指定本地Tomcat的具体路径

    • 修改Tomcat的名称,此步骤可以不改,只是让名字看起来更有意义,HTTP port中的端口也可以进行修改,比如把8080改成80

    • 将开发项目部署项目到Tomcat中

      扩展内容: xxx.war和 xxx.war exploded这两种部署项目模式的区别?

      • war模式是将WEB工程打成war包,把war包发布到Tomcat服务器上

      • war exploded模式是将WEB工程以当前文件夹的位置关系发布到Tomcat服务器上

      • war模式部署成功后,Tomcat的webapps目录下会有部署的项目内容

      • war exploded模式部署成功后,Tomcat的webapps目录下没有,而使用的是项目的target目录下的内容进行部署

      • 建议选war模式进行部署,更符合项目部署的实际情况

    • 部署成功后,就可以启动项目

    • 启动成功后,可以通过浏览器进行访问测试

    • 最终的注意事项

  2. Tomcat Maven插件

    • 在pom.xml中添加Tomcat插件

      <build>
          <plugins>
          	<!--Tomcat插件 -->
              <plugin>
                  <groupId>org.apache.tomcat.maven</groupId>
                  <artifactId>tomcat7-maven-plugin</artifactId>
                  <version>2.2</version>
              </plugin>
          </plugins>
      </build>
      
    • 使用Maven Helper插件快速启动项目,选中项目,右键–>Run Maven --> tomcat7:run

    • 如果选中项目并右键点击后,看不到Run Maven和Debug Maven,这个时候就需要在IDEA中下载Maven Helper插件,具体的操作方式为: File --> Settings --> Plugins --> Maven Helper —> Install,安装完后按照提示重启IDEA,就可以看到了

    • Maven Tomcat插件目前只有Tomcat7版本,没有更高的版本可以使用(截止2021年)

    • 使用Maven Tomcat插件,要想修改Tomcat的端口和访问路径,可以直接修改pom.xml

      <build>
          <plugins>
          	<!--Tomcat插件 -->
              <plugin>
                  <groupId>org.apache.tomcat.maven</groupId>
                  <artifactId>tomcat7-maven-plugin</artifactId>
                  <version>2.2</version>
                  <configuration>
                  	<port>80</port><!--访问端口号 -->
                      <!--项目访问路径
      					未配置访问路径: http://localhost:80/tomcat-demo2/a.html
      					配置/后访问路径: http://localhost:80/a.html
      					如果配置成 /hello,访问路径会变成什么?
      						答案: http://localhost:80/hello/a.html
      				-->
                      <path>/</path>
                  </configuration>
              </plugin>
          </plugins>
      </build>
      

Servlet

1、简介

  • 概述

    • Servlet是JavaWeb最为核心的内容,是Java提供的一门动态web资源开发技术
    • 作用:使用Servlet就可以实现,根据不同的登录用户在页面上动态显示不同内容
    • Servlet是JavaEE规范之一,就是一个接口,需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet
  • 快速入门
    需求分析: 编写一个Servlet类,并使用IDEA中Tomcat插件进行部署,最终通过浏览器访问所编写的Servlet程序

    1. 创建Web项目web-demo,导入Servlet依赖坐标

      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <!--
            provided指的是在编译和测试过程中有效,最后生成的war包时不会加入
             因为Tomcat的lib目录中已经有servlet-api这个jar包,如果在生成war包的时候生效就会和Tomcat中的jar包冲突,导致报错
          -->
          <scope>provided</scope>
      </dependency>
      
    2. 创建:定义一个类,实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话

      package com.itheima.web;
      
      import javax.servlet.*;
      import java.io.IOException;
      
      public class ServletDemo1 implements Servlet {
      
          public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
              System.out.println("servlet hello world~");
          }
          public void init(ServletConfig servletConfig) throws ServletException {
      
          }
      
          public ServletConfig getServletConfig() {
              return null;
          }
      
          public String getServletInfo() {
              return null;
          }
      
          public void destroy() {
      
          }
      }
      
    3. 配置:在类上使用@WebServlet注解,配置该Servlet的访问路径

      @WebServlet("/demo1")
      
    4. 访问:启动Tomcat,浏览器中输入URL地址访问该Servlet

      http://localhost:8080/web-demo/demo1
      
  • 执行流程

    • 浏览器发出http://localhost:8080/web-demo/demo1请求,从请求中可以解析出三部分内容,分别是localhost:8080web-demodemo1
      • 根据localhost:8080可以找到要访问的Tomcat Web服务器
      • 根据web-demo可以找到部署在Tomcat服务器上的web-demo项目
      • 根据demo1可以找到要访问的是项目中的哪个Servlet类,根据@WebServlet后面的值进行匹配
    • 找到ServletDemo1这个类后,Tomcat Web服务器就会为ServletDemo1这个类创建一个对象,然后调用对象中的service方法
      • ServletDemo1实现了Servlet接口,所以类中必然会重写service方法供Tomcat Web服务器进行调用
      • service方法中有ServletRequest和ServletResponse两个参数,ServletRequest封装的是请求数据,ServletResponse封装的是响应数据,后期我们可以通过这两个参数实现前后端的数据交互

    Servlet由web服务器创建,Servlet方法由web服务器调用

2、方法介绍

  • 生命周期

    • 生命周期: 对象的生命周期指一个对象从被创建到被销毁的整个过程
    • Servlet运行在Servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:
      • (1)加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象
      • (2)初始化:在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作,该方法只调用一次
      • (3)请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理
      • (4)服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收
  • 方法
    Servlet中总共有5个方法

    • void init(ServletConfig config) :初始化方法,在Servlet被创建时执行,只执行一次
    • void service(ServletRequest req, ServletResponse res):提供服务方法, 每次Servlet被访问,都会调用该方法
    • void destroy() :销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet
    • String getServletInfo() :获取Servlet信息
    • ServletConfig getServletConfig():获取ServletConfig对象
    @WebServlet(urlPatterns = "/demo2",loadOnStartup = 1)
    public class ServletDemo2 implements Servlet {
    	private ServletConfig servletConfig;
    	
        /**
         * (1)初始化方法
         *  1.调用时机:默认情况下,Servlet被第一次访问时,调用
         *      * loadOnStartup: 默认为-1,修改为0或者正整数,则会在服务器启动的时候,调用
         *  2.调用次数: 1次
         */
        public void init(ServletConfig config) throws ServletException {
        	this.servletConfig = config;
            System.out.println("init...");
        }
    
    	// (5)获取ServletConfig对象
    	public ServletConfig getServletConfig() {
            return servletConfig;
        }
    
        /**
         * (2)提供服务
         * 1.调用时机:每一次Servlet被访问时,调用
         * 2.调用次数: 多次
         */
        public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
            System.out.println("servlet hello world~");
        }
    
        /**
         * (3)销毁方法
         * 1.调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁,调用
         * 2.调用次数: 1次
         */
        public void destroy() {
            System.out.println("destroy...");
        }
        
    	//(4)该方法用来返回Servlet的相关信息,没有什么太大的用处,一般返回一个空字符串即可
    	public String getServletInfo() {
    	    return "";
    	}
    
    
    }
    

3、体系结构

在这里插入图片描述
我们更关注的其实只有Servlet接口中的service()方法,通过自定义Servlet继承HttpServlet,创建方式更加简单

@WebServlet("/demo4")
public class ServletDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //TODO GET 请求方式处理逻辑
        System.out.println("get...");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //TODO Post 请求方式处理逻辑
        System.out.println("post...");
    }
}

HttpServlet原理:获取请求方式,并根据不同的请求方式,调用不同的doXxx方法
HttpServlet不仅可以处理GET和POST还可以处理其他五种请求方式

4、urlPattern配置

  • 一个Servlet,可以配置多个urlPattern
    例如:@WebServlet(urlPatterns = {“/demo7”,“/demo8”})

  • urlPattern配置规则

    • 精确匹配

    • 目录匹配

    • 扩展名匹配
      在这里插入图片描述

      如果路径配置的不是扩展名,那么在路径的前面就必须要加/否则会报错
      如果路径配置的是*.do,那么在*.do的前面不能加/,否则会报错

    • 任意匹配

      • //*的区别
      1. " / "会覆盖DefaultServlet" /* "不会
      2. tomcat中的DefaultServlet 用来处理静态资源
      3. 当其他的url-pattern匹配不上时会走DefaultServlet
      4. DefaultServlet被覆盖掉,就会引发请求静态资源的时走自定义的Servlet类,导致静态资源无法被访问

    五种配置的优先级为 精确匹配 > 目录匹配> 扩展名匹配 > /* > /

5、XML配置

  • Servlet从3.0版本后开始支持注解配置
  • 3.0版本前只支持XML配置文件的配置方法
  • XML的配置步骤有两步:
    • 编写Servlet类
    • 在web.xml中配置该Servlet
      	<!-- 
              Servlet 全类名
          -->
          <servlet>
              <!-- servlet的名称,名字任意-->
              <servlet-name>demo13</servlet-name>
              <!--servlet的类全名-->
              <servlet-class>com.itheima.web.ServletDemo13</servlet-class>
          </servlet>
      
          <!-- 
              Servlet 访问路径
          -->
          <servlet-mapping>
              <!-- servlet的名称,要和上面的名称一致-->
              <servlet-name>demo13</servlet-name>
              <!-- servlet的访问路径-->
              <url-pattern>/demo13</url-pattern>
          </servlet-mapping>
      

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

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

相关文章

浏览器打开抽奖系统html

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>在线抽奖 随机选取 自动挑选</title> <script src"https://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script> <style> body {…

【LabVIEW作业篇 - 5】:水仙花数、数组与for循环的连接

文章目录 水仙花数数组与for循环的连接 水仙花数 水仙花数&#xff0c;是指一个3位数&#xff0c;它的每个位上的数字的3次幂之和等于它本身。如371 3^3 7^3 1^3&#xff0c;则371是一个水仙花数。 思路&#xff1a;水仙花数是一个三位数&#xff0c;通过使用for循环&#xf…

代码随想录——打家劫舍(Leetcode198)

题目链接 背包问题 class Solution {public int rob(int[] nums) {if(nums.length 0){return 0;}if(nums.length 1){return nums[0];}int[] dp new int[nums.length];dp[0] nums[0];dp[1] Math.max(nums[0], nums[1]);for(int i 2; i < nums.length; i){dp[i] Mat…

人工智能算法工程师(高级)课程5-图像生成项目之对抗生成模型与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(高级)课程5-图像生成项目之对抗生成模型与代码详解。本文将介绍对抗生成模型&#xff08;GAN&#xff09;及其变体CGAN、DCGAN的数学原理&#xff0c;并通过PyTorch框架搭建完整可运行的代码&am…

Android 15 之如何快速适配 16K Page Size

在此之前&#xff0c;我们通过 《Android 15 上 16K Page Size 为什么是最坑》 介绍了&#xff1a; 什么是16K Page Size为什么它对于 Android 很坑如何测试 如果你还没了解&#xff0c;建议先去了解下前文&#xff0c;然后本篇主要是提供适配的思路&#xff0c;因为这类适配…

算法——滑动窗口(day7)

904.水果成篮 904. 水果成篮 - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a; 根据题意我们可以看出给了我们两个篮子说明我们在开始采摘到结束的过程中只能有两种水果的种类&#xff0c;又要求让我们返回收集水果的最大数目&#xff0c;这不难让我们联想到题目…

Java 面试相关问题(中)——并发编程相关问题

这里只会写Java相关的问题&#xff0c;包括Java基础问题、JVM问题、线程问题等。全文所使用图片&#xff0c;部分是自己画的&#xff0c;部分是自己百度的。如果发现雷同图片&#xff0c;联系作者&#xff0c;侵权立删。 1 基础问题1.1 什么是并发&#xff0c;什么是并行&#…

Python爬虫知识体系-----Urllib库的使用

数据科学、数据分析、人工智能必备知识汇总-----Python爬虫-----持续更新&#xff1a;https://blog.csdn.net/grd_java/article/details/140574349 文章目录 1. 基本使用2. 请求对象的定制3. 编解码1. get请求方式&#xff1a;urllib.parse.quote&#xff08;&#xff09;2. ur…

数驭未来,景联文科技构建高质大模型数据库

国内应用层面的需求推动AI产业的加速发展。根据IDC数据预测&#xff0c;预计2026年中国人工智能软件及应用市场规模会达到211亿美元。 数据、算法、算力是AI发展的驱动力&#xff0c;其中数据是AI发展的基石&#xff0c;中国的数据规模增长速度预期将领跑全球。 2024年《政府工…

【WAF剖析】10种XSS某狗waf绕过姿势,以及思路分析

原文&#xff1a;【WAF 剖析】10 种 XSS 绕过姿势&#xff0c;以及思路分析 xss基础教程参考&#xff1a;https://mp.weixin.qq.com/s/RJcOZuscU07BEPgK89LSrQ sql注入waf绕过文章参考&#xff1a; https://mp.weixin.qq.com/s/Dhtc-8I2lBp95cqSwr0YQw 复现 网站安全狗最新…

[数据集][目标检测]野猪检测数据集VOC+YOLO格式1000张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1000 标注数量(xml文件个数)&#xff1a;1000 标注数量(txt文件个数)&#xff1a;1000 标注…

如何查看jvm资源占用情况

如何设置jar的内存 java -XX:MetaspaceSize256M -XX:MaxMetaspaceSize256M -XX:AlwaysPreTouch -XX:ReservedCodeCacheSize128m -XX:InitialCodeCacheSize128m -Xss512k -Xmx2g -Xms2g -XX:UseG1GC -XX:G1HeapRegionSize4M -jar your-application.jar以上配置为堆内存4G jar项…

Web前端:HTML篇(二)元素属性

HTML 属性 属性是 HTML 元素提供的附加信息。 HTML 元素可以设置属性属性可以在元素中添加附加信息属性一般描述于开始标签属性总是以名称/值对的形式出现&#xff0c;比如&#xff1a;name"value"。 属性实例 HTML 链接由 <a> 标签定义。链接的地址在 href …

如何开启或者关闭 Windows 安全登录?

什么是安全登录 什么是 Windows 安全登录呢&#xff1f;安全登录是 Windows 附加的一个组件&#xff0c;它可以在用户需要登录的之前先将登录界面隐藏&#xff0c;只有当用户按下 CtrlAltDelete 之后才出现登录屏幕&#xff0c;这样可以防止那些模拟登录界面的程序获取密码信息…

来聊聊redis集群数据迁移

写在文章开头 本文将是笔者对于redis源码分析的一个阶段的最后一篇&#xff0c;将从源码分析的角度让读者深入了解redis节点迁移的工作流程&#xff0c;希望对你有帮助。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的 java coder &#xff0c;是 CS…

JavaScript青少年简明教程:赋值语句

JavaScript青少年简明教程&#xff1a;赋值语句 赋值语句&#xff08;assignment statement&#xff09; JavaScript的赋值语句用于给变量、对象属性或数组元素赋值。赋值语句的基本语法是使用符号 () 将右侧的值&#xff08;称为“源操作数”&#xff09;赋给左侧的变量、属…

Docker Minio rclone数据迁移

docker minio进行数据迁移 使用rclone进行数据迁移是一种非常灵活且强大的方式&#xff0c;特别是在处理大规模数据集或跨云平台迁移时。rclone是一款开源的命令行工具&#xff0c;用于同步文件和目录到多种云存储服务&#xff0c;包括MinIO。下面是使用rclone进行数据迁移至Mi…

【RT摩拳擦掌】RT600 4路音频同步输入1路TDM输出方案

【RT摩拳擦掌】RT600 4路音频同步输入1路TDM输出方案 一&#xff0c; 文章简介二&#xff0c;硬件平台构建2.1 音频源板2.2 音频收发板2.3 双板硬件连接 三&#xff0c;软件方案与软件实现3.1 方案实现3.2 软件代码实现3.2.1 4路I2S接收3.2.2 I2S DMA pingpong配置3.2.3 音频数…

卧室激光投影仪推荐一下哪款效果最好?当贝X5S亮度卧室开灯照样清晰

现在家庭卧室装投影仪也不是什么稀奇的事情了&#xff0c;外面客厅看电视机&#xff0c;里面卧室投影仪直接投白墙各有各的优势。躺在卧室的床上&#xff0c;看超大屏投影真的很惬意。卧室投影的品类比较多&#xff0c;有些价格便宜的投影宣传说卧室看很适合&#xff0c;其实不…

设计模式12-构建器

设计模式12-构建器 由来和动机原理思想构建器模式的C代码实现构建器模式中的各个组件详解1. 产品类&#xff08;Product&#xff09;2. 构建类&#xff08;Builder&#xff09;3. 具体构建类&#xff08;ConcreteBuilder&#xff09;4. 指挥者类&#xff08;Director&#xff0…