SpringBoot : ch06 整合 web (一)
前言
SpringBoot作为一款优秀的框架,不仅提供了快速开发的能力,同时也提供了丰富的文档和示例,让开发者更加容易上手。在本博客中,我们将介绍如何使用SpringBoot来整合Web应用程序的相关技术,并通过实例代码来演示如何实现这些功能。本篇博客是系列文章的第一篇,主要介绍SpringBoot整合Web模块的概述和基础知识,方便读者进一步深入学习和应用。
本次案例将介绍SpringBoot整合 Web 的入门案例,包括修改默认服务器的端口号以及对静态资源的访问和 controller 的编写!
一、前期准备
1、新建项目,结构如下

2、导入依赖
<!-- 这个 starter 默认集成了 webmvc、内嵌 tomcat 容器、json 工具等默认的内嵌容器支持三种:tomcat、jetty、undertow如果要切换其他的内嵌容器,必须将默认的 tomcat 容器先排除,在进行其他容器的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><!-- 先移除内嵌的 tomcat 模块 --><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><!-- 重新依赖 undertow 内嵌容器 或者 jetty --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
二、介绍项目

我们查看我们添加的依赖,在pom文件中我已经修改了使用的服务器,默认是使用tomcat的,我改为了 undertow 的服务器。是不是觉得很神奇,为什么会有一个依赖是服务器的呢?我们的服务器不是需要自己一步一步去添加进来,然后再一步一步去部署我们的web项目,然后才能运行的吗?
注意:那是没学 springboot 之前的做法,现在我们学习了springboot后,就不需要自己去配置服务器了,也不用部署我们的web项目到服务器中运行。现在!!!只需要在pom文件中添加一个依赖即可以直接把我们的web项目跑起来啦!!!
三、运行web项目
该怎么运行我们的web项目呢?
很简单,只需要运行我们的Ch06Application就可以了。

这是运行后的控制台,在控制台输出的信息中可以看到服务器的名称以及我们的端口号。那怎么访问这个地址呢?
很简单,在浏览器中输入 localhost:8080 就OK啦!

当Spring Boot应用程序无法找到与请求URL匹配的映射时,它会使用默认的错误处理机制来返回一个Whitelabel错误页面。这个Whitelabel错误页面是Spring Boot提供的一个默认页面,用于显示简单的错误信息。
根据提供的信息,应用程序确实没有编写任何页面,所以在发生404错误时,Spring Boot会显示这个默认的Whitelabel错误页面。
四、编写 application.yml 修改服务器的端口号
# 可以设置内嵌容器的端口,默认都是 8080
server:port: 8088servlet:# 项目访问的上下文路径context-path: /ch06# 启用字符编码过滤器encoding:enabled: truecharset: UTF-8force: true
通过将
server.port属性设置为8088,你的应用程序将在该端口上监听HTTP请求。请确保该端口未被其他进程占用。此外,你还可以看到在
servlet下的context-path属性设置为/ch06,这将为你的应用程序添加一个上下文路径,即访问你的应用程序需要在URL中添加/ch06前缀。
我们再次运行项目,这次就是以新端口号访问了:

五、在 static 文件夹中编译一个 html页面
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h2>springboot index</h2>
</body>
</html>
刚刚没有页面我们访问的时候报了404错误,现在我们有页面了,而且还是在 static 包下的静态资源文件,之前我们使用 springMvc 访问静态资源文件的时候需要通过配置使用默认的 servlet 或者指定静态资源文件的路径来访问静态资源。那我们现在使用 springboot 没有任何的静态资源文件的配置,我们来运行看看能不能访问到这个页面。
运行:
1、我们没有配置为什么还能够访问静态资源呢?
Spring Boot可以直接访问静态资源的HTML页面是因为它内置了对静态资源的默认处理机制。当你在Spring Boot应用程序的
src/main/resources/static目录下放置HTML页面或其他静态资源(如CSS、JavaScript文件)时,这些资源将会被自动映射到根路径下。例如,如果在
src/main/resources/static目录下创建了一个名为index.html的HTML页面,那么在启动Spring Boot应用程序后,你可以通过http://localhost:8088/ch06/index.html直接访问这个HTML页面,而无需编写额外的Controller来处理这个请求。这种默认的静态资源处理机制使得在Spring Boot应用程序中提供静态内容变得非常简单和方便,尤其适用于构建简单的Web应用或原型展示。
2、访问 public 下的静态资源文件
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>访问public目录的静态资源</h1>
</body>
</html>
运行:

Spring Boot可以直接访问public目录下的静态资源的HTML页面是因为它内置了对静态资源的默认处理机制。在Spring Boot应用程序中,你可以将静态资源文件(如HTML、CSS、JavaScript等)放置在
src/main/resources/static目录下或者src/main/resources/public目录下,这两个目录都是Spring Boot框架默认映射静态资源的目录。因此,在public目录下放置的静态资源将被自动映射到根路径下。例如,如果你在
src/main/resources/public目录下创建了一个名为index2.html的HTML页面,那么在启动Spring Boot应用程序后,你可以通过http://localhost:8080/ch06/index2.html直接访问这个HTML页面,而无需编写额外的Controller来处理这个请求。
3、访问自定义 aa 包下的静态资源
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>自定义静态资源目录</h1>
</body>
</html>
配置yml:
spring:web:resources:# 自定义静态资源目录static-locations: classpath:aa
运行:

在Spring Boot中,你可以通过配置
spring.web.resources.static-locations属性来指定自定义的静态资源目录,使得Spring Boot可以访问这些自定义的静态资源。这将告诉Spring Boot去寻找
aa目录作为静态资源目录,其中classpath:前缀表示这是一个类路径下的资源。这样,Spring Boot就会将aa目录下的静态资源视为可供直接访问的资源。因此,你可以在aa目录下放置HTML页面或其他静态资源文件,并且可以通过URL直接访问这些资源。总之,通过配置
spring.web.resources.static-locations属性,你可以非常方便地指定自定义的静态资源目录,使得Spring Boot可以直接访问这些自定义的静态资源。
六、编写 controler ,通过 controller 的路径访问
@RestController
public class HelloController {@GetMapping("/hello")public String hello(){return "hello springboot";}}
代码片段展示了一个使用
@RestController注解的Spring Boot控制器类,其中包含一个处理GET请求的hello()方法。
@RestController注解是@Controller和@ResponseBody注解的组合,用于表示该类是一个控制器,并且所有处理方法的返回值将直接作为HTTP响应的内容返回,而不是解析为视图。
@GetMapping("/hello")注解表示该方法处理来自客户端的GET请求,映射到"/hello"路径上。在
hello()方法中,返回了字符串"hello springboot",它将作为HTTP响应的内容返回给客户端。这样,当你访问应用程序的"/hello"路径时,该控制器的
hello()方法将被调用,并返回"hello springboot"作为响应。
运行:
七、Tomcat、jetty、undertow的区别
Tomcat、Jetty和Undertow都是Java Web服务器,它们之间的区别主要在以下几个方面:
-
架构和性能 Tomcat采用传统的Servlet容器架构,在性能方面表现良好,并且经过了长时间的稳定运行。Jetty拥有更加灵活的架构,并且具有比Tomcat更高的性能和吞吐量。Undertow则是一种轻量级、高性能的Web服务器,因为其采用基于NIO的异步I/O模型,所以在处理高并发请求时表现非常出色。
-
部署方式 Tomcat和Jetty都可以作为独立的Web服务器来部署,也可以嵌入到其他应用程序中进行部署。而Undertow则主要是作为嵌入式服务器使用,它不支持像Tomcat和Jetty那样作为独立的Web服务器运行。
-
配置和扩展 Tomcat提供了大量的配置选项和扩展插件,使得用户可以根据自己的需求对其进行自定义设置。Jetty同样提供了很多的配置选项和扩展插件,并且更加灵活和易于定制。Undertow则相对来说比较简单,虽然也提供了一些可用的配置选项和扩展插件,但相对来说较少。
-
社区支持和生态系统 Tomcat和Jetty都有庞大的社区支持和生态系统,提供了丰富的文档、教程和插件。Undertow相对来说比较年轻,其社区和生态系统还在逐步成长中。
综上所述,Tomcat、Jetty和Undertow都是非常优秀的Java Web服务器,你可以根据自己的需求和场景选择其中的任何一种。如果需要极高的性能和吞吐量,可以选择Jetty或Undertow;如果需要稳定的运行和庞大的生态系统,可以选择Tomcat
相关文章:
SpringBoot : ch06 整合 web (一)
前言 SpringBoot作为一款优秀的框架,不仅提供了快速开发的能力,同时也提供了丰富的文档和示例,让开发者更加容易上手。在本博客中,我们将介绍如何使用SpringBoot来整合Web应用程序的相关技术,并通过实例代码来演示如何…...
C++:OJ练习(每日练习系列)
编程题: 题一:把字符串转换成整数 把字符串转换成整数_牛客题霸_牛客网 示例1 输入: "2147483647" 返回值: 2147483647思路一: 第一步:it从str的第一个字符开始遍历,定义一个最后输…...
C语言—什么是数组名
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int arr[]{1,2,3,4};printf("%p\n",arr);printf("%p\n",&arr);printf("%p\n",*arr);return 0; } 结论:数组名是数组首元素地址(下标为0的元素…...
如何与死锁斗争!!!
其他系列文章导航 Java基础合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、死锁场景现场 二、死锁是如何产生的 三、死锁排查思路 四、sql模拟死锁复现 五、死锁的解决方案 前言 为避免影响业务,应尽可能避…...
【Java并发】聊聊不安全的HashMap以及ConcurrentHashMap
在实际的开发中,hashmap是比较常用的数据结构,如果所开发的系统并发量不高,那么没有问题,但是一旦系统的并发量增加一倍,那么就可能出现不可控的系统问题,所以在平时的开发中,我们除了需要考虑正…...
数据结构--->单链表
文章目录 链表链表的分类 单链表单链表的存储结构单链表主要实现的接口函数单链表尾插动态申请新节点单链表头插单链表的尾删单链表的头删在指定位置之前插入单链表查找插入 在指定位置之后插删除指定位置元素删除指定位置之后的元素顺序输出链表销毁单链表 顺序表和单链表的区…...
RT-Thread 线程间同步【信号量、互斥量、事件集】
线程间同步 一、信号量1. 创建信号量2. 获取信号量3. 释放信号量4. 删除信号量5. 代码示例 二、互斥量1. 创建互斥量2. 获取互斥量3. 释放互斥量4. 删除互斥量5. 代码示例 三、事件集1. 创建事件集2. 发送事件3. 接收事件4. 删除事件集5. 代码示例 简单来说,同步就是…...
B 树和 B+树 的区别
文章目录 B 树和 B树 的区别 B 树和 B树 的区别 了解二叉树、AVL 树、B 树的概念 B 树和 B树的应用场景 B 树是一种多路平衡查找树,为了更形象的理解。 二叉树,每个节点支持两个分支的树结构,相比于单向链表,多了一个分支。 …...
Go iota简介
当声明枚举类型或定义一组相关常量时,Go语言中的iota关键字可以帮助我们简化代码并自动生成递增的值。本文档将详细介绍iota的用法和行为。 iota关键字 iota是Go语言中的一个预定义标识符,它用于创建自增的无类型整数常量。iota的行为类似于一个计数器…...
PyQt6库和工具库QTDesigner安装与配置
锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计12条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版…...
性能测试:系统架构性能优化思路
今天谈下业务系统性能问题分析诊断和性能优化方面的内容。这篇文章重点还是谈已经上线的业务系统后续出现性能问题后的问题诊断和优化重点。 系统性能问题分析流程 我们首先来分析下如果一个业务系统上线前没有性能问题,而在上线后出现了比较严重的性能问题&#x…...
python字符串格式化
字符串格式化 # 2023年11月16日 星期四 y 2023 m 11 d 16 w 四 s %d年%d月%d日 星期%s%(y,m,d,w) print(s) s {}年{}月{}日 星期{}.format(y,m,d,w) print(s) s f{y}年{m}月{d}日 星期{w} print(s)...
Linux的基本指令(二)
目录 前言 学前补充 touch指令 mkdir指令 rmdir指令 rm指令 通配符* man指令 cp指令 mv指令(重要) 补充内容: 1、如何快速在Linux中写出代码 2、如何看待如此多的Linux指令 cat指令 前言 关于Linux的基本指令我们会分三到四篇文章进行分析,…...
每日一题--寻找重复数
蝶恋花-王国维 阅尽天涯离别苦, 不道归来,零落花如许。 花底相看无一语,绿窗春与天俱莫。 待把相思灯下诉, 一缕新欢,旧恨千千缕。 最是人间留不住,朱颜辞镜花辞树。 目录 题目描述: 思路分析…...
C#,《小白学程序》第二十二课:大数的乘法(BigInteger Multiply)
1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary> /// 大数的(加减乘除)四则运算、阶乘运算 /// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法 /// </summary> p…...
kafka,RabbitMQ,RocketMQ,他们之间的区别,架构,如何保证消息的不丢失,保证不重复消费,保证消息的有序性
文章目录 Kafka、RabbitMQ、RocketMQ 之间的区别是什么?性能数据可靠性服务可用性功能 RabbitMQ如何保证消息不丢失?Kafka 的架构说一下?Kafka 怎么保证消息是有序的?Kafka 怎么解决重复消费?Kafka 怎么保证消息不丢失…...
uni-app中vue3+setup实现下拉刷新、上拉加载更多效果
在小程序或各类app中,下拉刷新和上拉加载更多是极为常见和使用非常频繁的两个功能,通过对这两个功能的合理使用可以极大的方便用户进行操作。 合理的设计逻辑才能更容易挽留住用户,因为这些细节性的小功能点就变得极为重要起来。 那么在uni…...
微服务实战系列之Nginx(技巧篇)
前言 今天北京早晨竟然飘了一些“雪花”,定睛一看,似雪非雪,像泡沫球一样,原来那叫“霰”。 自然中,雨雪霜露雾,因为出场太频繁,认识门槛较低,自然不费吹灰之力,即可享受…...
好工具|datamap,一个好用的地图可视化Excel插件,在Excel中实现地理编码、拾取坐标
在做VRP相关研究的时候,需要对地图数据做很多处理,比如地理编码,根据“重庆市沙坪坝区沙正街174号”这样的一个文本地址知道他的经纬度;再比如绘制一些散点图,根据某个位置的经纬度在地图上把它标注出来。还有有的时候…...
Java——继承
继承是面向对象编程的三大特征之一,它让我们更加容易实现对已有类的扩展、更加容易实现对现实世界的建模。 继承有两个主要作用: 代码复用,更加容易实现类的扩展方便建模 继承的实现 继承让我们更加容易实现对类的扩展。比如我们定义了人…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...
【51单片机】4. 模块化编程与LCD1602Debug
1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...
