Spring Web MVC基础理论和使用
目录
什么是MVC
什么是SpringMVC
SpringMVC基础使用
建立连接
@RequestMapping介绍
请求
传递参数
传递对象
参数重命名
传递数组
传递JSON数据
获取URL中参数
上传文件
获取Cookie/Session
获取Header
响应
返回静态页面
@RestController和@Controller的区别
返回数据@ResponseBody
设置状态码
什么是MVC
MVC是一种架构模式,全称是Model(模型) View(视图) Controller(控制)
- Model(模型):是应用程序的主体,用来存储数据和处理用户请求的业务逻辑。
- View(视图):用来和浏览器交互的部分,展示模型中的数据,比如jsp和html
- Controller(控制) 用来接收视图发来的请求,将数据交给Model处理,并且将处理后的结果返回给视图
相当于用户通过浏览器输入数据,由View发送给Controller,在有Controller分发给对应Model板块对数据进行处理,之后,Model再把处理完的数据交给Controller,Controller可能对数据进行进一步封装,最后交给View,由View最后返回给用户展示。
什么是SpringMVC
SpringMVC和MVC并不是一个东西,MVC是一种架构思想,而SpringMVC则是实现这种思想的web框架,所以SpringMVC就是一个实现了MVC的Web框架
就好像是食物和饺子的关系,食物是能被人类使用的东西的统称,而饺子则是食物的具体实现,食物不光有饺子,还有其他实现,比如包子,汤圆,西湖醋鱼等
关于官方的定义是这样的
SpringWebMVC是基于ServletAPI构建的原始Web框架,从⼀开始就包含在Spring框架中。它的
正式名称“SpringWebMVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"Spring
MVC".
从这句话可以知道SpringMVC是Spring Framework的一部分,底层则是servlet
SpringMVC基础使用
我们在之前创建SpringBoot项目时,勾选的SpringWeb依赖其实就是SpringMVC
这时就有了一个问题SpringWeb和SpringMVC到底是什么关系
SpringBoot是一个自动化配置的工具,SpringMVC是一个Web框架
SpringBoot为SpringMVC提供了便捷的开发和部署方式,SpringMVC相当于是Spring框架的一部分,用于开发Web程序,而SpringBoot是基于Spring的框架,为了快速搭建Spring应用,SpringBoot只是实现SpringMVC的其中⼀种⽅式⽽已.所以这三个的关系可以理解为SpringBoot > Spring > SpringMVC.
Spring在实现MVC架构时做了一些调整,用户通过浏览器直接把数据发给Controller,之后由Model处理再返回给Controller,最后再返回通过View显示给用户。
建立连接
我们首先现在浏览器上输出一个hello world,在输出前我们要先建立和浏览器的连接,让浏览器可以找到我们运行的SpringMVC项目。
在SpringMVC里使用@RequestMapping来实现浏览器的URL路由映射,具体代码如下
@RestController
@RequestMapping("/test")
public class UserController {@RequestMapping("hello")public String test(){return "hello world";}
}
结果
@RequestMapping介绍
@RequestMapping里传的字符串就是浏览器搜索的url路径,@RequestMapping既可以用来修饰类也可以用来修饰方法,当当前类里即用@RequestMapping修饰了类又修饰了类里的方法,那么我们想要让浏览器访问该类里的方法时所使用的url路径就是(类修饰名+方法修饰名)。就和刚刚的例子一样,而且是类修饰在前,方法修饰在后。
@RequestMapping的URL路径最前⾯加不加/ (斜杠)都可以,Spring程序启动时,会进行判段,如果前面没有加/,Spring也会帮你拼接一个,不过一般也不加/
@RequestMapping的url路径也可以是多层的,但是最终访问路径依然是类路径+方法路径
@RestController
@RequestMapping("/test/test2")
public class UserController {@RequestMapping("hello1/hello2")public String test(){return "hello world";}
}
也可以只写方法路径,浏览器也可以访问到(但是不建议这样写)
@RestController
//@RequestMapping("/test/test2")
public class UserController {@RequestMapping("hello1/hello2")public String test(){return "hello world";}
}
@RequestMapping既可以接收所以类型的请求包括get/post,如果想要只接收某一种类型的请求可以使用对应的@GetMapping或者@PostMappping,使用方法和@RequestMapping一样,但是只能接收对应类型的请求,或者指定mothod方法
@RequestMapping(value = "/test/test2",method = RequestMethod.GET)
我们也可以点进这个注解看看
可以看到mothod返回的是一个枚举类型,而枚举的就是使用请求类型,同时如果我们想要设置两种方法就可以传入两个枚举类型
@RequestMapping(value = "/test/test2",method = {RequestMethod.GET,RequestMethod.POST})
请求
刚刚我们的例子里是直接把数据发送给浏览器,并没有从浏览器接收数据然后加工返回,在项目中发送来的请求很可能带有数据,那么我们就需要用对应的参数来接收。
在Servlet中我们通过request.getParameter(name)
获取请求参数,当参数过多时代码会变得十分的臃肿,而SpringMVC则是通过参数注入的方式用于获取请求数据,即将请求参数直接封装到方法的参数当中。如果有了解过Servlet就会觉得这种方式对于开发者的开发来说十分的友好。
传递参数
@RestController
@RequestMapping(value = "test")
public class UserController {@RequestMapping("hello")public String test(String str){return str;}
}
成功返回
我们的路径127.0.0.1:8080/test/hello?str=hello,看以看到这里的参数名和我们方法的参数名是一样的,如果不一致则无法收到。
使⽤基本类型来接收参数时,参数必须传(除boolean类型),否则会报500错误类型不匹配时,会报400错误,反之包装类则不用。
@RestController
@RequestMapping("test")
public class UserController {@RequestMapping("hello")public String test(int num){return "num: " + num;}
}
当有多个参数时至于要在后面加上对应类型,切记名字一定要一样。
传递对象
处理传递基本数据类型外,SpringMVC还可以传递对象。SpringMVC可以实现自动给对象里的属性赋值,比如一个user对象里有一个name属性,浏览器只传了一个name=张三,那么SpringMVC就会从对象参数里的字段找和请求数据同名的字段,找到了就会直接赋值。
public class User {private String name;private String gender;private int age;
}
@RestController
@RequestMapping("test")
public class UserController {@RequestMapping("user")public String test(User user){return user.toString();}
}
看以看到我们只有name属性被赋值,而password因为没有找到有对应名字的字段所以无法赋值。
Spring会根据参数名称自动绑定到对象的各个属性上,如果某个属性未传递,则赋值为null(基本类型则赋值为默认初识值,比如int类型的属性,会被赋值为0)。
还可以接收关联对象
就是方法参数是一个对象,而这个对象里有一个属性也是一个对象
public class User {private String name;private String gender;private int age;private Phone phone;
}
public class Phone {private String type;private String color;private String phoneNum;
}
@RestController
@RequestMapping("test")
public class UserController {@RequestMapping("user")public String test(User user){return user.toString();}
}
看以看到依然成功接收,规则也和之前一样,只不过有一个参数变成了对象
参数重命名
在之前传递参数的过程中都要求前端传递参数的参数名和我们的方法的参数名一致,但是如果不一致呢,或者说有没有不一致但是依然可以完成参数传递的方法呢?有的兄弟有的,只需要使用@RequestParam给参数重命名就行.
@RestController
@RequestMapping("test")
public class UserController {@RequestMapping("gender")public String test1(@RequestParam("sex") String gender){return "gender: " + gender;}
}
只需要@RequestParam里的参数的前端传来的参数一致就行,这样方法的参数就可以随意命名了。不过如果加了@RequestParam注解重命名,那么前端里的参数名就必须和@RequestParam里的一样,和方法里的参数名就没有关系了,换言之如果请求参数名只是和方法参数名和一样而和@RequestParam里的参数名不同,那么依然无法正确赋值。
传递数组
SpringMVC依然可以自动绑定
@RestController
@RequestMapping("test")
public class UserController {@RequestMapping("array")public String array(String[] array){return Arrays.toString(array);}}
传递JSON数据
JSON:就是⼀种数据格式,有自己的格式和语法,使用文本表示⼀个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换。
SpringMVC已经帮我们把JSON转换工具引入进来了,直接使用就行,如果脱离SpringMVC使用就需要引入依赖
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.5</version>
</dependency>
使用提供的ObjectMapper对象来进行JSON字符串得转化
- writeValueAsString():把对象转化为JSON字符串
- readValue():把JSON转化为对象
我们得服务器接收JSON对象,需要使用 @RequestBody 注解
@RequestMapping("json")public Object json(@RequestBody User user){return user.toString();}
使用PostMan来发送请求
成功返回数据
然后如果我们去掉@RequestBody呢
可以看到依然可以成功返回但是未能成功赋值
如果后端想要返回一个json数据也可以直接以HashMap的方式返回
获取URL中参数
使用@PathVariable注解就可以拿到url中的参数,默认传递参数写在url上,SpringMVC就可以获取
@RequestMapping("pathVal/{gender}/{newName}")public String pathVal(@PathVariable String gender,@PathVariable("newName") String name){return "gender: " + gender + "name: " + name;}
@PathVariable也具有重命名得功能,url路径里的参数需要和{}里的名字对应,同时也要和方法名对应(如果@PathVariable重命名了的话则要和重命名得参数名对应)
上传文件
使用注解@RequestPart
@RequestMapping("file")public String getFile(@RequestPart("file") MultipartFile file) throws IOException {//获取文件名String fileName = file.getOriginalFilename();//上传文件到指定路径file.transferTo((new File("D:/" + file.getOriginalFilename())));return "文件名:" + fileName;}
MultipartFile是Spring封装得一个用来处理文件得接口,可以通过这个接口对文件进行一系列操作
看以看到文件成功上传到本地文件夹
获取Cookie/Session
获取Cookie
@RequestMapping("/cookie")public String demo1(HttpServletResponse response, HttpServletRequest request){// 获取所有 cookie 信息Cookie[] cookies = request.getCookies();//打印Cookie信息StringBuilder builder = new StringBuilder();if (cookies!=null){for (Cookie ck:cookies) {builder.append(ck.getName()+":"+ck.getValue());}}return "Cookie信息:"+builder;}
结果
我们也可以直接使用@CookieValue注解来获取cookie
@RequestMapping("/getCookie")public String cookie(@CookieValue("name") String name) {return "name:" + name;}
@CookieValue里的字符就对应这cookie里面的key
Session存储
@RequestMapping("/setSess")public String setsess(HttpServletRequest request) {// 获取Session对象 HttpSession session = request.getSession();if (session != null) {session.setAttribute("username", "java");}return "session 存储成功";}
通过 session.setAttribute来指定一个名称以键值对的方式绑定一个对象到session会话
HttpSession.getSession(),当参数为true时,当前如果不存在会话就会创建一个新的,如果参数为false,则当不存在会话时会返回null而不会创建新的会话(默认时true)
Session读取
@RequestMapping("/getSess")public String sess(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.getAttribute方法来获取我们存储的session,只需要传入key,就可以返回之间存储的value值,不过这里返回的是一个Object对象,需要强转为我们需要的。
而且可以看到此时SessionID也存储在Cookie中。
通过@SessionAttribute注解获取session
@RequestMapping("/getSess2")
public String sess2(@SessionAttribute(value = "username",required = false)
String username) {return "username:"+username;
}
@SessionAttribute注解就相当于getAttribute,通过传入的值来返回对应的对象,required表示可以为空
通过SpringMVC内置对象获取session
@RequestMapping("/getSess3")
public String sess3(HttpSession session) {String username = (String)session.getAttribute("username");return "username:"+username;
}
使用方法依然和刚刚的getAttribute一样
获取Header
@RequestMapping("/header")public String header(HttpServletRequest request, HttpServletResponse response){String name = request.getHeader("name");return "name" + ":"+ name;}
这里获取的就是http请求报头里的key-value,这里也可以直接使用@RequestHeader注解来获取,使用方法和getHeader一样这里就不演示了
响应
我们可以返回的响应结果并不只有我们处理的一些数据,还可以是静态页面,设置返回报头,状态码等信息。
返回静态页面
首先我们先创建一个html页面
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Index⻚⾯</title>
</head><body><h1>Hello,Spring MVC,这是Index⻚⾯</h1>
</body></html>
后端代码
@RestController
public class IndexController {@RequestMapping("/index")public Object index(){//返回index.html return "/index.html";}
}
运行
可以看到好像并不是我们预期的结果,我们应该返回的是一个html页面,现在我们将@RestController注解变成@Controller注解
@Controller
@RequestMapping("test2")
public class IndexController {@RequestMapping("/index")public Object index(){//返回index.htmlreturn "/index.html";}
}
这时我们就得到了我们想要的结果,那为什么呢
@RestController和@Controller的区别
我们刚刚有提到,SpringMVC可以返回视图但是随着前后端分离,View不在返回视图,而是返回显示视图所需要的数据,而@RestController 其实是返回的数据
我们点开@RestController的源码可以发现,在里面不加封装了@Controller还封装了@ResponseBody.
所以可以这样说@RestController =@Controller +@ResponseBody
@Controller :定义⼀个控制器,Spring框架启动时加载,把这个对象交给Spring管理.
@ResponseBody :定义返回的数据格式为非视图,返回⼀个text/html信息
所以
- @RestController一般用来返回数据,这些数据报头中的Content-Type都是text/html格式的。
- @Controller一般用来返回视图.这个视图一般是用前端的代码写好的文件(视图view).
返回数据@ResponseBody
刚刚我们直到@ResponseBody是用来返回数据的,如果给刚刚的代码加上一个@ResponseBody就又会把"index.html"当作字符串展示出来。
@ResponseBody注解既可以作用在类上又可以作用在方法上,作用在方法上就只影响当前方法,作用在类上就影响类里的所有方法,同理因为@RestController注解封装了@ResponseBody注解所以也具有类似特征。
如果一个类里既要返回视图又要返回数据该怎么做?很简单,在类上添加@Controller注解,给要返回数据的方法添加@ResponseBod注解,可以认为@ResponseBody的优先级大于@Controller注解。
设置状态码
可以直接通过SpringMVC的内置对象HttpServletResponse提供的方法来进行设置
@RequestMapping("/setStatus")@ResponseBodypublic String setStatus(HttpServletResponse response) {response.setStatus(400);return "设置状态码成功";}
相关文章:
Spring Web MVC基础理论和使用
目录 什么是MVC 什么是SpringMVC SpringMVC基础使用 建立连接 RequestMapping介绍 请求 传递参数 传递对象 参数重命名 传递数组 传递JSON数据 获取URL中参数 上传文件 获取Cookie/Session 获取Header 响应 返回静态页面 RestController和Controller的区别 返…...
Go Modules 的基本使用
在 Go Modules 项目中,首次运行时下载依赖包的正确流程需要根据项目情况区分处理。以下是详细步骤和最佳实践: 一、首次初始化项目的标准流程 1.1 创建项目目录并初始化模块 mkdir myproject && cd myproject go mod init github…...
等保系列(三):等保测评的那些事
一、等保测评主要做什么 1、测评准备阶段 (1)确定测评对象与范围 明确被测系统的边界、功能模块、网络架构及承载的业务。 确认系统的安全保护等级(如二级、三级)。 (2)签订测评合同 选择具备资质的测…...
一种海杂波背景下前视海面目标角超分辨成像方法——论文阅读
一种海杂波背景下前视海面目标角超分辨成像方法 1. 专利的研究目标与实际问题1.1 研究目标1.2 实际意义2. 专利的创新方法、公式及优势2.1 总体思路2.2 关键公式及技术细节2.2.1 运动几何模型2.2.2 方位卷积模型2.2.3 贝叶斯反演与迭代方程2.2.4 参数估计2.3 与传统方法的对比优…...
在线caj转换word
CAJ格式是中国知网特有的一种文献格式,在学术研究等领域广泛使用,但有时我们需要将其转换为Word格式,方便编辑、引用文献。本文分享如何轻松将CAJ转换为word的转换工具,提高阅读和办公效率。 如何将CAJ转换WORD? 1、使用CAJ转换…...
考研英一学习笔记 2018年
2018 年全国硕士研究生招生考试 英语 (科目代码:201) Section Ⅰ Use of English Directions: Read the following text. Choose the best word(s) for each numbered blank and mark A, B, C or D on the ANSWER SHEET. (10 points) Trust i…...
如何工作的更有职业性
职场中的人,如何让对方对你的评价是你很职业?如何让对方认为你更专业? 这里的职业是形容词 与人沟通的职业性,首当其冲的是你的表达,不管是直接的交流沟通还是文字沟通都清晰明了。 文字沟通 写出来的文字应该尽可…...
transformer 笔记 tokenizer moe
(超爽中英!) 2025吴恩达大模型【Transformer】原理解析教程!附书籍代码 DeepLearning.AI_哔哩哔哩_bilibili 自回归就是上文全部阅读 好像学过了,向量互乘好像 transformer不需要rnn 掩码自注意力 训练bert import torch import torch.nn as nn import …...
6.01 Python中打开usb相机并进行显示
本案例介绍如何打开USB相机并每隔100ms进行刷新的代码,效果如下: 一、主要思路: 1. 打开视频流、读取帧 self.cam_cap = cv2.VideoCapture(0) #打开 视频流 cam_ret, cam_frame = self.cam_cap.read() //读取帧。 2.使用定时器,每隔100ms读取帧 3.显示到Qt的QLabel…...
什么是AIOps
AIOps(Artificial Intelligence for IT Operations,智能运维)是以人工智能技术为核心的新型IT运维模式,通过整合机器学习、大数据分析等技术,实现运维流程的自动化与智能化,从而提升系统稳定性、降低运营成…...
javax.net.ssl.SSLHandshakeException: No appropriate protocol
大家好,我是 程序员码递夫。 我有个SpringBoot项目用到邮件发送功能, 在开发环境运行,一切正常,但是我 部署jar 包,在本机上运行时却报错了, 提示: javax.mail.MessagingException: Could not…...
【身份证识别表格】批量识别身份证扫描件或照片保存为Excel表格,怎么大批量将身份证图片转为excel表格?基于WPF和腾讯OCR的识别方案
以下是基于WPF和腾讯OCR的身份证批量识别与导出Excel的完整方案: 一、应用场景 企业人事管理 新员工入职时需批量录入数百份身份证信息,传统手动录入易出错且耗时。通过OCR自动提取姓名、身份证号等字段,生成结构化Excel表格…...
Java+Selenium+快代理实现高效爬虫
目录 一、前言二、Selenium简介三、环境准备四、代码实现4.1 创建WebDriver工厂类4.2 创建爬虫主类4.3 配置代理的注意事项 六、总结与展望 一、前言 在Web爬虫技术中,Selenium作为一款强大的浏览器自动化工具,能够模拟真实用户操作,有效应对…...
掌握Multi-Agent实践(三):ReAct Agent集成Bing和Google搜索功能,采用推理与执行交替策略,增强处理复杂任务能力
一个普遍的现象是,大模型通常会根据给定的提示直接生成回复。对于一些简单的任务,大模型或许能够较好地应对。然而,当我们面对更加复杂的任务时,往往希望大模型能够表现得更加“智能”,具备适应多样场景和解决复杂问题的能力。为此,AgentScope 提供了内置的 ReAct 智能体…...
【愚公系列】《Manus极简入门》028-创业规划顾问:“创业导航仪”
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
SpringBoot统一功能处理
一.拦截器(实现两个接口,并重写方法) 1. 定义拦截器 ⾃定义拦截器: 实现HandlerInterceptor接⼝, 并重写其所有⽅法 preHandle()⽅法:⽬标⽅法执⾏前执⾏. 返回true: 继续执⾏后续操作; 返回false: 中断后…...
并发设计模式实战系列(19):监视器(Monitor)
🌟 大家好,我是摘星! 🌟 今天为大家带来的是并发设计模式实战系列,第十九章监视器(Monitor),废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 监视器三要素模型 2. 线程调度…...
Oracle Fusion常用表
模块表名表描述字段说明sodoo_headers_all销售订单头表sodoo_lines_all销售订单行表sodoo_fulfill_lines_all销售订单明细行表popo_headers_all采购订单头表popo_lines_all采购订单行表popo_line_locations_all采购订单分配表popo_distributions_all采购订单发运表invEGP_SYSTE…...
虚假AI工具通过Facebook广告传播新型Noodlophile窃密木马
网络安全公司Morphisec的研究人员发现,攻击者正利用虚假人工智能(AI)平台传播名为Noodlophile Stealer的新型信息窃取木马。这种复杂攻击手法利用AI工具的热度诱骗用户下载恶意软件,窃取浏览器凭证、加密货币钱包,并可…...
华为云Flexus+DeepSeek征文|从开通到应用:华为云DeepSeek-V3/R1商用服务深度体验
前言 本文章主要讲述在华为云ModelArts Studio上 开通DeepSeek-V3/R1商用服务的流程,以及开通过程中的经验分享和使用感受帮我更多开发者,在华为云平台快速完成 DeepSeek-V3/R1商用服务的开通以及使用入门注意:避免测试过程中出现部署失败等问…...
在Cline上调用MCP服务之MCP实践篇
目录 引言一、准备工作1、安装 Visual Studio Code2、安装Cline插件配置支持模型 二、安装MCP Server并调用MCP Server三、本地手动安装MCP Server结尾 引言 上一篇《模型上下文协议(Model Context Protocol,MCP)初见概念篇》我们说到什么是…...
大模型应用开发之模型架构
一、Transformer 架构 1. 编码器Encoder(“阅读理解大师”) 1)核心任务:编码器的唯一目标就是彻底理解输入的句子。它要把输入的每个词(或者说词元 Token)都转化成一个充满上下文信息的“向量表示”&#…...
敦普水性无铬锌铝涂层:汽车紧固件防锈15年,解决螺栓氢脆腐蚀双痛点
汽车紧固件低能耗涂装 在汽车工业体系中,紧固件承担着连接关键部件的重任。螺栓的抗拉强度、螺母的锁紧力矩,直接决定着整车的可靠性。当前,传统涂层技术始终面临一道难题:如何在保障防锈性能的同时,实现真正的环保无有…...
基环树(模板) 2876. 有向图访问计数
对于基环树,我们可以通过拓扑排序去掉所有的树枝,只剩下环,题目中可能会有多个基环树 思路:我们先利用拓扑排序将树枝去掉,然后求出每个基环树,之后反向dfs求得所有树枝的长度即可 class Solution { publi…...
26考研——中央处理器_指令执行过程(5)
408答疑 文章目录 二、指令执行过程指令周期定义指令周期的多样性指令执行的过程注意事项 指令周期的数据流取指周期间址周期执行周期中断周期 指令执行方案单周期处理器多周期处理器流水线处理器 八、参考资料鲍鱼科技课件26王道考研书 九、总结 二、指令执行过程 指令周期 …...
Unity基础学习(九)输入系统全解析:鼠标、键盘与轴控制
目录 一、Input类 1. 鼠标输入 2. 键盘输入 3. 默认轴输入 (1) 基础参数 (2)按键绑定参数 (3)输入响应参数 (4)输入类型与设备参数 (5)不同类型轴的参…...
如何清除windows 远程桌面连接的IP记录
问题 在远程桌面连接后,会在输入列表留下历史IP记录,无用的IP多了会影响我们查找效率,也不安全。 现介绍如何手动删除这些IP记录。 解决方案 1、打开注册表 按 Win R,输入 regedit,回车定位到远程桌面记录的注册表…...
C#参数数组全解析
在C#编程中,参数数组是一个重要的概念,它为方法调用提供了更大的灵活性。下面我们将详细介绍参数数组的相关内容。 参数数组的基本规则 在本书所述的参数类型里,通常一个形参需严格对应一个实参,但参数数组不同,它允…...
设计模式-策略模式(Strategy Pattern)
设计模式-策略模式(Strategy Pattern) 一、概要 在软件设计中,策略模式(Strategy Pattern)是一种非常重要的行为型设计模式。它的核心思想是将算法或行为封装在不同的策略类中,使得它们可以互换ÿ…...
LeetCode面试题 17.21 直方图的水量
题目 解答 package leetcode.editor.cn;//leetcode submit region begin(Prohibit modification and deletion) class Solution {public int trap(int[] height) {int length height.length;if (length 0) {return 0;}int[] leftMax new int[length];leftMax[0] 0;for (i…...
数据库系统概论(七)初识SQL与SQL基本概念
数据库系统概论(七)初识SQL与SQL基本概念 前言一、什么是SQL语言?1.1 SQL的产生和发展1.2 SQL的特点1.3 SQL的基本概念1.3.1 数据库相关“术语”(类比Excel表格)1.3.2 四大类核心语句(后面会详细讲…...
Jenkins Maven 带权限 搭建方案2025
1、使用docker搭建jenkins version: 3.8services:jenkins:image: jenkins_lzh:1.0container_name: jenkinsports:- "8080:8080" # Jenkins Web UI- "50000:50000" # Jenkins Agent通信端口volumes:- ./jenkins_home:/var/jenkins_home # 持久化Jenkins…...
服务器配置错误导致SSL/TLS出现安全漏洞,如何进行排查?
SSL/TLS 安全漏洞排查与修复指南 一、常见配置错误类型 弱加密算法与密钥问题 使用弱密码套件(如DES、RC4)或密钥长度不足(如RSA密钥长度<2048位),导致加密强度不足。 密钥管理不当(如私钥未加密存…...
【高并发】Celery + Redis异步任务队列方案提高OCR任务时的并发
线程池处理OCR仍然会阻塞请求的原因主要有以下几点,以及为什么CeleryRedis是更好的解决方案: 1. 线程池的阻塞本质 请求-响应周期未分离:即使使用线程池,HTTP请求仍需要等待线程池任务完成才能返回响应。当所有线程都繁忙时&#…...
c/c++的Libevent 和OpenSSL构建HTTPS客户端详解(附带源码)
使用 Libevent 和 OpenSSL 构建 HTTPS 客户端详解 在现代网络应用中,HTTPS 协议的普及使得安全通信成为标配。Libevent 是一个功能强大且广泛应用的事件通知库,能够帮助开发者编写高性能、可移植的网络程序。然而,libevent 本身并不直接处理…...
关于fastjson与fastjson2中toJava操作的区别
关于fastjson与fastjson2中toJava操作的区别 一、场景二、 区别1、前置条件2、对比1. fastjson2. fastjson2 三、解决方案 一、场景 在Java中会有将json转为实体类的需求,其中fastjson是一个常用的选择,今天在升级项目依赖的过程中,将fastjs…...
PX4开始之旅(二)通过自定义 MAVLink 消息与 QGroundControl (QGC) 通信
核心知识点:通过自定义 MAVLink 消息与 QGroundControl (QGC) 通信 1. 通俗易懂的解释 想象一下,MAVLink 就像是无人机(飞控)和地面站(QGroundControl)之间约定好的一种“语言”。这种语言有很多标准的“…...
Docker组件详解:核心技术与架构分析
Docker详解:核心技术与架构分析 Docker作为一种容器化技术,已经彻底改变了软件的开发、交付和部署方式。要充分理解和利用Docker的强大功能,我们需要深入了解其核心组件以及它们如何协同工作。本文将详细介绍Docker的主要组件、架构设计以及…...
uni-app,小程序中的addPhoneContact,保存联系人到手机通讯录
文章目录 方法详解简介 基本语法参数说明基础用法使用示例平台差异说明注意事项最佳实践 方法详解 简介 addPhoneContact是uni-app框架提供的一个实用API,用于向系统通讯录添加联系人信息。这个方法在需要将应用内的联系人信息快速保存到用户设备通讯录的场景下非…...
uniapp小程序轮播图高度自适应优化详解
在微信小程序开发过程中,轮播图组件(swiper)是常用的UI元素,但在实际应用中经常遇到高度不匹配导致的空白问题。本文详细记录了一次轮播图高度优化的完整过程,特别是针对固定宽高比图片的精确适配方案。 问题背景 在开发"零工市场&quo…...
赛季7靶场 - Environment
本系列仅说明靶场的攻击思路,不会给出任何的详细代码执行步骤,因为个人觉得找到合适的工具以实现攻击思路的能力也非常重要。 1.Nmap扫描发现80和22端口 2.访问80端口,使用katana查看js代码,快速发现laravel框架。 【*】希望知道…...
JVM——即时编译
分层编译模式:动态平衡启动速度与执行效率 分层编译是现代JVM(如HotSpot、GraalVM)实现高性能的核心策略之一,其核心思想是根据代码的执行热度动态选择不同的编译层次,实现启动速度与运行效率的最佳平衡。以HotSpot虚…...
武汉火影数字|数字科技馆打造:开启科技探索新大门
足不出户,就能畅游科技的奇幻世界,你相信吗?数字科技馆就能帮你实现!在这个数字化的时代,数字科技馆如同一颗璀璨的新星,照亮了我们探索科学的道路。 那么,数字科技馆究竟是什么呢? …...
升级 Azure Kubernetes 服务群集的关键注意事项
升级 Azure Kubernetes 服务 (AKS) 集群不仅是为了保持最新状态,更是为了保护您的工作负载、提升性能并降低运营风险。但如果操作不当,可能会导致停机、工作负载中断,甚至访问问题。 在本指南中,我们将介绍: 生产环境…...
数据类型详解(布尔值、整型、浮点型、字符串等)-《Go语言实战指南》
Go语言是一门静态强类型语言,所有变量在编译时必须明确其数据类型。本章将详细介绍Go的基础数据类型,帮助你理解并正确使用它们。 一、数据类型分类总览 Go 的基础数据类型可以分为以下几类: 类型分类代表类型示例布尔类型booltrue, false整…...
单片机-STM32部分:9-1、触控检测芯片
飞书文档https://x509p6c8to.feishu.cn/wiki/ILBsw4EaQiWaUukWrxEcO4XZnXc 传统物理按键 原理 玻璃盖板下通过一个触摸PAD连接到触摸芯片中,触摸PAD可以用PCB铜箔、金属片、平顶圆柱弹簧、导电棉、导电油墨、导电橡胶、导电玻璃的ITO层等。 当有人体手指靠近触摸按…...
从 JMS 到 ActiveMQ:API 设计与扩展机制分析(二)
(三)消息结构与 API 操作 JMS 消息结构:JMS 消息主要由消息头(Header)、属性(Properties)和消息体(Body)三部分组成。消息头包含了许多预定义的字段,用于标识…...
CSS display: none
在 CSS 中,display: none; 是一个用于控制元素显示与隐藏的属性值,其核心作用是完全从文档流中移除元素,使元素在页面中不占据任何空间,也不会被渲染。以下是详细解释: 核心作用 隐藏元素:使元素在页面中…...
vison transformer vit 论文阅读
An Image is Worth 16x16 Words 20年的论文看成10年的哈斯我了 [2010.11929] 一张图像胜过 16x16 个单词:用于大规模图像识别的转换器 --- [2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 为什么transformer好训练&am…...
dropout层
从你提供的图片来看,里面讨论了 Dropout 层,让我为你解释一下它的工作原理和作用。 Dropout 层是什么? Dropout 是一种常用的正则化技术,用于避免神经网络的 过拟合(overfitting)。过拟合是指模型在训练数…...