目录

  • Spring Boot 简介
  • Web 入门
    • Spring Boot 快速入门
    • HTTP 协议
      • 概述
      • 请求协议
      • 响应协议
      • 解析协议
    • Tomcat

Spring Boot 简介

Spring Boot 是由 Pivotal 团队(后被 VMware 收购)开发的基于 Spring 框架的开源项目,于 2014 年首次发布。其核心目标是简化 Spring 应用的搭建和开发流程,让开发者能够快速构建独立运行、生产级别的 Spring 应用

核心特点

  1. 自动配置(Auto-configuration)
    • 根据项目中的依赖(如 spring-boot-starter-web),自动完成相关组件的配置,减少手动 XML 或 Java 配置。
    • 例如:引入 spring-boot-starter-web 后会自动配置 Spring MVC、Tomcat 等。
  2. 独立运行(Standalone)
    • 内置 Servlet 容器(Tomcat、Jetty 等),无需外部部署。
    • 可通过 java -jar 启动整个应用,适合容器化部署。
  3. Starter 依赖管理
    • 提供丰富的 starter 模块(如 starter-data-jpastarter-security),一行依赖即可集成常用技术。
    • 统一版本管理,避免冲突和繁琐配置。
  4. 无 XML 配置,注解驱动
    • 使用注解(如 @SpringBootApplication@RestController)代替传统 XML,降低配置复杂度。
    • 默认配置 + 注解方式提升开发效率。
  5. 生产级特性
    • 提供如 Actuator、健康检查、外部化配置、指标监控等功能,便于部署和运维。

适用场景

  • 快速构建微服务中的独立服务
  • 构建 RESTful API 或传统 Web 应用
  • 中小型项目的敏捷开发与快速部署
  • 与第三方中间件(如 MyBatis、Redis、RabbitMQ)集成开发

与 Spring 的关系

  • Spring Boot 并不是替代 Spring,而是对其的增强和封装。

  • 它基于 Spring 的核心特性(如 IoC、AOP),并提供自动配置、内嵌容器、starter 依赖等扩展能力。

  • 可理解为:

    Spring Boot = Spring + 自动配置 + 内嵌容器 + Starter 模块

优势总结

  • 开发效率高:最小化配置,聚焦业务逻辑
  • 上手门槛低:统一结构和约定优于配置
  • 可维护性强:自动管理依赖与版本
  • 生态整合好:天然支持 Spring Cloud 等微服务组件

Web 入门

Spring Boot 快速入门

需求:使用 Spring Boot 开发一个 web 应用,浏览器发起请求“/hello”后,给浏览器返回字符串"Hello World ~"

在这里插入图片描述

步骤:

  1. 创建 Spring Boot 工程,并勾选 web 开发相关依赖

    在这里插入图片描述

  2. 定义 HelloController 类,添加方法 hello,并添加注解

    在这里插入图片描述

    package com.example.demo.controller;import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;// 请求处理类
    @RestController
    public class HelloController {@RequestMapping("/hello")public String hello() {return "Hello World~";}
    }
    
  3. 运行测试

    在这里插入图片描述

    运行启动类,并在浏览器中输入“localhost:8080/hello”

    在这里插入图片描述

HTTP 协议

概述

概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。

特点:

  1. 基于 TCP 协议:面向连接,安全
  2. 基于请求-响应模型——一次请求对应一次响应
  3. HTTP 协议是无状态的协议:
    • 对于事务处理没有记忆能力,每次请求-响应都是独立的
    • 缺点:多次请求间不能共享数据
    • 优点:速度快

请求协议

  1. 结构组成

    • 请求行:首行,格式 [请求方法] [资源路径] [协议/版本]
      例:GET /brand/findAll?name=OPPO&status=1 HTTP/1.1

    • 请求头:从第二行开始,key: value 格式,传递元信息(如客户端类型、支持的数据格式等)
      例:Content-Type: application/json(声明请求体数据格式)

    • 请求体:仅 POST 请求有,存放请求参数(GET 请求参数在请求行的 URL 里)
      例:{"status":1,"brandName":"Scarletkite"...}(JSON 格式参数)

  2. 请求方式差异(GET vs POST)

对比项GET 请求POST 请求
参数位置拼在请求行的 URL 中(?name=OPPO...放在请求体里(适合复杂 / 私密数据)
参数大小限制有(浏览器 / 服务器对 URL 长度有限制)无(理论上仅受服务器配置影响)
典型场景查询数据(如列表查询、搜索)提交 / 修改数据(如新增品牌、用户登录)
  1. 核心总结

    • 清晰 HTTP 请求的 “三段式” 结构,理解 请求行(做什么)请求头(怎么传)请求体(传什么) 的分工

    • 区分 GET/POST 适用场景,开发 / 调试接口时能选对方式、解析对应参数位置

响应协议

  1. 结构组成

    响应由 3 部分 组成,从上到下依次是:

    • 响应行:首行,格式 [协议/版本] [状态码] [状态描述]
      例:HTTP/1.1 200 OK(协议 HTTP/1.1,状态码 200,描述 OK)
    • 响应头key: value 格式,传递元信息(如内容类型、缓存策略等)
      例:Content-Type: application/json(响应体是 JSON 格式)
    • 响应体:最后部分,存放实际响应数据(如接口返回的 JSON、HTML 内容 )
  2. 状态码分类与含义

    状态码是响应行的核心,用 1xx ~ 5xx 分类表示请求处理结果:

分类含义 & 典型场景示例状态码(常见)
1xx临时响应,表示请求已接收,需后续操作(实际开发少用,如 100 Continue)
2xx成功!请求被正常处理200(最常用,请求成功)
3xx重定向!需要客户端再发一次请求302(临时重定向)、304(资源未变,用缓存)
4xx客户端错误!请求有问题(如参数错、没权限)400(参数错)、404(资源不存在)、403(权限不足)
5xx服务器错误!服务端处理时出错500(代码抛异常)、503(服务未就绪)
  1. 常见响应头的作用

    响应头传递 “辅助信息”,常用字段:

    • Content-Type:响应体的数据格式(如 application/json 表示返回 JSON)

    • Content-Length:响应体的字节长度

    • Cache-Control:控制客户端缓存策略(如 max-age=300 表示缓存 300 秒)

    • Set-Cookie:给浏览器设置 Cookie

  2. 核心总结

    HTTP 响应分 “响应行(状态码核心)→ 响应头(传元信息)→ 响应体(传实际数据)” 三段,状态码用 1~5 开头区分 “临时、成功、重定向、客户端错、服务器错”,响应头补充数据格式、缓存等细节,最终通过响应体返回业务数据

解析协议

浏览器自带了 HTTP 协议解析功能。浏览器在用户发起网页访问等操作时,会自动进行一系列与 HTTP 协议相关的操作。而服务端要实现 HTTP 协议解析功能,要手搓以下代码,就显得很麻烦。

import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;public class SimpleHttpServer {public static void main(String[] args) throws IOException {// 创建服务器Socket,监听8080端口ServerSocket serverSocket = new ServerSocket(8080);System.out.println("服务器已启动,监听端口: 8080");while (true) {// 等待客户端连接Socket clientSocket = serverSocket.accept();System.out.println("新客户端连接: " + clientSocket.getInetAddress());// 处理客户端请求handleClient(clientSocket);}}private static void handleClient(Socket clientSocket) throws IOException {try (// 获取输入流,读取客户端请求BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(), StandardCharsets.UTF_8));// 获取输出流,向客户端发送响应OutputStream out = clientSocket.getOutputStream()) {// 读取请求行String requestLine = in.readLine();if (requestLine == null) {return;}System.out.println("请求行: " + requestLine);// 读取请求头String headerLine;while ((headerLine = in.readLine()) != null && !headerLine.isEmpty()) {System.out.println("请求头: " + headerLine);}// 构建响应内容String responseBody = "<html><body><h1>Hello, HTTP!</h1><p>这是一个简单的HTTP响应</p></body></html>";// 构建响应头String response = "HTTP/1.1 200 OK\r\n" +"Content-Type: text/html; charset=UTF-8\r\n" +"Content-Length: " + responseBody.getBytes(StandardCharsets.UTF_8).length + "\r\n" +"Connection: close\r\n" +"\r\n" +  // 空行分隔响应头和响应体responseBody;// 发送响应out.write(response.getBytes(StandardCharsets.UTF_8));out.flush();} finally {clientSocket.close();System.out.println("客户端连接已关闭");}}
}

由于以上解析是固定的,所以出现了 Web 服务器,Web 服务器是一个软件程序,对 HTTP 协议的操作进行封装,使得程序员不必直接对协议进行操作,让 Web 开发更加便捷。主要功能是“提供网上信息浏览服务”。

Tomcat

Tomcat(全称 Apache Tomcat)是由 Apache 软件基金会开发和维护的一款 开源的 Web 服务器与 Servlet 容器,用于运行基于 Java 的 Web 应用程序。它广泛应用于中小型企业和开发测试环境中,是学习和部署 Java Web 的首选服务器。

Spring Boot 内置了 Tomcat,默认使用的是 org.apache.catalina.startup.Tomcat 启动类,实现嵌入式部署:

@SpringBootApplication
public class App {public static void main(String[] args) {SpringApplication.run(App.class, args);}
}

可以通过配置文件指定端口:

server:port: 8080

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

laravel chunkById导出数据乱序问题

2025年7月28日17:47:29 这几天在做数据导出优化&#xff0c;使用xlswriter作为导出组件&#xff0c;但是发现在 使用 $base->chunkById(2000, function ($list) use ($writer, $sheet1) { 发现导出的数据是乱的&#xff0c;偶尔有些重复&#xff0c;偶尔有些少了&#xff0c…

Spring IOC与DI

spring的两大思想:IOC与AOP一、ioc的概念什么叫控制翻转?之前:对象的使用方,创建对象,对象的控制权,在对象的使用方手中.spring:对象的控制权交给了spring.举个例子:智能驾驶,之前车的使用权在人手中,而现在在ai手中,这就是控制反转.什么叫ioc:之前车企生产车需要做整个车,费事…

【图像处理基石】Segment Anything Model (SAM) 调研

Segment Anything Model (SAM) 是由 Meta AI 开发的革命性图像分割模型,它能够对图像中的任何物体进行分割,无需针对特定类别进行训练。SAM 具有以下特点: 通用性:可以分割任何视觉对象,无论是否见过该类别 灵活性:支持多种输入提示(点、框、掩码或文本) 实时性:在普通…

unisS5800XP-G交换机配置命令之端口篇

一、批量配置端口(1) 进入系统视图。system-view(2) 指定接口范围&#xff0c;并进入接口批量配置视图。¡ 指定一个不带别名的接口列表。interface range { interface-type interface-number [ to interface-type interface-number ] } &<1-24>¡…

MySQL中的 redolog

什么是redo log如果我们只在内存的 Bufer Pool中修改了页面&#xff0c;假设在事务提交后突然发生了某个故障导致内存中的数据都失效了&#xff0c;那么这个已经提交的事务在数据库中所做的更改也就跟着丢失了&#xff0c;这是我们所不能忍受的。那么&#xff0c;如何保证这个持…

数据结构之 【排序】(非递归实现快速排序)

目录 1.引入 2.非递归实现快排的思想 3.非递归实现快排图解 4.完整代码 1.引入 递归不可避免的话题就是防止栈溢出 所以程序员需要具备递归改非递归的能力 &#xff0c;一般来说&#xff0c;抓住递归中变化的量是关键 void QuickSort(int* a, int left, int right){if (left…

CLAP文本-音频基础模型: LEARNING AUDIO CONCEPTS FROM NATURAL LANGUAGE SUPERVISION

一、TL&#xff1b;DR 现在的做法有什么问题&#xff1f;主流范式是 “一个类别标签对应多个录音”&#xff0c;需要提前标注预测预先定义的类别&#xff0c;只能做闭集理解&#xff0c;失去灵活性 我们怎么做&#xff1f;通过两个编码器和对比学习机制建立语言与音频的关联&a…

Flink2.0学习笔记:Stream API 常用转换算子

EC0720/FLINKTASK-TEST-STREAM/demo at master stevensu1/EC0720 先看测试效果&#xff1a;控制台 测试效果&#xff1a;监控服务端 主要的转换算子包括&#xff1a; 转换算子 filter:过滤包含“Flink”的输入 转换算子 map: 将每行数据前添加“Processed: ”并转为大写 转…

一、Python环境、Jupyter与Pycharm

安装Python由于RAG项目中所需要的Python版本必须高于3.8&#xff0c;经过筛选&#xff0c;最终选择了3.10.11这个版本py --version Python 3.10.11安装过程略过&#xff0c;但对于几个基础的命令作个笔记记录where python找到python启动器的位置D:\>where python C:\Users\x…

Flink CEP 动态模板与规则动态修改实践完全手册

1. Flink CEP:从静态规则到动态江湖 Flink 的复杂事件处理(CEP)库就像一个武功高强的侠客,能从数据流中精准捕获特定模式,堪称流处理界的“降龙十八掌”。但问题来了:传统 CEP 规则通常是写死在代码里的,就像刻在石碑上的武功秘籍,改起来费劲不说,还得重启应用,简直…

vue3.2 + echarts5.6 + ant-design-vue 3.x 实现自定义 echarts 图例

文章目录概要技术细节效果概要 需求需要实现图例移入显示描述说明 故实现自定义图例 技术细节 <template><div class"custom-legend"><divv-for"item in legends":key"item.name"class"legend-item":class"{ i…

【2025年7月25日】TrollStore巨魔商店恢复在线安装

就在今日7月25日&#xff0c;TrollStore的在线安装功能再次变得可用&#xff0c;这对于许多iPhone用户来说无疑是个喜讯。在经历了近三个月的中断后&#xff0c;巨魔商店的企业证书意外的到来了&#xff0c;使得用户能够重新采用在线安装的方式&#xff01; 在线安装地址在文…

【05】C#入门到精通——C# 面向对象、类、静态变量static、类与类之间的调用

文章目录1 引入例子2 创建类2.1 类的访问属性2.2 英雄 特点类2.3 英雄信息打印3 静态变量static4 类 调用 类4.1 非静态 成员函数4.2 静态 成员函数1 引入例子 比如游戏中 描述英雄的角色&#xff0c; 我们可以像下面这样&#xff0c;给每一个英雄特点及拥有技能分别定义变量…

单片机的硬件结构

单片机的硬件结构 一、课程导入 在上一节课《认识单片机》中&#xff0c;我们知道单片机就像一个超级迷你的工厂&#xff0c;有着类似工厂的各个组成部分。而这个 “迷你工厂” 能正常运转&#xff0c;离不开其内部严谨的硬件结构。就像一座大厦&#xff0c;只有基础结构稳固且…

multiprocessing模块使用方法(二)

spawn_main是Python multiprocessing模块的核心内部函数&#xff0c;用于实现spawn启动方法的子进程初始化。以下结合代码Demo详细说明其使用方法和推荐场景。一、spawn_main的功能与定位核心作用&#xff1a; 在spawn模式下启动子进程&#xff0c;负责进程间通信管道的建立和资…

编程与数学 03-002 计算机网络 07_路由算法

编程与数学 03-002 计算机网络 07_路由算法一、静态路由算法&#xff08;一&#xff09;手工配置路由表的方法&#xff08;二&#xff09;静态路由的优缺点二、动态路由算法原理&#xff08;一&#xff09;距离矢量算法&#xff08;如贝尔曼 - 福特算法&#xff09;&#xff08…

使用Python,OpenCV计算跑图的图像彩色度

使用Python&#xff0c;OpenCV计算跑图的图像彩色度 这篇博客将介绍如何计算跑图里最鲜艳的top25图片和最灰暗的top25图片并显示色彩彩色度值展示。 效果图 以下分别是最鲜艳top25和最灰暗top25对比效果图&#xff1a; 最鲜艳top25效果图&#xff1a; 最灰暗top25效果图…

LeetCode 60:排列序列

LeetCode 60&#xff1a;排列序列问题定义与核心挑战 给定整数 n 和 k&#xff0c;返回集合 {1,2,...,n} 的第 k 个字典序排列。直接生成所有排列再遍历到第 k 个的方法&#xff08;时间复杂度 O(n!)&#xff09;会因 n≥10 时阶乘爆炸而超时&#xff0c;因此需要 数学推导 贪…

亚远景-传统功能安全VS AI安全:ISO 8800填补的标准空白与实施难点

一、为什么需要ISO 8800&#xff1a;传统安全标准的“盲区”传统功能安全&#xff08;ISO 26262&#xff09;• 假设&#xff1a;系统行为可被完整规格化&#xff0c;失效模式可枚举&#xff0c;风险可用概率-危害矩阵量化。• 盲区&#xff1a;对“设计意图正确&#xff0c;但…

菜鸟教程 R语言基础运算 注释 和数据类型

菜鸟教程 R语言基础运算 注释 和数据类型 1.注释 注释主要用于一段代码的解析&#xff0c;可以让阅读者更易理解&#xff0c;编程语言的注释会被编译器忽略掉&#xff0c;且不会影响代码的执行。 一般编程语言的注释分为单行注释与多行注释&#xff0c;但是 R 语言只支持单行注…