当前位置: 首页 > news >正文

【SpringBoot】从零开始全面解析SpringMVC (二)

在这里插入图片描述

本篇博客给大家带来的是SpringBoot的知识点, 本篇是SpringBoot入门, 介绍SpringMVC相关知识.
🐎文章专栏: JavaEE进阶
🚀若有问题 评论区见
👉gitee链接: 薯条不要番茄酱
欢迎大家点赞 评论 收藏 分享
如果你不知道分享给谁,那就分享给薯条.
你们的支持是我不断创作的动力 .

王子,公主请阅🚀

  • 要开心
    • 要快乐
      • 顺便进步
  • 1. 关于SpringMVC 请求传递信息
    • 1.1 传递 JSON 数据
    • 1.2 获取URL中参数(@PathVariable)
    • 1.3 上传文件 (@RequestPart)
    • 1.4 Cookie 和 Seesion
      • 1.4.1 回顾 Cookie, 理解 Session
      • 1.4.2 获取Cookie 和 Session
    • 1.5 获取Header
  • 2. 关于SpringMVC 响应传递信息
    • 2.1 返回静态页面
    • 2.2 返回数据@ResponseBody
    • 2.3 返回HTML代码片段
    • 2.4 返回JSON数据
    • 2.5 设置状态码
    • 2.6 设置Header(了解即可)
  • 3. 综合练习
    • 3.1 加法计算器
      • 3.1.1 准备工作
      • 3.1.2 约定前后端交互接口
      • 3.1.3 服务器代码
      • 3.1.4 前端页面代码
      • 3.1.5 运行测试
    • 3.2 用户登录
      • 3.2.1 准备工作
      • 3.2.2 约定前后端交互接口
      • 3.2.3 实现服务器端代码
      • 3.2.4 前端页面代码

要开心

要快乐

顺便进步

1. 关于SpringMVC 请求传递信息

1.1 传递 JSON 数据


Ⅰ JSON概念

JSON:JavaScript Object Notation 【JavaScript 对象表示法】

JSON是一种轻量级的数据交互格式. 它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。-- 来自百度百科

简单来说:JSON就是一种数据格式, 有自己的格式和语法, 使用文本表示一个对象或数组的信息,
因此JSON本质是字符串. 主要负责在不同的语言中数据传递和交换.


类似于:
① 国际通用语言 - 英语.
② 中国56个民族不同地区的通用语言 - 普通话.


Ⅱ JSON 与 Javascript 的关系

没有关系, 只是语法相似, js开发者能更快的上手而已, 但是他的语法本身比较简单, 所以也很好学.

Ⅲ JSON语法

JSON 是一个字符串,其格式非常类似于 JavaScript 对象字面量的格式.

{"squadName": "Super hero squad","homeTown": "Metro City","formed": 2016,"secretBase": "Super tower","active": true,"members": [{"name": "Molecule Man","age": 29,"secretIdentity": "Dan Jukes","powers": ["Radiation resistance", "Turning tiny", "Radiation blast"}, {"name": "Madame Uppercut","age": 39,"secretIdentity": "Jane Wilson","powers": ["Million tonne punch", "Damage resistance", "Superhuman r}, {"name": "Eternal Flame","age": 1000000,"secretIdentity": "Unknown","powers": ["Immortality", "Heat Immunity", "Inferno", "Teleportation}]
}


Ⅳ JSON的语法:

1. 数据在 键值对(Key/Value) 中.
2. 数据由逗号 ’ , ’ 分隔.
3. 对象用 {} 表示.
4. 数组用 [] 表示.
5. 值可以为对象, 也可以为数组, 数组中可以包含多个对象.


Ⅴ JSON的两种结构

1. 对象: 大括号 {} 保存的对象是一个无序的 键值对 集合. 一个对象以左括号 { 开始, 右括号 } 结束。每个"键"后跟⼀个冒号 : 键值对使用逗号 , 分隔开。

2. 数组: 中括号 [] 保存的数组是值(value)的有序集合. 一个数组以左中括号 [ 开始, 右中括
号 ] 结束,值之间使用逗号 , 分隔。


可以使用在线JSON格式化工具来进行校验和书写: JSON校验工具 .

Ⅵ JSON优点
1. 简单易用: 语法简单,易于理解和编写,可以快速地进行数据交换.

2. 跨平台支持: JSON可以被多种编程语言解析和生成, 可以在不同的平台和语言之间进行数据交换和传输.

3. 轻量级: 相较于XML格式, JSON数据格式更加轻量级, 传输数据时占用带宽较小, 可以提高数据传输速度.

4. 易于扩展: JSON的数据结构灵活,支持嵌套对象和数组等复杂的数据结构,便于扩展和使用.

5. 安全性: JSON数据格式是一种纯文本格式,不包含可执行代码, 不会执行恶意代码,因此具有较高的安全性.

Ⅶ 传递 JSON 数据

接收 JSON 对象,需要使用 @RequestBody 注解

RequestBody: 请求正文,意思是这个注解作用在请求正文的数据绑定,请求参数必须在写在请求正文中.

使用 Postman 来发送 json 请求参数:

在这里插入图片描述

如果去掉@RequestBody 注解的话会怎么样? 👇

在这里插入图片描述

可以看到, 后端未能成功给 Student对象赋值.

1.2 获取URL中参数(@PathVariable)


path variable: 路径变量.
和字面表达的意思一样, 这个注解主要作用在请求URL路径上的数据绑定.


后端实现代码:

 @RequestMapping("/r9/{articleId}")public String r9(@PathVariable("articleId") Integer articleId) {return "接到参数,articleId:"+articleId;}


使用Postman 发送请求:

在这里插入图片描述

可以看到, 后端正确获取到了URL中的参数.

1.3 上传文件 (@RequestPart)


直接看后端代码实现:

    @RequestMapping("/r10")public String r10(@RequestPart("file")MultipartFile imgFile) {String originalFilename = imgFile.getOriginalFilename();return "接到文件,文件名称:"+originalFilename;}


使用 Postman 发送请求:

在这里插入图片描述


文件上传成功.

1.4 Cookie 和 Seesion

1.4.1 回顾 Cookie, 理解 Session

Ⅰ 回顾 Cookie

HTTP 协议 自身 是属于 “无状态” 协议.
“无状态” 的含义指的是:默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系.

实际开发中, 我们很多时候是需要知道请求之间的关联关系的.
例如登陆网站成功后, 第二次访问的时候服务器就能知道该请求是否是已经登陆过了.

在这里插入图片描述

上图过程中的令牌通常就存储在Cookie 子段当中. 此时在服务器这边就需要记录"令牌"信息, 以及令牌对应的用户信息, 这个就是 session 机制所做的工作.

比如去医院挂号 :

1. 看病之前先挂号. 挂号时候需要提供身份证号, 同时得到了一张 “就诊卡”, 这个就诊卡就相当于患者的 “令牌”.
2. 后续去各个科室进行检查, 诊断, 开药等操作, 都不必再出示身份证了, 只要凭就诊卡即可识别出当前患者的身份.
3. 看完病了之后, 不想要就诊卡了, 就可以注销这个卡. 此时患者的身份和就诊卡的关联就销毁了. (类似于网站的注销操作).
4. 又来看病, 可以办一张新的就诊卡, 此时就得到了一个新的 “令牌”.

Ⅱ 理解 Session (会话)

服务器同一时刻收到的请求是很多的. 服务器需要清楚的区分每个请求是从属于哪个用户, 也就是属于哪个会话, 就需要在服务器这边记录每个会话以及与用户的信息的对应关系. Session是服务器为了保存用户信息而创建的一个特殊的对象.

Session 的本质就是一个 “哈希表”, 存储了一些键值对结构. Key 就是SessionID, Value 就是用户信息.
SessionId 是由服务器生成的一个 “唯一性字符串”, 这就是Session能够区分同一请求不同用户信息的根本原因.

Session 默认是保存在内存中的. 如果重启服务器则 Session 数据就会丢失.

Ⅲ Cookie 和 Session 的区别

① Cookie 是客户端保存用户信息的一种机制. Session 是服务器端保存用户信息的一种机制.
② Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁.
③ Cookie 和 Session 经常会在一起配合使用. 但 不是必须配合.
1. 完全可以用 Cookie 来保存一些数据在客户端. 这些数据不一定是用户身份信息, 也不一定是 SessionId.
2. Session 中的 sessionId 也不需要非得通过 Cookie/Set-Cookie 传递, 比如通过URL传递.

1.4.2 获取Cookie 和 Session


Ⅰ 获取Cookie

代码如下:

    @RequestMapping("/r11")public String r11(HttpServletRequest request, HttpServletResponse response) {//获取所有 cookie信息Cookie[] cookies = request.getCookies();//打印 cookie信息if(cookies != null) {Arrays.stream(cookies).forEach(ck -> System.out.println(ck.getName()+":"+ck.getValue()));}return "获取cookies成功";}


此时没有设置Cookie, 通过浏览器访问: http://127.0.0.1:8080/req/r11, 得到 Cookie为 null . 按下图提示设置 Cookie 👇

在这里插入图片描述

设置完成之后再次访问就可以在IDEA 上看到 刚刚设置的Cookie. 👇

在这里插入图片描述

Ⅱ 简洁获取Cookie的方式, 使用@CookieValue注解

    @RequestMapping("/r12")public String r12(String ck) {return "cookie: " + ck;}


Ⅲ 获取 Session 的方式

Session是服务器端的机制, 我们需要先存储, 才能再获取.
Session 也是基于HttpServletRequest 来存储和获取的.

//设置Session@RequestMapping("/setSess")public String r13(HttpServletRequest request) {//获取 Session 对象HttpSession session = request.getSession();if(session != null) {session.setAttribute("username","大帅锅");}return "session 存储成功";}//获取Session@RequestMapping("/getSess")public String r14(HttpServletRequest request) {//如果 session 不存在, 不会⾃动创建HttpSession session = request.getSession(false);String username = null;if(session != null && session.getAttribute("username") != null) {username = (String)session.getAttribute("username");}return "username: " + username;}

先设置Session

在这里插入图片描述

再获取 Session

在这里插入图片描述

上述获取Session 的方式有点麻烦, 有没有跟简单点的?

其实就是对 HttpServletRequest获取session的方法进行封装就能通过 HttpSession 直接获取.

    @RequestMapping("/getSess2")public String r15(HttpSession session) {String name = (String)session.getAttribute("username");return "从session中获取username: " + name;}


还是一样的, 先设置 Session 再获取 Session,下面只给出获取的截图👇:

在这里插入图片描述

为了图方便, 能不能把上述获取Session的方式进一步封装成注解? 实际上也确实有这种方式:

    @RequestMapping("/getSess3")public String r16(@SessionAttribute("username") String name) {return "从Session中获取name: "+name;}


通过注解 @SessionAttribute就可以获取 Session 中的任意信息.

1.5 获取Header


Ⅰ 传统获取 header

从 HttpServletRequest 中获取

    //获取header.@RequestMapping("/r8")public String r8(HttpServletRequest request) {String userAgent = request.getHeader("User-Agent");return "userAgent: "+userAgent;}


使用浏览器访问后,得到如下:👇

在这里插入图片描述

通过Fiddler观察, 获取的 User-Agent 是否正确。

在这里插入图片描述

Ⅱ 使用@RequestHeader注解 简洁获取Header

    @RequestMapping("/r9")public String r9(@RequestHeader("User-Agent") String userAgent) {return userAgent;}


2. 关于SpringMVC 响应传递信息

2.1 返回静态页面


创建前端页面 index.html(注意是在resources/static 目录下)。

在这里插入图片描述

前端页面代码如下:

<!doctype html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>用户登录首页</title>
</head><body>我是Index页面。
</body></html>


后端代码:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/res")
@RestController
public class ResponseController {@RequestMapping("/index")public String index() {return "/index.html";}
}


使用浏览器访问 http://127.0.0.1:8080/res/index

在这里插入图片描述

发现, 页面未正确返回, http 响应把 “/index.html” 当做了 http响应正文的数据。
那Spring MVC如何才能识别出来 index.html 是一个静态页面, 并进行返回呢?


把 @RestController 改为 @Controller

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@RequestMapping("/res")
@Controller
public class ResponseController {@RequestMapping("/index")public String index() {return "/index.html";}
}


再次访问 http://127.0.0.1:8080/res/index
在这里插入图片描述
发现页面正确展示了。

@RestController 和 @Controller 有着什么样的关联和区别呢? 我们来看@RestController 的源码 👇

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {@AliasFor(annotation = Controller.class)String value() default "";
}


不难发现有如下关系:
@RestController = @Controller + @ResponseBody。

@RestController 返回的是数据 。 @Controller 返回的是视图(页面)。可以推出@ResponseBody返回的是数据。

2.2 返回数据@ResponseBody


上面讲到, @ResponseBody 表示返回数据。我们来验证下:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@RequestMapping("/res")
@Controller
@ResponseBody
public class ResponseController {@RequestMapping("/index")public String index() {return "/index.html";}
}


加上 @ResponseBody 该方法就会把“/index.html" 当做一个数据返回给前端。

在这里插入图片描述

@ResponseBody 既是类注解, 又是方法注解。
如果作用在类上, 表示该类的所有方法, 返回的都是数据, 如果作用在方法上, 表示该方法返回的是数据。

2.3 返回HTML代码片段


后端返回数据时, 如果数据中有HTML代码, 也会被浏览器解析。

    @RequestMapping("/returnHtml")@ResponseBodypublic String html() {return "<h1>Hello,HTML</h1>";}


响应结果👇:

在这里插入图片描述
通过Fiddler抓包,观察响应结果:

在这里插入图片描述

响应中的 Content-Type 常见取值有以下几种:


①text/html : body 数据格式是 HTML。
② text/css : body 数据格式是 CSS。
③ application/javascript : body 数据格式是 JavaScript。
④ application/json : body 数据格式是 JSON。

2.4 返回JSON数据


Spring MVC 也可以返回JSON

    @RequestMapping("/returnJson")@ResponseBodypublic HashMap<String,String> returnJson() {HashMap<String,String> map = new HashMap<>();map.put("糯香:","柠檬茶");map.put("牢大: ","坠机");map.put("ikun炒粉: ","放鸡精");return map;}


运行程序,浏览器响应结果如下:

在这里插入图片描述

通过 Fiddler 观察响应结果, Content-Type 为 application/json.

在这里插入图片描述

2.5 设置状态码


Spring MVC会根据我们方法的返回结果自动设置响应状态码, 程序员也可以手动指定状态码.
通过Spring MVC的内置对象HttpServletResponse 提供的方法来进行设置.

    @RequestMapping("/setStatus")@ResponseBodypublic String setStatus(HttpServletResponse response) {response.setStatus(403);return "设置状态码成功";}


通过Fiddler 抓包来观察设置的结果:

在这里插入图片描述

2.6 设置Header(了解即可)


Http 响应报头也会向客户端传递一些附加信息, 比如服务程序的名称,请求的资源已移动到新地址等, 如:
Content-Type, Local等.



3. 综合练习


结合上述内容, 我们可以做一些小案例: 重在理解前后端交互的实现.

3.1 加法计算器


需求: 输入两个整数, 点击 “点击相加” 按钮 就显示计算结果.

在这里插入图片描述

3.1.1 准备工作


gitee链接: 薯条不要番茄酱
从我的码云上直接下载spring-mvc文件夹, 并把 calc.html 复制到static 目录下👇

在这里插入图片描述

3.1.2 约定前后端交互接口


接口设计:

1. 接收什么是看后端完成这个功能需要什么.
2. 返回什么是看前端页面展示需要什么.

对于此练习:
路径: calc/sum
参数: num1 和 num2
返回值: sum

3.1.3 服务器代码

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/calc")
@RestController
public class CalcController {@RequestMapping("/sum")public String sum(Integer num1,Integer num2) {Integer sum = num1+num2;return "<h1>计算结果: "+sum+"</h1>";}
}

3.1.4 前端页面代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><form action="calc/sum" method="post"><h1>计算器</h1>数字1<input name="num1" type="text"><br>数字2<input name="num2" type="text"><br><input type="submit" value=" 点击相加 "></form>
</body></html>

3.1.5 运行测试

在这里插入图片描述

注意点: 前端接收的参数为num1 和 num2, 那么后端方法参数也必须是 num1 和 num2.(顺序无所谓,名字必须和前端保持一致

3.2 用户登录


需求: 用户输入账号和密码, 后端进行校验密码是否正确.
1. 如果不正确, 前端进行用户告知.
2. 如果正确, 跳转到首页. 首页显示当前登录用户.
3. 后续再访问首页, 可以获取到登录用户信息.

在这里插入图片描述

3.2.1 准备工作

gitee链接: 薯条不要番茄酱

还是一样的前端页面代码直接在我的码云上拿就可以了.

在这里插入图片描述

3.2.2 约定前后端交互接口


用户登录:
url: /user/login
参数: userName,password
返回结果: true / false



获取当前登录用户:
url: /user/index
参数: 无
返回结果: userName

3.2.3 实现服务器端代码

import jakarta.servlet.http.HttpSession;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.SessionAttribute;@RequestMapping("/user")
@RestController
public class LoginController {@RequestMapping("/login")public Boolean login(String userName, String password, HttpSession session) {//校验用户名和密码是否为空
//        if(userName == null || userName.length() == 0 || password == null || password.length() == 0) {
//            return false;
//        }//上面代码可以改写成 ↓, 可以点过去看 hasLength 的源码,其实和上面的代码是类似的if(!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)) {return false;}//注意接下来的写法, 由于已经对 userName进行判断处理, 所以userName不会为null.//还没学 mybatis, 所以只能先把用户名和密码写死了, 后面学了再改.if("admin".equals(userName) && "admin".equals(password)) {//从需求上看: 如果成功登录就需要 获取用户名,// 所以这里得先设置 session, 将用户名放到session中, 后面得方法通过session 来获取.session.setAttribute("userName",userName);return true;}return false;}@RequestMapping("/index")public String getUserName(@SessionAttribute("userName") String userName) {return userName;}
}

3.2.4 前端页面代码


login.html :

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>登录页面</title>
</head><body><h1>用户登录</h1>用户名:<input name="userName1" type="text" id="userName"><br>密码:<input name="password1" type="password" id="password"><br><input type="button" value="登录" onclick="login()"><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script>//下列代码需要自己写,ajax必须要会:function login() {$.ajax({url:"/user/login",type:"post",data: {userName: $("#userName").val(),password: $("#password").val()},//http响应成功success:function(result) {if(result==true) {//页面跳转location.href = "index.html";//也可以写成// location.assign("index.html");}else {alert("密码错误");}}});}</script>
</body></html>


index.html :

<!doctype html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>用户登录首页</title>
</head><body>登录人: <span id="loginUser"></span><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script>//下列代码需要自己写,ajax必须要会:$.ajax({url:"/user/index",type:"get",success:function(loginName) {$("#loginUser").text(loginName);}});</script>
</body></html>






本篇博客到这里就结束啦, 感谢观看 ❤❤❤

🐎期待与你的下一次相遇😊😊😊

相关文章:

【SpringBoot】从零开始全面解析SpringMVC (二)

本篇博客给大家带来的是SpringBoot的知识点, 本篇是SpringBoot入门, 介绍SpringMVC相关知识. &#x1f40e;文章专栏: JavaEE进阶 &#x1f680;若有问题 评论区见 &#x1f449;gitee链接: 薯条不要番茄酱 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条…...

Python连接redis

第一步安装redis Releases microsoftarchive/redis 安装时勾上所有能勾上的选项下一步即可 在CMD中pip install redis 安装redis pip install redis -i https://pypi.tuna.tsinghua.edu.cn/simple 配置redis 在redis安装目录下找到 修改 line 57 bind 0.0.0.0 line…...

Unity3D Overdraw性能优化详解

前端 在 Unity3D 开发中&#xff0c;Overdraw&#xff08;过度绘制&#xff09; 是一个常见的性能问题&#xff0c;尤其在移动端设备上可能导致严重的帧率下降。以下是关于 Overdraw 的详细解析和优化方法&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0…...

uni-app 中适配 App 平台

文章目录 前言✅ 1. App 使用的 Runtime 架构&#xff1a;**WebView 原生容器&#xff08;plus runtime&#xff09;**&#x1f4cc; 技术栈核心&#xff1a; ✅ 2. WebView Native 的通信机制详解&#xff08;JSBridge&#xff09;&#x1f4e4; Web → Native 调用&#xf…...

[CSS3]属性增强1

字体图标 使用字体图标可以实现简洁的图标效果, 字体图标展示的是图标, 本质是字体, 适合简单, 颜色单一的图标 优势 灵活性: 灵活的修改样式, 比如尺寸, 颜色等轻量级: 体积小, 渲染快, 降低服务器请求次数兼容性: 几乎兼容所有主流浏览器使用方便: 下载字体包使用字体图标…...

【Python+flask+mysql】网易云数据可视化分析(全网首发)

网易云数据可视化分析 项目概述 网易云数据可视化分析系统是一个基于Flask框架开发的Web应用&#xff0c;旨在对网易云音乐平台的用户、歌曲、专辑、歌单等数据进行全面的可视化分析。该系统通过直观的图表、表格和词云等形式&#xff0c;展示网易云音乐的数据分布特征&#…...

项目版本管理和Git分支管理方案

文章目录 一、团队协作1.项目团队与职责2.项目时间线与里程碑3.风险评估与应对措施4.跨团队同步会议&#xff08;定期&#xff09;跨团队同步会议&#xff08;双周) 5.版本升级决策树6.边界明确与路标制定a.功能边界划分b.项目路标制定b1、项目路标制定核心要素b2. 路标表格模板…...

Java 21 + Spring Boot 3.5:AI驱动的高性能框架实战

简介 在微服务架构日益普及的今天,如何构建一个既高性能又具备AI驱动能力的后端系统成为开发者关注的焦点。本篇文章将深入探讨Java 21与Spring Boot 3.5的结合,展示如何通过Vector API和JIT优化实现单线程性能提升30%,并利用飞算JavaAI生成智能重试机制和超时控制代码,解…...

【MySQL】索引太多会怎样?

在 MySQL 中&#xff0c;虽然索引可以显著提高查询效率&#xff0c;但过多的索引&#xff08;如超过 5-6 个&#xff09;会带来以下弊端&#xff1a; 1. 存储空间占用增加 每个索引都需要额外的磁盘空间存储索引树&#xff08;BTree&#xff09;。对于大表来说&#xff0c;多个…...

Flask 是否使用类似 Spring Boot 的核心注解机制

Flask 和 Spring Boot 架构风格不同:Spring Boot 是“注解驱动的全家桶框架”,而 Flask 是“微核心 + 显式扩展的 Python 微框架”。因此: ❌ Flask 没有类似 Spring Boot 的“核心注解机制”(如 @SpringBootApplication),而是使用函数装饰器(decorator)作为核心语法特…...

学习threejs,使用Physijs物理引擎,各种constraint约束限制

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️Physijs 物理引擎1.1.1 ☘️…...

城市排水管网流量监测系统解决方案

一、方案背景 随着工业的不断发展和城市人口的急剧增加&#xff0c;工业废水和城市污水的排放量也大量增加。目前&#xff0c;我国已成为世界上污水排放量大、增加速度快的国家之一。然而&#xff0c;总体而言污水处理能力较低&#xff0c;有相当部分未经处理的污水直接或间接排…...

redis数据结构-11(了解 Redis 持久性选项:RDB 和 AOF)

了解 Redis 持久性选项&#xff1a;RDB 和 AOF Redis 提供了多个持久性选项&#xff0c;以确保数据持久性并防止在服务器发生故障或重启时丢失数据。了解这些选项对于为您的特定使用案例选择正确的策略、平衡性能和数据安全至关重要。本章节将深入探讨 Redis 中的两种主要持久…...

掌握 Kotlin Android 单元测试:MockK 框架深度实践指南

掌握 Kotlin Android 单元测试&#xff1a;MockK 框架深度实践指南 在 Android 开发中&#xff0c;单元测试是保障代码质量的核心手段。但面对复杂的依赖关系和 Kotlin 语言特性&#xff0c;传统 Mock 框架常显得力不从心。本文将带你深入 MockK —— 一款专为 Kotlin 设计的 …...

2025/5/16

第一题 A. 例题4.1.2 潜水 题目描述 在马其顿王国的ohide湖里举行了一次潜水比赛。 其中一个项目是从高山上跳下水&#xff0c;再潜水达到终点。 这是一个团体项目&#xff0c;一支队伍由n人组成。在潜水时必须使用氧气瓶&#xff0c;但是每只队伍只有一个氧气瓶。 最多两…...

Detected for tasks ‘compileDebugJavaWithJavac‘ (17) and ‘kspDebugKotlin‘ (21).

1.报错 在导入Android源码的时候出现以下错误&#xff1a;Inconsistent JVM-target compatibility detected for tasks compileDebugJavaWithJavac (17) and kspDebugKotlin (21).。 Execution failed for task :feature-repository:kspDebugKotlin. > Inconsistent JVM-ta…...

嵌入式单片机中STM32F1演示寄存器控制方法

该文以STM32F103C8T6为示例,演示如何使用操作寄存器的方法点亮(关闭LED灯),并讲解了如何调试,以及使用宏定义。 第一:操作寄存器点亮LED灯。 (1)首先我们的目的是操作板子上的LED2灯,对其实现点亮和关闭操作。打开STM32F103C8T6的原理图,找到LED2的位置。 可以看到…...

【带文档】网上点餐系统 springboot + vue 全栈项目实战(源码+数据库+万字说明文档)

&#x1f4cc; 一、项目概括 本系统共包含三个角色&#xff1a; 管理员&#xff1a;系统运营管理者 用户&#xff1a;点餐消费用户 美食店&#xff1a;上传菜品与处理订单的店铺账号 通过对这三类角色的权限与业务分工设计&#xff0c;系统实现了点餐流程的全链路数字化&a…...

Spring Cloud:Gateway(统一服务入口)

Api 网关 也是一种服务&#xff0c;就是通往后端的唯一入口&#xff0c;类似于整个微服务架构的门面&#xff0c;所有的外部客户端进行访问&#xff0c;都需要经过它来进行过滤和调度&#xff0c;类似于公司的前台 而Spring Cloud Gateway就是Api网关的一种具体实现 网关的核心…...

Perl测试起步:从零到精通的完整指南

阅读原文 5.2 为什么你的Perl代码总是出问题&#xff1f;因为你还没开始测试&#xff01; "我的代码昨天还能运行&#xff0c;今天就莫名其妙报错了&#xff01;"、"我只是改了一个小功能&#xff0c;结果整个系统都崩溃了"、"这段代码不是我写的&am…...

【前端优化】vue2 webpack4项目升级webpack5,大大提升运行速度

记录一下过程 手里有个老项目&#xff0c;vue2webpack4 项目很大&#xff0c;每次运行、运行都要将近10分钟 现在又要往里面写很多东西&#xff0c;再不优化&#xff0c;开发着会更难受&#xff0c;所以决定先将它升级至webpack5 最初失败的尝试 直接在项目里安装了webpack5 但…...

【蓝桥杯省赛真题50】python字母比较 第十五届蓝桥杯青少组Python编程省赛真题解析

python字母比较 第十五届蓝桥杯青少年组python比赛省赛真题详细解析 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】1、Python比赛 信息素养大赛Python编程挑战赛 蓝桥杯python选拔赛真题详解...

学习以任务为中心的潜动作,随地采取行动

25年5月来自香港大学、OpenDriveLab 和智元机器人的论文“Learning to Act Anywhere with Task-centric Latent Actions”。 通用机器人应该在各种环境中高效运行。然而&#xff0c;大多数现有方法严重依赖于扩展动作标注数据来增强其能力。因此&#xff0c;它们通常局限于单一…...

《数据结构初阶》【二叉树 精选9道OJ练习】

【二叉树 精选9道OJ练习】目录 前言&#xff1a;二叉树的OJ练习[144. 二叉树的前序遍历](https://leetcode.cn/problems/binary-tree-preorder-traversal/)题目介绍方法一&#xff1a;[104. 二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/)题目…...

协议不兼容?Profinet转Modbus TCP网关让恒压供水系统通信0障碍

在现代工业自动化领域中&#xff0c;通信协议扮演着至关重要的角色。ModbusTCP和Profinet是两种广泛使用的工业通信协议&#xff0c;它们各自在不同的应用场合中展现出独特的优势。本文将探讨如何通过开疆智能Profinet转Modbus TCP的网关&#xff0c;在恒压供水系统中实现高效的…...

基于大模型预测的脑出血全流程诊疗技术方案

目录 一、系统架构设计技术架构图二、核心算法实现1. 多模态数据融合算法伪代码2. 风险预测模型实现三、关键模块流程图1. 术前风险预测流程图2. 术中决策支持流程图3. 并发症预测防控流程图四、系统集成方案1. 数据接口规范五、性能优化策略1. 推理加速方案2. 分布式训练架构六…...

掌握 LangChain 文档处理核心:Document Loaders 与 Text Splitters 全解析

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是LangChain 2、LangChain 在智能应用中的作用 …...

Oracle — 总结

Oracle 公司及产品概述 公司背景 Oracle&#xff08;甲骨文&#xff09;是全球领先的数据库软件和服务提供商&#xff0c;成立于1977年&#xff0c;核心产品包括&#xff1a; Oracle Database&#xff1a;关系型数据库管理系统&#xff08;RDBMS&#xff09;。Java&#xff1a…...

【Vue 3全栈实战】从响应式原理到企业级架构设计

目录 &#x1f31f; 前言&#x1f3d7;️ 技术背景与价值&#x1fa79; 当前技术痛点&#x1f6e0;️ 解决方案概述&#x1f465; 目标读者说明 &#x1f9e0; 一、技术原理剖析&#x1f4ca; 核心概念图解&#x1f4a1; 核心作用讲解&#x1f527; 关键技术模块说明⚖️ 技术选…...

升级kafka4.0.0,无ZK版本

设备规划&#xff1a; 172.20.192.47 kafka-0 172.20.192.48 kafka-1 172.20.192.49 kafka-2 单机块7TB Nvme磁盘一共9块 # 格式化成GPT分区 sudo parted /dev/nvme0n1 --script mklabel gpt sudo parted /dev/nvme1n1 --script mklabel gpt sudo parted /dev/nvme2n1 --s…...

GESP2025年3月认证C++二级( 第三部分编程题(1)等差矩阵)

参考程序&#xff1a; #include <bits/stdc.h> using namespace std;int n, m; // 声明矩阵的行数 n 和列数 mint main() {// 输入两个正整数 n 和 mscanf("%d%d", &n, &m);// 遍历每一行for (int i 1; i < n; i)// 遍历每一列for (int j 1; j &…...

Linux系统启动相关:vmlinux、vmlinuz、zImage,和initrd 、 initramfs,以及SystemV 和 SystemD

目录 一、vmlinux、vmlinuz、zImage、bzImage、uImage 二、initrd 和 initramfs 1、initrd&#xff08;Initial RAM Disk&#xff09; 2、initramfs&#xff08;Initial RAM Filesystem&#xff09; 3、initrd vs. initramfs 对比 4. 如何查看和生成 initramfs 三、Syste…...

单序列双指针---初阶篇

目录 相向双指针 344. 反转字符串 125. 验证回文串 1750. 删除字符串两端相同字符后的最短长度 2105. 给植物浇水 II 977. 有序数组的平方 658. 找到 K 个最接近的元素 1471. 数组中的 k 个最强值 167. 两数之和 II - 输入有序数组 633. 平方数之和 2824. 统计和小于…...

K8s CoreDNS 核心知识点总结

文章目录 一、章节介绍背景与主旨核心知识点及面试频率 二、知识点详解1. CoreDNS 概述2. 工作原理&#xff08;高频考点&#xff09;服务发现流程 3. 配置与插件系统&#xff08;高频考点&#xff09;核心配置文件&#xff1a;Corefile常用插件 4. Pod DNS策略&#xff08;中频…...

Java视频流RTMP/RTSP协议解析与实战代码

在Java中实现视频直播的输入流处理&#xff0c;通常需要结合网络编程、多媒体处理库以及流媒体协议&#xff08;如RTMP、HLS、RTSP等&#xff09;。以下是实现视频直播输入流的关键步骤和技术要点&#xff1a; 1. 视频直播输入流的核心组件 网络输入流&#xff1a;通过Socket或…...

卓力达电铸镍网:精密制造与跨领域应用的创新典范

目录 引言 一、电铸镍网的技术原理与核心特性 二、电铸镍网的跨领域应用 三、南通卓力达电铸镍网的核心优势 四、未来技术展望 引言 电铸镍网作为一种兼具高精度与高性能的金属网状材料&#xff0c;通过电化学沉积工艺实现复杂结构的精密成型&#xff0c;已成为航空航天、电…...

label-studio功能常用英文翻译

Projects 项目 Settings 设置 Labeling Interface 标注界面 1、Computer Vision 计算机视觉 Semantic Segmentation with Polygons 多边形语义分割 Semantic Segmentation with Masks 掩码语义分割 Object Detection with Bounding Boxes 边界框目标检测 Keypoint Label…...

2025年PMP 学习十六 第11章 项目风险管理 (总章)

2025年PMP 学习十六 第11章 项目风险管理 &#xff08;总章&#xff09; 第11章 项目风险管理 序号过程过程组1规划风险管理规划2识别风险规划3实施定性风险分析规划4实施定量风险分析规划5规划风险应对执行6实施风险应对执行7监控风险监控 目标: 提高项目中积极事件的概率和…...

Jenkins 执行器(Executor)如何调整限制?

目录 现象原因解决 现象 Jenkins 构建时&#xff0c;提示如下&#xff1a; 此刻的心情正如上图中的小老头&#xff0c;火冒三丈&#xff0c;但是不要急&#xff0c;因为每一次错误&#xff0c;都是系统中某个环节在说‘我撑不住了’。 原因 其实是上图的提示表示 Jenkins 当…...

Jenkins 安装与配置指南

Jenkins 安装与配置指南&#xff08;MD 示例&#xff09; markdown Jenkins 安装与配置指南 ## 一、环境准备 1. **系统要求** - 操作系统&#xff1a;Linux/macOS/Windows - Java 版本&#xff1a;JDK 8 或更高&#xff08;建议 JDK 11&#xff09;2. **安装方式** - **L…...

使用unsloth对Qwen3在本地进行微调

Fine-tune Qwen3(100% locally) 使用unsloth进行微调,使用huggingface在本地运行model。 load model from unsloth import FastLanguageModel import torchMODEL = "unsloth/Qwen3-14B" model,tokenizer = FastLanguageModel.from_pretrained(model_name=MODE…...

GpuGeek 实操指南:So-VITS-SVC 语音合成与 Stable Diffusion 文生图双模型搭建,融合即梦 AI 的深度实践

GpuGeek 实操指南&#xff1a;So-VITS-SVC 语音合成与 Stable Diffusion 文生图双模型搭建&#xff0c;融合即梦 AI 的深度实践 前言 本文将详细讲解 So-VITS-SVC 语音合成与 Stable Diffusion 文生图的搭建方法&#xff0c;以及二者与即梦 AI 融合的实践技巧&#xff0c;无论你…...

CSS- 3.1 盒子模型-块级元素、行内元素、行内块级元素和display属性

本系列可作为前端学习系列的笔记&#xff0c;代码的运行环境是在HBuilder中&#xff0c;小编会将代码复制下来&#xff0c;大家复制下来就可以练习了&#xff0c;方便大家学习。 HTML系列文章 已经收录在前端专栏&#xff0c;有需要的宝宝们可以点击前端专栏查看&#xff01; 点…...

使用exceljs将excel文件转化为html预览最佳实践(完整源码)

前言 在企业应用中&#xff0c;我们时常会遇到需要上传并展示 Excel 文件的需求&#xff0c;以实现文件内容的在线预览。经过一番探索与尝试&#xff0c;笔者最终借助 exceljs 这一库成功实现了该功能。本文将以 Vue 3 为例&#xff0c;演示如何实现该功能&#xff0c;代码示例…...

7. 进程控制-进程替换

目录 1. 进程替换 1.1 单进程版&#xff1a; 1.2 进程替换的原理 1.3 多进程版-验证各种程序替换接口 2. 进程替换的各种接口 2.1 execl 2.2 execlp 2.3 execv 2.4 execvp 2.5 execle 1. 进程替换 上图为程序替换的接口&#xff0c;之后会详细介绍。 1.1 单进程版&am…...

关于计算机系统和数据原子性的联系

目录 1、计算机架构 1.1、处理器架构 1.2、内存寻址能力 1.3、性能差异 1.4、软件兼容性 1.5、指令集 1.6、开发和维护 2.、基本数据类型 3、原子类型 3.1、基本概念 3.2、基本数据类型的原子性 3.3、原子操作的解释 3.4、不保证原子性 3.5、解决方案 4、原子性…...

Armijo rule

非精线搜索步长规则Armijo规则&Goldstein规则&Wolfe规则_armijo rule-CSDN博客 [原创]用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则 – 编码无悔 / Intent & Focused...

从数据包到可靠性:UDP/TCP协议的工作原理分析

之前我们已经使用udp/tcp的相关接口写了一些简单的客户端与服务端代码。也了解了协议是什么&#xff0c;包括自定义协议和知名协议比如http/https和ssh等。现在我们再回到传输层&#xff0c;对udp和tcp这两传输层巨头协议做更深一步的分析。 一.UDP UDP相关内容很简单&#xf…...

Prometheus实战教程:k8s平台-Mysql监控案例

配置文件优化后的 Prometheus 自动发现 MySQL 实例的完整 YAML 文件。该配置包括&#xff1a; MySQL Exporter 部署&#xff1a;使用 ConfigMap 提供 MySQL 连接信息。Prometheus 自动发现&#xff1a;通过 Kubernetes 服务发现自动抓取 MySQL 实例。 1、mysql 配置文件 &…...

执行apt-get update 报错ModuleNotFoundError: No module named ‘apt_pkg‘的解决方案汇总

Ubuntu版本ubuntu18.04 报错内容&#xff1a; //执行apt-get upgrade报错&#xff1a; Traceback :File “/usr/lib/cnf-update-db”, line 8, in <module>from CommandNotFound.db.creator import DbcreatorFile “/usr/lib/python3/dist-packages/CommandNotFound/db…...