基于SpringBootWeb的相关问题解答

张开发
2026/4/7 3:23:49 15 分钟阅读

分享文章

基于SpringBootWeb的相关问题解答
Spring Boot Web简介SpringBootWeb是SpringBoot框架中用于简化Web应用开发的模块整合了SpringMVC模型-视图-控制器和其他Web相关依赖。它通过自动配置和默认约定快速构建基于HTTP协议的RESTful API或传统Web应用。RESTful API是一套设计 Web 接口的规范 / 风格用来统一接口怎么写、怎么命名、怎么调用。用于解决接口混乱、不统一、难维护的问题。核心规则接口地址用名词不用动词用户/users文章/articles用 HTTP 方法表示要做什么操作GET查询POST新增PUT修改DELETE删除这里讲到的接口实际上指的是api接口而不是之前学的Java 语法里的 interface接口例如http://localhost:8080/hellohttp://是协议类型定义客户端与服务器通信的规则localhost是主机名/IP地址8080是端口号指定服务器监听的网络端口/hello是路径或端点由服务器定义的资源标识。端口和路径可通过application.properties修改server.port9090 server.servlet.context-path/apihttp://localhost:8080合起来的意思通过网络规则访问我自己电脑上的 8080 号房间这个房间就是启动的Spring Boot 内置服务器Tomcat这个接口是通过下面代码运行后产生的那个网址。RestController // 这是类 public class XxController { GetMapping(/hello)//网址名 public String hello() { // 这是方法 return xxx; } }RestController把这个类变成一个请求处理类这个方法被GetMapping标记后就变成了一个可以访问的 API 接口所以类是载体接口是功能出口。一个方法对应一个地址名1.自己跑 main 方法方法之间互相调用不需要网址2.给浏览器 / APP / 前端用别人要通过地址找到你所以必须给方法加一个网址GetMappingspringboot跟springbootwebspringboot:是一套快速搭建 Java 项目的框架用于连接数据库写定时任务做消息队列写接口、网页开发桌面程序很少做后端微服务可以把SpringBoot 当成一个 “万能工具箱”里面有各种各样的工具。springbootweb是 SpringBoot 里专门用来做 Web 项目的工具包全称叫spring-boot-starter-web加了它你就能写接口Controller/RestController接收前端请求做前后端交互启动一个内置的 Tomcat 服务器不加它你的 SpringBoot 项目就只是个普通 Java 程序不能接收网页 / 接口请求。只有 SpringBoot不加 webdependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter/artifactId /dependency→ 能运行但不能写接口不能启动网页服务加了 webSpringBoot Web 项目dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency→ 才能写GetMapping这类接口才能启动服务让前端调用spring-boot-starter SpringBoot 核心基础包spring-boot-starter-web内部已经依赖了它所以加了 web 就不用再加那个基础的依赖了它会自动带进来web项目就是能通过网络接收请求、提供接口或页面让浏览器、APP、小程序都能访问的后端服务。Web 项目必须具备的 4 个特征① 有地址URL / IP 端口比如http://localhost:8080https://www.baidu.com没有地址别人找不到你就不是 Web 项目。② 能接收网络请求浏览器、APP、小程序、别的服务都能通过网络给它发消息。比如浏览器输入地址APP 加载首页数据小程序获取用户信息这些都叫请求。③ 能返回内容Web 项目收到请求后会返回东西网页HTML数据JSON图片、文件④ 长期运行不退出普通 Java 程序运行完 main 方法就结束了。Web 项目启动后会一直等着请求不会自己停。springboot中前后端交互方式前端浏览器、Vue、小程序等 ←→ 后端SpringBoot 接口就是用 HTTP/HTTPS 通信的1. 本质就是HTTP 请求 响应前端发HTTP 请求报文GET/POST/PUT/DELETESpringBoot 接收到处理完业务SpringBoot 返回HTTP 响应报文JSON 数据HTTP概念:Hyper Text Transfer Protocol,超文本传输协议规定了浏览器和服务器之间数据传输的规则。特点基于TCP协议面向连接安全基于请求—响应模型一次请求对应一次响应HTTP协议是无状态的协议对于事务处理没有记忆性每次请求响应都是独立的。缺点多次响应请求之间不能共享数据优点速度快连接过程1. 先建立连接TCP 三次握手。在地址栏输入网址敲回车后第一步不是直接发数据而是先 “打招呼” 建立可靠连接。如果是HTTPS还会多一步交换证书、加密密钥之后所有数据都会加密传输别人抓包也看不懂。2. 浏览器发请求HTTP Request浏览器会打包一个请求报文发给服务器请求数据格式为【请求行】 第一行必须有 【请求头】 多行键值对 【空行】 必须有单独一行 【请求体】 可选POST/PUT 才有请求行格式Request Line----请求方式 URL 协议版本请求方式有GET(查数据那页面)POST提交数据登录、注册、上传,PUT等URL就是你访问的路径如/index.html、/api/loginHTTP 请求行里写的那个 URL只是网址的后半截路径端口后那部分协议版本一般是HTTP/1.1或HTTP/2请求头格式Request Headers从第二行开始一堆key: value格式每行一个。Host: www.baidu.com // 必须有目标主机名域名 User-Agent: Chrome/120... // 我是什么浏览器/客户端 Accept: text/html // 我能接收什么类型数据 Content-Type: application/x-www-form-urlencoded // 提交数据格式 Cookie: xxxyyy // 身份凭证 Connection: keep-alive // 保持连接3. 空行必须有而且只能是一行空行作用告诉服务器请求头到此结束下面开始是请求体。没有这个空行服务器会把请求体当成请求头直接报错。请求体格式Request BodyGET 一般没有请求体只有 POST、PUT 等才会带。存放要提交给服务器的数据表单格式usernamezhangsanpassword123456JSON 格式{username:zhangsan,password:123456}GET请求方式请求参数在请求行中没有请求体。请求大小是有限制的。POST请求方式请求参数在请求体中请求大小无限制3. 服务器处理并返回响应服务器收到后解析你要什么资源查文件 / 查数据库 / 跑后端代码生成一个响应报文发回浏览器响应格式【响应行】 第一行必须有 【响应头】 多行键值对 【空行】 必须有单独一行 【响应体】响应行格式协议版本 状态码 状态描述eg: HTTP/1.1 200 OK常见状态码200 OK成功301/302重定向跳转404 Not Found页面找不到500 Internal Server Error服务器崩了403 Forbidden禁止访问401 Unauthorized没登录响应头格式和请求头一样也是一堆key: value服务器告诉浏览器这是什么内容多长用什么编码要不要缓存给你发个 Cookie 等Content-Type: text/html; charsetUTF-8 Content-Length: 1024 Server: nginx Set-Cookie: sessionIdabc123; Cache-Control: no-cache空行必须有和请求一样作用告诉浏览器 “头结束了下面是内容”响应体格式服务器真正返回给你的东西访问网页 → 返回HTML请求接口 → 返回JSON看图片 → 返回图片二进制数据ServerSocket是Java 网络编程中专门用于服务端的核心类位于java.net包下它的唯一使命是监听客户端的连接请求并建立与客户端的通信通道。通道建立后会创建一个 Socket用于读取数据读到一串 HTTP 文本// 1. 创建 ServerSocket监听 8080 端口 ServerSocket serverSocket new ServerSocket(8080); while (true) { // 2. 阻塞等着客户端来连接 Socket socket serverSocket.accept(); // 3. 接到连接交给线程处理 new Thread(() - { // 4. 读取客户端发来的数据HTTP 报文 InputStream input socket.getInputStream(); // 5. 这里开始做 HTTP 解析 // 解析方法、URL、头、体 }).start(); }谁来解析 HTTP你自己写的解析代码或者Tomcat/Jetty 内置的解析器。添加以下依赖就有tomcat解析器dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependencyTomcat 的操作通过socket读取请求报文后开始解析并创建两个HttpServletRequest / HttpServletResponse空对象。把socket中的报文解析后存入HttpServletRequest中。然后Tomcat把这两个对象传给后端写的 Controller / ServletGetMapping(/) public String hello() { return Hello World; }执行代码把运行结果放入HttpServletResponse中Tomcat再拿到HttpServletResponse中的内容取出并自动拼接成响应报文通过socket里的方法发回给浏览器。hppt协议解析http报文都会被解析因为计算机只认二进制和结构化数据不认人类写的文本。浏览器发给服务器的是一段纯文本字符串GET /user?id1 HTTP/1.1 Host: localhost User-Agent: xxx解析方式就是按 HTTP 固定格式一段一段切字符串是一行一行拆分。解析器会先按换行符\r\n把整个报文切成多行拆完之后存入对象中比如java里。请求行String method GET; String url /user?id1; String version HTTP/1.1;请求头Host: localhost → keyHost, valuelocalhost User-Agent: xxx → keyUser-Agent, valuexxx最终成这个样子class HttpRequest { String method; // GET String url; // /user MapString,String headers;//请求头 byte[] body;//请求体 }解析请求体根据请求头里的Content-Length或Transfer-Encoding读取 body 内容。比如Content-Length: 27告诉解析器往后读 27 个字节就是 body读完后放进byte[] body;整个流程 浏览器请求 ↓ ServerSocket 监听并接收连接 ↓ Socket 读取原始 HTTP 文本未解析 ↓ HTTP 解析器Tomcat解析报文生成两个对象 ↓ 根据 URL 找到你写的 Controller 方法并执行 ↓ 生成响应对象 → 拼成 HTTP 响应文本 ↓ 通过 Socket 写回浏览器 ↓ 浏览器解析响应 → 展示页面4. 数据在路上怎么传你看到的是 “一段文字 / 一张图片”但网络上实际是数据被拆成很多小IP 数据包经过路由器、交换机一层层转发到达后再按顺序拼回完整内容这一层是传输层 网络层干的事浏览器和服务器不用关心。5. 浏览器渲染展示浏览器拿到 HTML/CSS/JS 后解析 HTML 生成 DOM 树解析 CSS 生成样式树合成渲染树画出页面JS 执行逻辑、发异步请求AJAX/fetch.断开连接可选用完后可以直接断开TCP 四次挥手也可以保持连接复用它发下一个请求HTTP 长连接总结浏览器通过DNSDNS会把我输入的网址里的域名翻译成ip地址因为电脑跟路由器只认ip地址找到服务器 IP建立TCP 连接HTTPS 再加加密浏览器发HTTP 请求服务器处理后回HTTP 响应数据拆包传输到达后重组浏览器渲染页面网址URL的结构协议:// 域名端口 / 路径参数 #锚点即https://www.baidu.com:8080/s?wdjavapage1#top

更多文章