【JavaWeb】后端(Maven+SpringBoot+HTTP+Tomcat)
目录
- 一、Maven
- 1.什么是Maven?
- 2.Maven的作用?
- 3.介绍
- 4.安装
- 5.IDEA集成Maven
- 6.IDEA创建Maven项目
- 7.IDEA导入Maven项目
- 8.依赖配置
- 9.依赖传递
- 10.依赖范围
- 11.生命周期
- 二、SpringBoot
- 1.Spring
- 2.SpringBoot
- 3.SpringBootWeb快速入门
- 二、HTTP
- 1.HTTP-概述
- 2.HTTP-请求协议
- 3.HTTP-响应协议
- 4.HTTP-协议解析
- 三、Tomcat
- 1.Web服务器
- 2.Tomcat
- 3.Tomcat-基本使用
- 4.SpringBootWeb-入门程序解析
- 四、请求响应
- 1.请求响应:
- 2.Postman
- 3.简单参数
- 4.实体参数
- 5.数组集合参数
- 6.日期参数
- 7.Json参数
- 8.路径参数
- 9.响应数据
- 五、分层解耦
- 1.三层架构
- 2.分层解耦
- 3.IOC& DI入门
- 4.IOC详解
- 5.Dl详解
一、Maven
1.什么是Maven?
- Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具。
Apache软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源软件基金会,也是一个专门为支持开源项目而生的非盈利性组织。
开源项目:https://www.apache.org/index.html#projects-list
2.Maven的作用?
-
依赖管理
- 方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题
- 方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题
-
统一的项目结构
- 提供标准、统一的项目结构
- 提供标准、统一的项目结构
-
项目构建
- 标准跨平台( Linux、Windows、MacOS)的自动化项目构建方式
- 标准跨平台( Linux、Windows、MacOS)的自动化项目构建方式
3.介绍
- Apache Maven是一个项目管理和构建工具,它基于项目对象模型(POM,Project object model)的概念通过一小段描述信息来管理项目的构建。
- 作用:
- 方便的依赖管理
- 统一的项目结构
- 标准的项目构建流程
- 官网:http://maven.apache.org/
- 仓库:用于存储资源,管理各种jar包。
- 本地仓库:自己计算机上的一个目录。
- 中央仓库:由Maven团队维护的全球唯一的。仓库地址: https://repo1.maven.org/maven2/
- 远程仓库(私服):一般由公司团队搭建的私有仓库。
4.安装
- 解压apache-maven-3.6.1-bin.zip 。
- 配置本地仓库:修改conf/settings.xml中的为一个指定目录。
<localRepository>E:\develop\apache-maven-3.6.1\mvn_repo</localRepository>
- 配置阿里云私服:修改conf/settings.xml中的标签,为其添加如下子标签:
<mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf>
</mirror>
- 配置环境变量:MAVEN_HOME为maven的解压目录,并将其bin目录加入PATH环境变量。
5.IDEA集成Maven
- 选择IDEA中 File --> Settings --> Build,Execution,Deployment --> Build Tools --> Maven
- 设置IDEA使用本地安装的Maven,并修改配置文件及本地仓库路径
全局配置需要关闭所有项目,在如下界面打开设置,设置内容和上面一致
6.IDEA创建Maven项目
- 创建模块,选择Maven,点击Next
- 填写模块名称,坐标信息,点击finish,创建完成
- 编写HelloWorld,并运行
- Maven坐标
- Maven中的坐标是资源的唯一标识,通过该坐标可以唯一定位资源位置。
- 使用坐标来定义项目或引入项目中需要的依赖。
- Maven坐标主要组成
- groupld:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itheima)
- artifactld:定义当前Maven项目名称(通常是模块名称,例如order-service、goods-service)
- version:定义当前项目版本号
7.IDEA导入Maven项目
- 方式一:打开IDEA,选择右侧Maven面板,点击+号,选中对应项目的pom.xm文件,双击即可。
- 方式二︰打开IDEA,选择右侧Maven面板,点击+号,选中对应项目的pom.xml文件,双击即可。
8.依赖配置
- 依赖:指当前项目运行所需要的jar包,一个项目中可以引入多个依赖。
- 配置:
- 在pom.xml中编写
<dependencies>
标签 - 在
<dependencies>
标签中使用<dependency>
引入坐标 - 定义坐标的groupld, artifactld,version
- 点击刷新按钮,引入最新加入的坐标
- 在pom.xml中编写
- 如果引入的依赖,在本地仓库不存在,将会连接远程仓库/中央仓库,然后下载依赖。(这个过程会比较耗时,耐心等待)
- 如果不知道依赖的坐标信息,可以到https://mvnrepository.com/中搜索。
9.依赖传递
- 依赖具有传递性
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系(绿色部分)
- 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源(黄色部分)
- 排除依赖
- 排除依赖指主动断开依赖的资源,被排除的资源无需指定版本。
<dependency><groupld>com.itheima</groupld><artifactld>maven-projectB</artifactld><version>1.O-SNAPSHOT</version><exclusions><exclusion><groupld>junit</groupld><artifactld>junit</artifactld></exclusion></exclusions>
</dependency>
10.依赖范围
-
依赖的jar包,默认情况下,可以在任何地方使用。可以通过
<scope>...</scope>
设置其作用范围。
-
作用范围:
- 主程序范围有效。(main文件夹范围内)
- 测试程序范围有效。( test文件夹范围内)
- 是否参与打包运行。(package指令范围内)
<dependency><groupld>junit</groupld><artifactld>junit<lartifactld><version>4.10</version><scope>test</scope>
</dependency>
11.生命周期
- Maven的生命周期就是为了对所有的maven项目构建过程进行抽象和统一。
- Maven中有3套相互独立的生命周期:
- clean:清理工作。
- default:核心工作,如:编译、测试、打包、安装、部署等。
- site:生成报告、发布站点等。
- 常见生命周期:
- clean:移除上一次构建生成的文件
- compile:编译项目源代码
- test:使用合适的单元测试框架运行测试(junit)
- package:将编译后的文件打包,如:jar、war等
- install:安装项目到本地仓库
- 在同一套生命周期中,当运行后面的阶段时,前面的阶段都会运行。
- 执行指定生命周期的两种方式:
- 在idea中,右侧的maven工具栏,选中对应的生命周期,双击执行。
- 在命令行中,通过命令执行(在项目目录下cmd)。
- mvn clean
- mvn compile
- mvn package
- mvn test
二、SpringBoot
1.Spring
- 官网:spring.io
- Spring发展到今天已经形成了一种开发生态圈,Spring提供了若干个子项目,每个项目用于完成特定的功能。
2.SpringBoot
- Spring Boot可以帮助我们非常快速的构建应用程序、简化开发、提高效率。
3.SpringBootWeb快速入门
- 创建springboot工程,并勾选web开发相关依赖。
- 定义HelloController类,添加方法 hello,并添加注解。
- 运行测试
- 浏览器访问:localhost:8080/hello
@RestController
public class HelloController {@RequestMapping ("/hello")public string hello() {system.out.println ( "Hello world ~");return "Hello world ~";}
}
二、HTTP
1.HTTP-概述
- 概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。
- 特点:
- 基于TCP协议:面向连接,安全
- 基于请求-响应模型的:一次请求对应一次响应
- HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的。
- 缺点:多次请求间不能共享数据。
- 优点:速度快
2.HTTP-请求协议
- HTTP-请求数据格式
- 请求行(红色部分):请求数据第一行(请求方式、资源路径、协议)
- 请求头(黄色部分):第二行开始,格式key: value
- 请求体(绿色部分):POST请求,存放请求参数(和请求头之间有一行空行)
- 请求方式-GET:请求参数在请求行中,没有请求体,如:/brand/findAll?name=OPPO&status=1。GET请求大小是有限制的
- 请求方式-POST:请求参数在请求体中,POST请求大小是没有限制的。
HTTP-请求数据格式名 | |
---|---|
Host | 请求的主机名 |
User-Agent | 浏览器版本,例如Chrome浏览器的标识类似Mozilla/5.0 … Chrome/79,IE浏览器的标识类似Mozilla/5.0 (windows NT …) like Gecko |
Accept | 表示浏览器能接收的资源类型,如text/* , image/* 或者*/* 表示所有; |
Accept-Language | 表示浏览器偏好的语言,服务器可以据此返回不同语言的网页; |
Accept-Encoding | 表示浏览器可以支持的压缩类型,例如gzip, deflate等。 |
content-Type | 请求主体的数据类型。 |
Content-Length | 请求主体的大小(单位:字节)。 |
3.HTTP-响应协议
- 响应行:响应数据第一行(协议、状态码、描述)
- 响应头:第二行开始,格式key: value
- 响应体:最后一部分,存放响应数据
- 常见状态响应码
- 状态码大全: https://cloud.tencent.com/developer/chapter/13553
4.HTTP-协议解析
- 浏览器自带解析
- 服务端(ServerSocket)Web服务器
三、Tomcat
1.Web服务器
Web服务器是一个软件程序,对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷
- 主要功能是"提供网上信息浏览服务"。
2.Tomcat
- 概念:Tomcat是Apache软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范。
- JavaEE:JavaEnterprise Edition,Java企业版。指Java企业级开发的技术规范总和。包含13项技术规范:JDBC、JNDI、EJB、RMI、JSP、Servlet、XML、JMS、Java lDL、JTS、JTA、JavaMail、JAF
- Tomcat也被称为Web容器、Servlet容器。Servlet程序需要依赖于Tomcat才能运行
- 官网:https://tomcat.apache.org/
- JavasE:java标准版
- JavaME:java小型版
- JavaE:java企业版
3.Tomcat-基本使用
- 下载:官网下载,地址https://tomcat.apache.org/download-90.cgi
- 安装:绿色版,直接解压即可
- 卸载:直接删除目录即可
- 启动:双击:
bin\startup.bat
- 控制台中文乱码:修改
conf/ logging.properties
- 控制台中文乱码:修改
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatterorg.apache.juli.oneLineFormatter
java.util.logging.ConsoleHandler.encoding = GBK
- 关闭:
- 直接×掉运行窗口:强制关闭
bin\shutdown.bat
:正常关闭- Ctrl+C:正常关闭
- 常见问题
- 启动窗口一闪而过:检查JAVA_HOME环境变量是否正确配置
- 端口号冲突:找到对应程序,将其关闭掉
- 配置Tomcat端口号(conf/server.xml)
- HTTP协议默认端口号为80,如果将Tomcat端口号改为80,则将来访问Tomcat时,将不用输入端口号。
- Tomcat部署项目:
- 将项目放置到webapps目录下,即部署完成
4.SpringBootWeb-入门程序解析
- 起步依赖(Starters):
- spring-boot-starter-web:包含了web应用开发所需要的常见依赖。
- spring-boot-starter-test:包含了单元测试所需要的常见依赖。
- 官方提供的starter:https://docs.spring.io/spring-boot/docs/2.7.4/reference/htmlsingle/#using.build-systems.starters
- AOP:spring-boot-starter-aop
- Redis:spring-boot-starter-data-redis
- 内嵌Tomcat(红色部分):
四、请求响应
1.请求响应:
- 请求(HttpServletRequest):获取请求数据。
- 响应(HttpServletResponse):设置响应数据
- BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端(维护方便;体验一般)。
- CS架构:Client/Server,客户端/服务器架构模式(开发、维护麻烦;体验不错)。
2.Postman
- Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。
- 作用:常用于进行接口测试
- 官网:https://www.postman.com/
3.简单参数
- 原始方式(繁琐,需要手动类型转换)
- 在原始的web程序中,获取请求参数,需要通过HttpServletRequest对象手动获取。
- SpringBoot方式
- 简单参数:参数名与形参变量名相同,定义形参即可接收参数。
- 简单参数:如果方法形参名称与请求参数名称不匹配,可以使用@RequestParam完成映射。
- 简单参数:参数名与形参变量名相同,定义形参即可接收参数。
@RequestParam中的required属性默认为true,代表该请求参数必须传递,如果不传递将报错。
如果该参数是可选的,可以将required属性设置为false。
4.实体参数
-
简单实体对象:请求参数名与形参对象属性名相同,定义POJO接收即可
-
复杂实体对象:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数。
5.数组集合参数
- 数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数
- 集合参数:请求参数名与形参集合名称相同且请求参数为多个,@RequestParam 绑定参数关系
6.日期参数
- 日期参数:使用@DateTimeFormat注解完成日期参数格式转换
7.Json参数
- JSON参数:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用@RequestBody标识
8.路径参数
- 路径参数:通过请求URL直接传递参数,使用{…}来标识该路径参数,需要使用@PathVariable获取路径参数
9.响应数据
- @ResponseBody
- 类型:方法注解、类注解
- 位置:Controller方法上/类上
- 作用:将方法返回值直接响应,如果返回值类型是实体对象/集合,将会转换为JSON格式响应
- 说明:@RestController = @Controller + @ResponseBody ;
- 统一的响应结果
package com.example.springproject01.pojo;public class Result {private Integer code;//操作结果代码。一般统一规定成功是1.失败是0private String msg;//提示信息private Object data;//结果数据public Result() {}public Result(Integer code, String msg, Object data) {this.code = code;this.msg = msg;this.data = data;}public int getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}@Overridepublic String toString() {return "Result{" +"code=" + code +", msg='" + msg + '\'' +", data=" + data +'}';}// 当接受到错误时进行errorpublic static Result error(String msg) {return new Result(0, msg, null);}//当接受到正确是进行successpublic static Result success(Object data) {return new Result(1, "sucess", data);}public static Result success() {return new Result(1, "sucess", null);}}
五、分层解耦
1.三层架构
- controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。
- service:业务逻辑层,处理具体的业务逻辑。
- dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增、删、改、查。
2.分层解耦
- 内聚:软件中各个功能模块内部的功能联系。
- 耦合:衡量软件中各个层/模块之间的依赖、关联的程度。
- 软件设计原则:高内聚低耦合。
- 控制反转:Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
- 依赖注入:Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源
称之为依赖注入。
Bean对象:IOC容器中创建、管理的对象,称之为bean。
3.IOC& DI入门
-
Service层及Dao层的实现类,交给IOC容器管理。
-
为Controller及Service注入运行时,依赖的对象。
-
运行测试。
4.IOC详解
-
要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一:
-
声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
Repository (value = "daoA")
或者Repository ("daoA")
-
使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller。
元注解:
- @Target 描述注解的使用范围(即:被修饰的注解可以用在什么地方) 。
- @Retention 描述注解保留的时间范围(即:被描述的注解在它所修饰的类中可以被保留到何时) 。
- @Documented 描述在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息。
- @Inherited 使被它修饰的注解具有继承性(如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解)。
- Bean组件扫描
- 前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。
- @ComponentScan注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解@SpringBootApplication中,默认扫描的范围是启动类所在包及其子包。
5.Dl详解
-
@Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,将会报出如下错误:
-
通过以下几种方案来解决:
-
@Primary
-
@Qualifier
-
@Resource
-
- @Autowired是spring框架提供的注解,而@Resource是JDK提供的注解。
- @Autowired 默认是按照类型注入,而@Resource默认是按照名称注入。
相关文章:

【JavaWeb】后端(Maven+SpringBoot+HTTP+Tomcat)
目录一、Maven1.什么是Maven?2.Maven的作用?3.介绍4.安装5.IDEA集成Maven6.IDEA创建Maven项目7.IDEA导入Maven项目8.依赖配置9.依赖传递10.依赖范围11.生命周期二、SpringBoot1.Spring2.SpringBoot3.SpringBootWeb快速入门二、HTTP1.HTTP-概述2.HTTP-请求协议3.HTTP-响应协议…...
面试官:准备了一些springboot相关的面试题,快来看看吧
文章目录摘要Spring Boot 中的注解 RestController 和 Controller 有什么区别?Spring Boot 中如何处理异常?使用 ExceptionHandler 注解处理特定类型的异常:使用 ExceptionHandler 注解可以将特定类型的异常映射到一个处理方法上,…...
原子的波尔模型、能量量子化、光电效应、光谱实验、量子态、角动量
一. 卢瑟福模型 1908年,卢瑟福用α粒子继续轰击金箔,发现有极少数粒子,发生了非常大的偏移。而这对于当时主流的葡萄干面包模型理论分析是相悖的。 原子可看成由带正电的原子核和围绕核运动的一些电子组成,原子中心的原子核带正…...

【如何使用Arduino控制WS2812B可单独寻址的LED】
【如何使用Arduino控制WS2812B可单独寻址的LED】 1. 概述2. WS2812B 发光二极管的工作原理3. Arduino 和 WS2812B LED 示例3.1 例 13.2 例 24. 使用 WS2812B LED 的交互式 LED 咖啡桌4.1 原理图4.2 源代码在本教程中,我们将学习如何使用 Arduino 控制可单独寻址的 RGB LED 或 …...
计算机基本知识扫盲(持续更)
计算机基本知识扫盲Q:硬盘和磁盘有什么区别?A:硬盘和磁盘都是存储数据的设备。磁盘指的是存储数据的圆形或者是方形的光盘,但是硬盘则是指机械式硬盘和固态硬盘。磁盘一般用于存储少量数据,例如软件安装文件、音乐和电…...

学习大数据需要什么语言基础
Python易学,人人都可以掌握,如果零基础入门数据开发行业的小伙伴,可以从Python语言入手。 Python语言简单易懂,适合零基础入门,在编程语言排名上升最快,能完成数据挖掘、机器学习、实时计算在内的各种大数…...

ElasticSearch——详细看看ES集群的启动流程
参考:一起看看ES集群的启动流程 本文主要从流程上介绍整个集群是如何启动的,集群状态如何从Red变成Green,然后分析其他模块的流程。 这里的集群启动过程指集群完全重启时的启动过程,期间要经历选举主节点、主分片、数据恢复等重…...

【教学类-30-01】5以内加法题不重复(一页两份)(包含1以内、2以内、3以内、4以内、5以内加法,抽取最大不重复数量)
作品样式: 背景需求: 虽然学前阶段就对幼儿训练加减法列式题遭到诟病,但是从不少幼儿(特别是二胎)在家中已经开始适应加减法题型了。 结合中班年龄特点,我从5以内的不重复加法题开始实验(雪花…...

写博客8年与人生第一个502万
题记:我们并非生来强大,但依然可以不负青春。 原本想好好写一下如何制定一个目标并通过一点一滴的努力去实现,这三年反思发现其实写自己的经历并不重要。 很多人都听过一句话:榜样的力量是无穷的。 更现实和实际的情况是&#x…...
【华为OD机试真题】日志采集系统(javapython)
日志采集系统 时间限制:1s空间限制:256MB限定语言:不限 题目描述: 日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采集系统分 批上报。 如果上报太频繁,会对服务端造成压力;如果上报太晚,会降低用户的体验;如果一 次上报的条数太多,会导致超时…...
epoll源码剖析
文章目录1.前言2.应用层的体现3.两个重要结构(1)eventpoll(2)epitem4.四个函数(1)epoll_create源码(2)epoll_ctl源码(3)epoll_wait的源码(4)epoll_event_callback()5.水平触发和边缘触发1.状态变化2.LT模式3.ET模式1.前言 好久好久没有更新博客了,最近一直在实习&a…...

Linux驱动开发——高级I/O操作(一)
一个设备除了能通过读写操作来收发数据或返回、保存数据,还应该有很多其他的操作。比如一个串口设备还应该具备波特率获取和设置、帧格式获取和设置的操作;一个LED设备甚至不应该有读写操作,而应该具备点灯和灭灯的操作。硬件设备是如此众多,…...
适配器模式:C++设计模式中的瑞士军刀
适配器模式揭秘:C设计模式中的瑞士军刀引言设计模式的重要性适配器模式简介与应用场景适配器模式在现代软件设计中的地位与价值适配器模式基本概念适配器模式的定义与核心思想类适配器与对象适配器的比较设计原则与适配器模式的关系类适配器实现类适配器模式的UML图…...

【三十天精通Vue 3】 第三天 Vue 3的组件详解
✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录引言一、Vue 3 组件的概述1. Vue 3 的组件系统2. Vue 3 组件的特点…...

SqlServer实用系统视图,你了解多少?
SqlServer实用系统视图,你了解多少?前言master..spt_valuessysdatabasessysprocesses一套组合拳sysobjectssys.all_objectssyscolumnssystypessyscommentssysindexes结束语前言 在使用任何数据库软件的时候,该软件都会提供一些可能不是那么公…...

NodeJS Cluster模块基础教程
Cluster简介 默认情况下,Node.js不会利用所有的CPU,即使机器有多个CPU。一旦这个进程崩掉,那么整个 web 服务就崩掉了。 应用部署到多核服务器时,为了充分利用多核 CPU 资源一般启动多个 NodeJS 进程提供服务,这时就…...

[C++笔记]vector
vector vector的说明文档 vector是表示可变大小数组的序列容器(动态顺序表)。就像数组一样,vector也采用连续的存储空间来储存元素。这就意味着可以用下标对vector的元素进行访问,和数组一样高效。与数组不同的是,它的大小可以动态改变——…...
Python 迁移学习实用指南:1~5
原文:Hands-On Transfer Learning with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只关心如…...

【CSS重点知识】属性计算的过程
✍️ 作者简介: 前端新手学习中。 💂 作者主页: 作者主页查看更多前端教学 🎓 专栏分享:css重难点教学 Node.js教学 从头开始学习 ajax学习 标题什么是计算机属性确定声明值层叠冲突继承使用默认值总结什么是计算机属性 CSS属性值的计算…...

Java避免死锁的几个常见方法(有测试代码和分析过程)
目录 Java避免死锁的几个常见方法 死锁产生的条件 上死锁代码 然后 :jstack 14320 >> jstack.text Java避免死锁的几个常见方法 Java避免死锁的几个常见方法 避免一个线程同时获取多个锁。避免一个线程在锁内同时占用多个资源,尽量保证每个锁…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...