Spring Boot学习笔记
SpringBoot特征
特征
-
创建独立的 Spring 应用程序
-
直接嵌入 Tomcat、Jetty 或 Undertow(无需部署 WAR 文件)
-
提供“入门”依赖项以简化构建配置
-
尽可能自动配置 Spring 和 第三方库
-
提供生产就绪功能,例如指标、健康检查和外部化配置
-
完全无需代码生成,无需 XML 配置
创建SpringBoo项目
第一种方式,使用Spring提供的初始化器,就是向导创建SpringBoot应用
1.IEDA创建一个空项目
2.新建一个Module
还可以使用国内地址(镜像) https://start.springboot.io
3.
4.选择依赖项
5.
6.
7.配置好的SpringBoot目录结构
8.
@Controller:后端控制器
@RequestMapping("/hello"):访问路径
@ResponseBody:将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据
9.
10.去浏览器访问 @RequestMapping("/hello")地址
多环境配置
在实际开发过程中,项目会经历很多阶段(开发->测试->上线),每个阶段的配置也会不同,例如,端口,上下文跟,数据库,那么这个时候为了方便不同环境之间的切换,SpringBoot提供了多环境配置,具体步骤如下
项目名:006-SpringBoot-multi-asdn
为每个环境创建一个配置文件,命名必须以application-环境标识.yml
注解
一、@controller: controller控制器层(注入服务)
二、@service : service服务层(注入dao)
三、@repository : dao持久层(实现dao访问)
四、@component: 标注一个类为Spring容器的Bean,(把普通pojo实例化到spring容器中,至关于配置文件中的<bean id="" class=""/>)spring
@ConfigurationProperties
在SpringBoot中,当需要获取到配置文件数据时,除了可以用Spring自带的@Value注解外,
SpringBoot提供了一种更加方便的方式:@ConfigurationProperties。
只要在bean上添加上这个注解,指定好配置文件的前缀,那么对应的配置文件数据就会自动填充到bean中。
举个栗子,现在有如下配置:
1 myconfig.name=test
2 myconfig.age=22
3 myconfig.desc=这是我的测试描述添加对应的配置类,并添加上注解@ConfigurationProperties,指定前缀为myconfig
1 @Component
2 @ConfigurationProperties(prefix = "myconfig")
3 public class MyConfig {
4 private String name; //属性名要和配置文件中的名字一样
5 private Integer age; //属性名要和配置文件中的名字一样
6 private String desc; //属性名要和配置文件中的名字一样
7 //get//set 略
8 @Override
9 public String toString() {
10 return "MyConfig [name=" + name + ", age=" + age + ", desc=" + desc + "]";
11 }
12}
使用容器
获取容器中的对象
CommandLineRunner 接口
在开发中会有这样的情景,需要在容器启动后执行一些内容,比如读取配置文件,数据库连接之类的,SpringBoot给提供了两个接口帮我们实现这种需求,这两个接口分别为CommandLineRunner和ApplicationRunner。他们的执行时机为容器启动完成的时候,这两个接口中有一个run方法,只需要实现这个方法即可。这两个接口的不同之处在于:ApplicationRunner中run方法的参数为ApplicationArguments,而CommandLineRunner接口中run方法的参数为String数组
Web组件
拦截器
拦截器是SpringMVC中的一种对象,能拦截对COntroller的请求
拦截器框架中有系统的拦截器,还可以自定义拦截器,实现对请求的拦截
实现自定义拦截器:创建类去实现HandlerInterceptor接口重写方法
package org.springframework.web.servlet;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;public interface HandlerInterceptor {default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return true;}default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {}default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {}
}
需要在SpringMVC的配置文件中,声明拦截器
<mvc:interceptors><mvc:interceptor><mvc:path="url"/><bean class="拦截器类全限定名称"/></mvc:interceptor>
</mvc:interceptors>
SpringBoot中拦截器
1.创建一个类去实现HandlerInterceptor接口重写preHandle方法
2.通过WebMvcConfigurer接口实现一个配置类,再通过@Configuration 注解注入到容器
/*** 拦截器注入到容器中*/
@Configuration
public class MyappConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {//创建拦截器对象HandlerInterceptor interceptor = new Interceptor();//指定拦截的请求urlString[] url = {"/user/**"};//不拦截的url请求地址String[] path ={"/user/login"};registry.addInterceptor(interceptor).addPathPatterns(url).excludePathPatterns(path);}
}
3.创建controller去实验一下
4.运行程序访问/user/acc和/user/login
访问/user/acc地址,拦截器中的preHandle方法执行了,说明该请求被拦截器拦截
SpringBoot 中Servlet
1.自定义一个servlet类
2.注册servlet
SpringBoot中使用Filter
实现步骤:
1.创建Filter对象
2.FilterRegistrationBean用来注册Filter对象
字符集过滤器
CharacterEncodingFilter:解决post请求中乱码的问题
实现步骤:
1.配置字符集过滤器
@Configuration
public class WebApplicationConfig {@Beanpublic ServletRegistrationBean servletRegistrationBean(){ServletRegistrationBean bean = new ServletRegistrationBean(new Myservlet(),"/myservlet");return bean;}/*配置字符集过滤器*/@Beanpublic FilterRegistrationBean filterRegistrationBean(){FilterRegistrationBean filter = new FilterRegistrationBean();//使用框架中的过滤器CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();//指定编码的格式characterEncodingFilter.setEncoding("utf-8");//指定request,response都使用utf-8编码characterEncodingFilter.setForceEncoding(true);filter.setFilter(characterEncodingFilter);filter.addUrlPatterns("/*");return filter;}
}
2.修改application.properties文件,让自定义过滤器起作用
#springboot中默认是配置了CharacterEncodingFilter。默认编码ISO-8859-1
#设置为false,关闭默认配置使用自定义字符过滤器
server.servlet.encoding.enabled=false
第二种修改字符集方式:
ORM操作MySQL
在SpringBoot框架中集成MyBatis
使用步骤:
1.添加mybatis起步依赖
2.pom.xml指定把src/main/java目录中的xml文件包含classpath中
3.创建实体类
4.创建Dao接口,创建查询方法
5.创建Dao接口对应的Mapper文件
6.创建servlice接口和实现类,去调Dao接口中的方法
7.创建Controller层,去调用service中的方法
8.写application.properties文件
9.在启动类上添加@MapperScan(basePackages = "com.demo.dao")
10.启动springboot测试就ok
第二种方式:Mapper文件和dao接口分开管理(推荐使用)
1.在resources目录中创建子目录(自定义),例如,mapper
2.把mapper.xml文件放到mapper目录中
3.在application.properties文件中,指定mapper.xml文件的位置
mybatis.mapper-locations=classpath:mapper/*.xml
4.在pom.xml中指定把resources目录中的文件,编译到目标目录中
<resources><resource><directory>src/main/resources</directory><includes><include>**/*.*</include></includes></resource>
</resources>
事务
spring框架中的事务
1.管理事务的对象:事务管理器(接口,接口有很多实现类)
例如,使用jdbc和mybatis访问数据库,使用的事务管理器:DataSourceTransactionManager
2.声明事务:在xml配置文件或使用注解方式说明事务控制的内容
控制事务:隔离级别、传播行为、超时时间
3.事务处理方式
Spring框架中注解@Transactional
aspecJ框架可以在xml配置文件中,声明事务控制的内容
SpringBoot中使用事务:以上两种方式都可以,这里使用注解方式
1.在业务方法上面加入@Transactional,加入注解方法就有事务功能了
2.在主启动类上面加入,@EnableTransactionManager
SpringBoot中使用Redis数据库
1.启动Redis服务,客户端连接redis服务
2.IEDA中新建模块,依赖项选择Web 和 NoSQL
3.在application.properties配置文件中添加连接redis数据库ip和端口
4.写个测试类访问redis数据库
@RestController
public class RedisController {@Resourceprivate RedisTemplate redisTemplate;@GetMapping("/redis/set")public String addredis(String name,String value){/*通过RedisTemplate类中的opsForValue()方法可以操控redis数据库中String类型的数据*/ValueOperations redis = redisTemplate.opsForValue();redis.set("myname","lisi");return "向redis数据库添加String类型数据";}@GetMapping("/redis/get")public String getredis(String key){ValueOperations redis = redisTemplate.opsForValue();String v = (String) redis.get(key);return key+":::"+v;}
}
以上两个方法执行结果都会被序列化成二进制数据,第一个方法写入redis数据库中的数据被序列化,我们查看很不方便,如下图
这时候就要使用序列化和反序列化技术
Redis序列化
序列化:把对象转化为可以传输的字节序列过程称为序列化
反序列化:把字节序列还原为对象的过程称为反序列化
Q为什么要序列化?
序列化最终的目的是为了对象可以跨平台存储,和进行网络传输。跨平台存储和网络传输的方式就是IO,而IO支持的数据格式就是字节数据,再把对象转成字节数组的时候制定一种规则(序列化),我们从IO流里读取数据的时候再以制定的规则把对象还原回来(反序列化)
序列化的方式?
常见的序列化方式有:jdk(不支持跨语言)、JSON、XML、Hessian等。
java的序列化:把java对象转换为byte[],二进制数据。
json序列化:是将java对象转换成字符串:{"name":"李四","age":"22"},反序列化是将
{"name":"李四","age":"22"}转换成java对象,对象属性是name,值是李四。
设置RredisTemplate序列化
可以设置key的序列化、也可以只设置value的序列化,也可以同时都设置
使用json序列化,把java对象转换为json字符串存储
1.创建一个student类实现Serializable接口,并添加序列化版本号
2.使用json序列化把一个java对象存储到redis数据库
3.使用json反序列化从redis中取出刚才存储的java对象显示在页面上
输出结果
springBoot集成Dubbo
1.创建接口
创建一个接口项目,该项目只定义接口和实体类,此项目就是一个普通的maven项目
2.服务提供者
新建一个项目使用Spring 初始化器创建,不用选择依赖项,实现接口项目里的接口
在pom.xml文件中添加依赖
<!--接口依赖--><dependency><groupId>com.song</groupId><artifactId>014-interface-api</artifactId><version>1.0.0</version></dependency><!--dubbo依赖--><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.7.8</version></dependency><!--zookeeper注册中心依赖--><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper</artifactId><version>2.7.8</version><type>pom</type><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion></exclusions></dependency></dependencies>
创建一个StudentServiceImpl类实现StudentService接口,并在类上添加暴露接口的注解
在application.properties文件中添加配置
#配置服务名称
spring.application.name=studentservice-provider#配置扫描包,扫描的@DubboService
dubbo.scan.base-packages=com.song.service#配置dubbo协议,使用注册中心,不用配置协议
#dubbo.protocol.name=dubbo
#dubbo.protocol.port=8081#注册中心
dubbo.registry.address=zookeeper://localhost:2181
在启动类上方添加@EnableDubbo注解
@EnableDubbo注解含义是启用Dubbo,下包含两个注解:
@EnableDubboConfig
@DubboComponentScan:扫描Dubbo注解
3.创建消费者
新建一个项目使用Spring 初始化器创建,不选择依赖,创建好后,把以下依赖添加到pom文件中
<!--web起步依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--接口依赖--><dependency><groupId>com.song</groupId><artifactId>014-interface-api</artifactId><version>1.0.0</version></dependency><!--dubbo依赖--><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.7.8</version></dependency><!--zookeeper注册中心依赖--><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper</artifactId><version>2.7.8</version><type>pom</type><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion></exclusions></dependency>
创建Controller类
在启动类上面添加@EnableDubbo注解
在application.properties文件中添加一下内容
#指定服务名称
spring.application.name=consumer-application#指定注册中心
dubbo.registry.address=zookeeper://localhost:2181
SpringBoot 打 war包
1.在pom.xml文件中修改打包格式,默认是打jar包
2.修改打包后的名字
3.启动类继承SpringBootServletInitializer类,重写configure方法
4.开始打包,IDEA工具栏Build->Build Artifact->选中要打包的项目->Build
SpringBoot打jar包
1.在pom.xml文件中指定maven-plugin插件的版本号
2.下面步骤跟打war包的步骤2和4一样
Thymeleaf模板引擎
SpringBoot集成了Thymeleaf模板技术,并且SpringBoot官方也推荐使用Thymeleaf来代替JSP技术,Thymeleaf是另外的一张模板技术,它本身不属于SpringBoot,SpringBoot只是很好地集成这种模板技术,作为前端页面的数据展示,在过去的 java web开发中,我们往往会使用jsp去完成页面的动态渲染,但是jsp需要翻译编译运行,效率低。
第一个例子
1.使用spring初始化器创建一个模块,
2.勾选依赖,如下图
3.写controller
4.在templates文件夹中新建一个html文件
5.启动类运行访问controller的地址/acc
Thymeleaf表达式
表达式是在页面获取数据的一种thymeleaf语法,类似${key}
标准变量表达式
注意:th:text=""是Thymeleaf的一个属性,用于文件的显示
说明:标准变量表达式用于访问容器tomcat上下文环境中的变量,Thymeleaf中的变量表达式使用${变量名}的方式获取Controller中model其中的数据,也就是request作用域中的数据
选择变量表达式
星号变量表达式
语法:*{key}
作用:获取这个key对应的数据,*{key}需要和th:object这个属性一起使用。
目的:简化获取对象的属性值。
链接表达式
语法:@{url}
作用:表示连接
相关文章:

Spring Boot学习笔记
SpringBoot特征 特征 创建独立的 Spring 应用程序 直接嵌入 Tomcat、Jetty 或 Undertow(无需部署 WAR 文件) 提供“入门”依赖项以简化构建配置 尽可能自动配置 Spring 和 第三方库 提供生产就绪功能,例如指标、健康检查和外部化配置 完…...
图像边缘检测--(Sobel、Laplacian、Canny)
1、图像中各种形状的检测是计算机视觉领域中非常常见的技术之一,特别是图像中直线的检测,圆的检测,图像边缘的检测等,下面将介绍如何快速检测图像边缘。 2、边缘是不同区域的分界线,是周围(局部)像素有显著变化的像素的集合,有幅值与方向两个属性。这个不是绝对的定义,…...

【计算机网络笔记】计算机网络性能(2)——时延带宽积、丢包率、吞吐量/率
系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 系列文章目录时延带宽积丢包率吞吐量/率&am…...

自学(黑客技术)——网络安全高效学习方法
前言 前几天发布了一篇 网络安全(黑客)自学 没想到收到了许多人的私信想要学习网安黑客技术!却不知道从哪里开始学起!怎么学?如何学? 今天给大家分享一下,很多人上来就说想学习黑客,…...

【Linux】进程概念与进程状态
文章目录 一、进程概念1.进程的概念2.进程的描述-PCB 二、进程相关的基本操作1.组织进程2.查看进程3.结束进程4.通过系统调用获取进程标示符5.通过系统调用创建进程-fork初识 三、进程状态1.普遍操作系统层面的进程状态2.Linux操作系统的进程状态 四、两种特殊的进程状态1.僵尸…...

解决安装nvm以后windows cmd无法找到npm/yarn命令的问题
安装了nodejs多版本管理工具nvm以后,会出现windows cmd无法找到npm/yarn命令的问题 只要一运行npm/yarn就会提示:不是内部命令,找不到运行路径之类的。 解决办法:首先打开windows环境变量的配置,查看NVM_SYMLINK指向…...

深入解析Java正则表达式:定义、原理和实例
1.前言 1.1简介 正则表达式在Java开发中扮演着重要的角色。本文将详细讲解Java正则表达式的定义、工作原理,并提供一些实例和示例代码,帮助读者更好地理解和应用正则表达式 1.2使用场景的介绍 正则表达式适用于许多问题和场景,包括但不限于…...

DatenLord前沿技术分享 No.38
达坦科技专注于打造新一代开源跨云存储平台DatenLord,通过软硬件深度融合的方式打通云云壁垒,致力于解决多云架构、多数据中心场景下异构存储、数据统一管理需求等问题,以满足不同行业客户对海量数据跨云、跨数据中心高性能访问的需求。在本周…...

ms-sql server sql 把逗号分隔的字符串分开
案例: sql 查询-字段里是逗号,分隔开的数组,查询匹配数据 sql 查询-字段里是逗号,分隔开的数组,查询匹配数据_sql server 数组匹配-CSDN博客 SQL SERVER 把逗号隔开的字符串拆分成行 SQL SERVER 把逗号隔开的字符串拆分成行_sqlserver拆分…...

零基础制作预约小程序,微信小程序预约服务指南
随着互联网的发展,越来越多的服务开始转移到线上。预约服务也是其中之一。通过微信小程序,商家可以提供更加便捷的预约服务,让客户随时随地预约商品或服务。本文将介绍如何零基础制作预约小程序,包括使用第三方制作平台、选择合适…...
算法---交替合并字符串
题目 给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 示例 1: 输入:word1 “abc”…...

下载运行ps软件提示因为计算机中丢失d3dcompiler_47.dll解决方法
在计算机系统中,DLL文件(动态链接库)是一种重要的共享库,它包含了可被多个程序使用的代码和数据。然而,当某些DLL文件丢失或损坏时,可能会导致程序无法正常运行。本文将介绍四种解决D3DCompiler_47.dll缺失…...
Flutter Image组件如何处理图片加载过程中的错误?
在Flutter中,Image组件可以通过监听加载过程中的错误来处理图片加载过程中的错误。 新一代ChatGpt智能助手 文客微创 具体来说,可以使用Image.network或Image.asset方法加载图片,并使用Builder模式来监听图片加载过程中的状态。 例如&…...

在mysql8查询中使用ORDER BY结合LIMIT时,分页查询时出现后一页的数据重复前一页的部分数据。
这里写目录标题 问题描述:问题模拟:原因分析问题解释问题解决验证官方文档支持 问题描述: 在mysql8查询中使用ORDER BY结合LIMIT时,分页查询时出现后一页的数据重复前一页的部分数据。 问题模拟: 表table_lock_test&…...

【SA8295P 源码分析 (三)】97 - QNX AIS Camera 框架介绍 及 Camera 工作流程分析
【SA8295P 源码分析】97 - QNX AIS Camera 框架介绍 及 Camera 工作流程分析 一、QNX AIS Server 框架分析二、QNX Hypervisor / Android GVM 方案介绍三、Camera APP 调用流程分析四、QCarCam 状态转换过程介绍五、Camera 加串-解串 硬件链路分析六、摄像头初始化检测过程介绍…...

基于epoll封装非阻塞的reactor框架(附源码)
C++常用功能源码系列 文章目录 C++常用功能源码系列前言一、reactor架构二、client端reactor代码三、server端reactor代码四、单reactor架构可以实现百万并发总结前言 本文是C/C++常用功能代码封装专栏的导航贴。部分来源于实战项目中的部分功能提炼,希望能够达到你在自己的项…...

安装Git和git命令使用
文章目录 安装Git创建版本库版本回退工作区和暂存区管理修改撤销修改 安装Git 在Windows上安装Git 在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。 安装完成后,在开始菜单里找到“Git”->“Git Bash”&…...
【SA8295P 源码分析 (四)】65 - emac0-phy 与 emac1-switch兼容 方案实现
【SA8295P 源码分析】65 - emac0-phy 与 emac1-switch兼容 方案实现 系列文章汇总见:《【SA8295P 源码分析 (四)】网络模块 文章链接汇总 - 持续更新中》 本文链接:《【SA8295P 源码分析 (四)】65 - emac0-phy 与 emac1-switch兼容 方案实现》 本文在前文《【SA8295P 源码分析…...
SpringSecurity源码学习二:异常处理
目录 1. 原理2. 组件3. ExceptionTranslationFilter3.1 默认过滤器顺序3.2 ExceptionTranslationFilter源码3.2.1 AuthenticationException异常3.2.2 AccessDeniedException异常 总结 1. 原理 Spring Security 异常处理的原理是通过一系列的异常处理器来处理在安全验证和授权过…...
代码随想录算法训练营第23期day28|491.递增子序列 46.全排列 47.全排列 II
目录 一、(leetcode 491)递增子序列 二、(leetcode 46)全排列 三、(leetcode 47)全排列 II 一、(leetcode 491)递增子序列 力扣题目链接 状态:去重方法错误。 这道题…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...