Springboot MVC
1. Springboot为MVC提供的自动配置
Spring Boot 为 Spring MVC 提供了自动配置,这在大多数应用程序中都能很好地工作。除了已经实现了 Spring MVC 的默认功能外,自动配置还提供了以下特性:
- 包括 ContentNegotiatingViewResolver 和 BeanNameViewResolver 的 Bean。
- ContentNegotiatingViewResolver 自动根据HTTP请求头中Accept字段来选择合适的视图技术渲染响应。
- BeanNameViewResolver的作用是根据视图名称找到视图View对象。
- 支持提供静态资源,包括对 WebJars的支持。
- 静态资源路径默认已经配置好了。默认会去static目录下找。
- 自动注册 Converter、GenericConverter 和 Formatter 的 Bean。
- Converter:转换器,做类型转换的,例如表单提交了用户数据,将表单数据转换成User对象。
- Formatter:格式化器,做数据格式化的,例如将Java中的日期类型对象格式化为特定格式的日期字符串。或者将用户提交的日期字符串,转换为Java中的日期对象。
- 支持 HttpMessageConverters。
- 内置了很多的HTTP消息转换器。例如:MappingJackson2HttpMessageConverter可以将json转换成java对象,也可以将java对象转换为json字符串。
- 自动注册 MessageCodesResolver。
- SpringBoot会自动注册一个默认的消息代码解析器
- 帮助你在表单验证出错时生成一些特殊的代码。这些代码让你能够更精确地定位问题,并提供更友好的错误提示。
- 静态 index.html 文件支持。
- Spring Boot 会自动处理位于项目静态资源目录下的 index.html 文件,使其成为应用程序的默认主页
- 自动使用 ConfigurableWebBindingInitializer Bean。
- 用它来指定默认使用哪个转换器,默认使用哪个格式化器。在这个类当中都已经配好了。
- 如果您不想使用自动配置并希望完全控制 Spring MVC,可以添加您自己的带有
@EnableWebMvc注解的@Configuration。 - 如果您希望保留这些 Spring Boot MVC 定制化设置并进行更多的 MVC 定制化(如拦截器、格式化程序、视图控制器等其他功能),可以添加您自己的类型为 WebMvcConfigurer 的 @Configuration 类。但不能使用
@EnableWebMvc注解。
2. 关键的自动配置类:WebMvcAutoConfiguration
public class WebMvcAutoConfiguration {@Bean@ConditionalOnMissingBean({HiddenHttpMethodFilter.class})@ConditionalOnProperty(prefix = "spring.mvc.hiddenmethod.filter",name = {"enabled"})// 这个过滤器是专门处理Rest请求的。GET POST PUT DELETE请求。public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {return new OrderedHiddenHttpMethodFilter();}@Bean@ConditionalOnMissingBean({FormContentFilter.class})@ConditionalOnProperty(prefix = "spring.mvc.formcontent.filter",name = {"enabled"},matchIfMissing = true)//OrderedFormContentFilter 是 Spring Boot 中用于处理 HTTP 请求的一个过滤器,特别是针对 PUT 和 DELETE 请求。//这个过滤器的主要作用是在处理 PUT 和 DELETE 请求时,确保如果请求体中有表单格式的数据,这些数据会被正确解析并可用。public OrderedFormContentFilter formContentFilter() {return new OrderedFormContentFilter();}@Configuration(proxyBeanMethods = false)@Import({EnableWebMvcConfiguration.class})@EnableConfigurationProperties({WebMvcProperties.class, WebProperties.class})@Order(0)// 关键方法: 进行了一系列的Spring MVC相关配置public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer, ServletContextAware {}@Configuration(proxyBeanMethods = false)@EnableConfigurationProperties({WebProperties.class})// 启动配置public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration implements ResourceLoaderAware {}
}
3. WebMvcAutoConfigurationAdapter :修改配置
1. 类实现的 WebMvcConfigurer接口
public interface WebMvcConfigurer {// 用于定制 Spring MVC 如何匹配请求路径到控制器default void configurePathMatch(PathMatchConfigurer configurer) {}// 用于定制 Spring MVC 的内容协商策略,以确定如何根据请求的内容类型来选择合适的处理方法或返回数据格式default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {}// 用于定制 Spring MVC 处理异步请求的方式default void configureAsyncSupport(AsyncSupportConfigurer configurer) {}// 用于定制是否将某些静态资源请求转发WEB容器默认的Servlet处理default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {}// 用于定制 Spring MVC 解析视图的方式,以确定如何将控制器返回的视图名称转换为实际的视图资源。default void configureViewResolvers(ViewResolverRegistry registry) {}// 用于定制 Spring MVC 如何处理 HTTP 请求和响应的数据格式,包括 JSON、XML 等内容类型的转换default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {}// 用于定制 Spring MVC 如何处理控制器方法中发生的异常,并提供相应的错误处理逻辑。default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {}// 用于定制 Spring MVC 如何处理数据的格式化和解析,例如日期、数值等类型的对象的输入和输出格式。default void addFormatters(FormatterRegistry registry) {}// 用于定制 Spring MVC 如何使用拦截器来处理请求和响应,包括在请求进入控制器之前和之后执行特定的操作。default void addInterceptors(InterceptorRegistry registry) {}// 用于定制 Spring MVC 如何处理静态资源(如 CSS、JavaScript、图片等文件)的请求。default void addResourceHandlers(ResourceHandlerRegistry registry) {}// 用于定制 Spring MVC 如何处理跨域请求,确保应用程序可以正确地响应来自不同域名的 AJAX 请求或其他跨域请求。default void addCorsMappings(CorsRegistry registry) {}// 用于快速定义简单的 URL 到视图的映射,而无需编写完整的控制器类和方法。default void addViewControllers(ViewControllerRegistry registry) {}// 用于定制 Spring MVC 如何解析控制器方法中的参数,包括如何从请求中获取并转换参数值。default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {}// 用于定制 Spring MVC 如何处理控制器方法的返回值,包括如何将返回值转换为实际的 HTTP 响应。default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {}// 用于定制 Spring MVC 如何处理 HTTP 请求和响应的数据格式,允许你添加或调整默认的消息转换器,以支持特定的数据格式。default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {}// 用于定制 Spring MVC 如何处理控制器方法中抛出的异常,允许你添加额外的异常处理逻辑。default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {}
}
2. 配置类的配置属性:WebMvcProperties.class
- 主要用于配置 Spring MVC 的相关行为,例如路径匹配、视图解析、静态资源处理等
@ConfigurationProperties(prefix = "spring.mvc"
)
public class WebMvcProperties {}
3. 配置类的配置属性:WebProperties.class
- 通常用于配置一些通用的 Web 层设置,如资源处理、安全性配置等。
@ConfigurationProperties("spring.web")
public class WebProperties {
4. 静态资源配置:addResourceHandlers
- addResourceHandlers方法:使用了方法重载,有3个addResourceHandlers方法
第一个addResourceHandlers方法:静态资源的目录
public void addResourceHandlers(ResourceHandlerRegistry registry) {}
此方法指定了静态资源路径:
- 当请求路径是
/webjars/**,则会去classpath:/META-INF/resources/webjars/找。 - 当请求路径是
/,则会去classpath:/META-INF/resources/;classpath:/resources/;classpath:/static/;classpath:/public/找。
第三个addResourceHandlers方法:静态资源的缓存配置
private void addResourceHandler(ResourceHandlerRegistry registry, String pattern, Consumer<ResourceHandlerRegistration> customizer) { // 设置缓存的过期时间(如果没有指定单位,默认单位是秒)registration.setCachePeriod(this.getSeconds(this.resourceProperties.getCache().getPeriod()));//设置静态资源的 Cache-Control HTTP 响应头,告诉浏览器如何去缓存这些资源。registration.setCacheControl(this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl());// 设置静态资源在响应时,是否在响应头中添加资源的最后一次修改时间。registration.setUseLastModified(this.resourceProperties.getCache().isUseLastModified());this.customizeResourceHandlerRegistration(registration);}
}
1. 配置文件修改静态资源
- 静态资源缓存设置
// 1. 缓存有效期
spring.web.resources.cache.period=100
// 2. 缓存控制(cachecontrol配置的话,period会失效)
spring.web.resources.cache.cachecontrol.max-age=20
// 3. 是否使用缓存的最后修改时间(默认是:使用)
spring.web.resources.cache.use-last-modified=true
// 4. 是否开启静态资源默认处理方式(默认是:开启)
spring.web.resources.add-mappings=true
- 静态资源目录配置:
// 1. 设置webjars静态资源的请求路径的前缀
spring.mvc.webjars-path-pattern=/wjs/**
// 2. 设置普通静态资源的请求路径的前缀
spring.mvc.static-path-pattern=/static/**
// 3. 修改静态资源存放位置
// 但是 classpath:/META-INF/resources/ 静态资源不受此配置的影响
spring.web.resources.static-locations=classpath:/static1/,classpath:/static2/
2. 实现接口方式修改静态资源配置
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry){registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");}
}
5. 拦截器配置
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new HandlerInterceptor() {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("拦截器:preHandle");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("拦截器:postHandle");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("拦截器:afterCompletion");}});}
}
4. EnableWebMvcConfiguration :启用配置
@Configuration(proxyBeanMethods = false)@EnableConfigurationProperties({WebProperties.class})public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration implements ResourceLoaderAware {}
1. 首页映射
@Beanpublic WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {return (WelcomePageHandlerMapping)this.createWelcomePageHandlerMapping(applicationContext, mvcConversionService, mvcResourceUrlProvider, WelcomePageHandlerMapping::new);}
- 会在4个静态资源目录中查找index.html文件作为欢迎页
5. 异常处理
- 以下代码适合前后端分离的项目,只要给前端返回错误信息,如何展示由前端决定
1. 局部异常处理 @ExceptionHandler
- 只针对当前controller的异常进行处理
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@GetMapping("/resource/{id}")public String getResource(@PathVariable Long id){if(id == 1){throw new IllegalArgumentException("无效ID:" + id);}return "ID = " + id;}@ExceptionHandler(IllegalArgumentException.class)public String handler(IllegalArgumentException e){return "错误信息:" + e.getMessage();}
}
2. 全局异常处理:@ControllerAdvice + @ExceptionHandler
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(IllegalArgumentException.class)@ResponseBodypublic String handler(IllegalArgumentException e){return "错误信息:" + e.getMessage();}
}
6. web服务器的配置类
- web服务器的自动配置类:
ServletWebServerFactoryAutoConfiguration - web服务器默认配置:ServerProperties.class
@EnableConfigurationProperties({ServerProperties.class})
public class ServletWebServerFactoryAutoConfiguration {}
1. tomcat服务器常见配置
# 这个参数决定了 Tomcat 在接收请求时,如果在指定的时间内没有收到完整的请求数据,将会关闭连接。这个超时时间是从客户端发送请求开始计算的。
# 防止长时间占用资源:如果客户端发送请求后,长时间没有发送完所有数据,Tomcat 会在这个超时时间内关闭连接,从而释放资源,避免资源被长时间占用。
server.tomcat.connection-timeout=20000# 设置 Tomcat 服务器处理请求的最大线程数为 200。
# 如果超过这个数量的请求同时到达,Tomcat 会将多余的请求放入一个等待队列中。
# 如果等待队列也满了(由 server.tomcat.accept-count 配置),新的请求将被拒绝,通常会返回一个“503 Service Unavailable”错误。
server.tomcat.max-threads=200# 用来设置等待队列的最大容量
server.tomcat.accept-count=100# 设置 Tomcat 服务器在空闲时至少保持 10 个线程处于活动状态,以便快速响应新的请求。
server.tomcat.min-spare-threads=10# 允许 Tomcat 服务器在关闭后立即重新绑定相同的地址和端口,即使该端口还在 TIME_WAIT 状态
# 当一个网络连接关闭时,操作系统会将该连接的端口保持在 TIME_WAIT 状态一段时间(通常是 2-4 分钟),以确保所有未完成的数据包都能被正确处理。在这段时间内,该端口不能被其他进程绑定。
server.tomcat.address-reuse-enabled=true# 设置 Tomcat 服务器绑定到所有可用的网络接口,使其可以从任何网络地址访问。
server.tomcat.bind-address=0.0.0.0# 设置 Tomcat 服务器使用 HTTP/1.1 协议处理请求。
server.tomcat.protocol=HTTP/1.1# 设置 Tomcat 服务器的会话(session)超时时间为 30 分钟。具体来说,如果用户在 30 分钟内没有与应用进行任何交互,其会话将被自动注销。
server.tomcat.session-timeout=30# 设置 Tomcat 服务器的静态资源缓存时间为 3600 秒(即 1 小时),这意味着浏览器会在 1 小时内缓存这些静态资源,减少重复请求。
server.tomcat.resource-cache-period=3600# 解决get请求乱码。对请求行url进行编码。
server.tomcat.uri-encoding=UTF-8# 设置 Tomcat 服务器的基础目录为当前工作目录(. 表示当前目录)。这个配置指定了 Tomcat 服务器的工作目录,包括日志文件、临时文件和其他运行时生成的文件的存放位置。 生产环境中可能需要重新配置。
server.tomcat.basedir=.
7. PageHelper
- 引入依赖
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>2.1.0</version>
</dependency>
- 编写代码
@RestController
public class VipController {@Autowiredprivate VipService vipService;@GetMapping("/list/{pageNo}")// 注意方法的返回值public PageInfo<Vip> list(@PathVariable("pageNo") Integer pageNo) {// 1.设置当前页码和每页显示的记录条数PageHelper.startPage(pageNo, Constant.PAGE_SIZE);// 2.获取数据(PageHelper会自动给SQL语句添加limit)List<Vip> vips = vipService.findAll();// 3.将分页数据封装到PageInfoPageInfo<Vip> vipPageInfo = new PageInfo<>(vips);return vipPageInfo;}
}
8. R
package org.example.learn.enums;import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;@AllArgsConstructor
@NoArgsConstructor
public enum CodeEnum {OK (200, "成功"),FAIL(500, "失败"),NOT_FOUND(404, "未找到资源"),UNAUTHORIZED(401, "未授权"),FORBIDDEN(403, "禁止访问"),BAD_REQUEST(400, "请求错误"),INTERNAL_SERVER_ERROR(500, "服务器错误"),SERVICE_UNAVAILABLE(503, "服务不可用"),GATEWAY_TIMEOUT(504, "网关超时"),INTERNAL_ERROR(500, "内部服务器错误"),MODIFICATION_FAILED(400, "修改失败"),DELETE_FAILED(400, "删除失败"),ADD_FAILED(400, "添加失败");@Setter@Getterprivate int code;@Setter@Getterprivate String message;}
package org.example.learn.result;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.example.learn.enums.CodeEnum;@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class R<T> {private Integer code;private String message;private T data;public static R OK() {return R.builder().code(CodeEnum.OK.getCode()).message(CodeEnum.OK.getMessage()).build();}public static <T> R<T> OK(T data) {return R.<T>builder().code(CodeEnum.OK.getCode()).message(CodeEnum.OK.getMessage()).data(data).build();}public static <T> R<T> FAIL() {return R.<T>builder().code(CodeEnum.FAIL.getCode()).message(CodeEnum.FAIL.getMessage()).build();}public static <T> R<T> FAIL(CodeEnum codeEnum){return R.<T>builder().code(codeEnum.getCode()).message(codeEnum.getMessage()).build();}}
@GetMapping(value = "/all/{pageNo}")public R<PageInfo<Vip>> getAll(@PathVariable int pageNo) {PageHelper.startPage(pageNo,3);List<Vip> all = vipService.getAll();PageInfo<Vip> vipPageinfo = new PageInfo<>(all);return R.OK(vipPageinfo);}@GetMapping(value = "/fail")public R<String> fail() {return R.FAIL(CodeEnum.INTERNAL_ERROR);}
9. logger
- springboot集成logback日志框架,且日志级别默认为info
- 使用lombok的
@Slf4j注解简化日志输出
1. 使用
@Slf4j
@SpringBootApplication
public class Learn10LogApplication {public static void main(String[] args) {SpringApplication.run(Learn10LogApplication.class, args);log.trace("main------trace级别日志");log.debug("main------debug级别日志");log.info("main------info级别日志");log.warn("main------warn级别日志");log.error("main------error级别日志");}}
2. 调整日志级别及颗粒度
# springboot默认的级别是info
# 设置全局的日志级别是error
logging.level.root=error# 指定包名调整日志级别
logging.level.org.example.learn.controller=info
# 指定类名调整日志级别,不能是接口
logging.level.org.example.learn.service.impl.UserServiceImpl=trace
- 指定对数据库操作的日志级别,需要对mapper接口的包名指定日志级别
logging.level.org.example.learn.mapper=DEBUGlogging:level:org.example.learn.mapper: DEBUG
3. 指定日志的输出路径和日志文件名
- 指定日志的输出路径和日志的文件名不能同时使用,如果同时使用,则指定路径无效
# 指定日志的输出路径和日志的文件名不能同时使用,如果同时使用,则指定路径无效# 日志输出到文件,指定文件路径为当前工程根目录下的log目录
logging.file.path=./log/# 日志输出到文件,指定日志文件的文件名,路径是当前项目的根路径
logging.file.name=my.log
4. 滚动日志
# 日志文件达到多大时进行归档
logging.logback.rollingpolicy.max-file-size=100MB# 所有的归档日志文件总共达到多大时进行删除,默认是0B表示不删除
logging.logback.rollingpolicy.total-size-cap=50GB# 归档日志文件最多保留几天
logging.logback.rollingpolicy.max-history=60# 启动项目时是否要清理归档日志文件
logging.logback.rollingpolicy.clean-history-on-start=false# 归档日志文件名的格式
logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
10. 事务
在service的类或者方法上使用注解
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
rollbackFor = Exception.class表示当抛出任何类型的 Exception 时,都会回滚事务。propagation = Propagation.REQUIRED表示如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认的传播行为。
相关文章:
Springboot MVC
1. Springboot为MVC提供的自动配置 Spring Boot 为 Spring MVC 提供了自动配置,这在大多数应用程序中都能很好地工作。除了已经实现了 Spring MVC 的默认功能外,自动配置还提供了以下特性: 包括 ContentNegotiatingViewResolver 和 BeanNam…...
MySQL数据表记录增操作
对数据库的操作用的最最频繁的呢,总结起来就四个字:增删改查! 查是属于DQL(Data QueryLanguage ,数据查询语言)部分,而增、改、删属于DML(Data Manipulation Language, 数据操纵语言) 增:作用是往数据库的数据表里写入记录值 语…...
maven报错“找不到符号“
问题 springboot项目 maven编译打包过程,报错"找不到符号" 解决 很多网上方法都试过,都没用 换jdk,把17->21...
python进阶-05-利用Selenium来实现动态爬虫
python进阶-05-利用Selenium来实现动态爬虫 一.说明 这是python进阶部分05,我们上一篇文章学习了Scrapy来爬取网站,但是很多网站需要登录才能爬取有用的信息,或者网站的静态部分是一个空壳,内容是js动态加载的,或者人机验证&…...
P1226 【模板】快速幂
题目描述 给你三个整数 𝑎,𝑏,𝑝求 𝑎𝑏 mod 𝑝 输入格式 输入只有一行三个整数,分别代表 𝑎,𝑏,𝑝 输出格式 输出一行一个字符串 a^b mod ps…...
【C++】求第二大的数详细解析
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述💯输入描述💯解题思路分析1. 题目核心要求2. 代码实现与解析3. 核心逻辑逐步解析定义并初始化变量遍历并处理输入数据更新最大值与次大值输…...
从零开始学TiDB(3)TiKV 持久化机制
如图,每个TiKV有两个rocksdb实例,rocksdbKV复制存储键值对,rocksdb raft负责存储复制的日志 。 每个region及其副本构成了raft group。这个OB的Zone其实有点类似,在OB中每个Unit及其副本构成了paxos组,在TiDB中叫raft…...
Elasticsearch+Kibana+IK分词器+拼音分词器安装
目录 ES报错 Kibanaik分词器拼音分词器 安装都比较简单,可以参考这几篇博客 ES 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch 报错 ES启动报错error downloading geoip database [GeoLite2-ASN.mmdb] Kibana KIBANA的安装教程ÿ…...
子网划分实例
看到有人问这个问题: 想了一下,这是一个子网划分的问题: 处理方法如图: 这是一个子网划分的问题 设备1用三层交换机,端口设置为路由模式,设备2和设备3为傻瓜交换机模式 设备2和设备3下挂设备都是26为掩码&…...
上海亚商投顾:创业板指震荡调整 机器人概念股再度爆发
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日冲高回落,深成指、创业板指盘中跌超1%,尾盘跌幅有所收窄。机器人概念股逆势爆…...
【C++ 20进阶(2):初始化 Initializer
【C 20进阶(2):初始化 Initializer】 原文:https://blog.csdn.net/weixin_44259356/article/details/144377955 引言 本篇文章为系列文章将着重介绍C20新特性,一是希望可以和大家交流分享,二是也便于自己…...
【重生之我在B站学MySQL】
MySQL笔记 文章目录 MySQL的三层结构SQL语句分类sql语句数据库操作创建数据库查看、删除数据库 表操作创建表mysql常用数据类型(列类型)查询表、插入值创建表练习创建一个员工表emp 修改表mysql约束primary key(主键)not null(非空)unique(唯一)foreign key(外键)check自增长 索…...
Python实现中国象棋
探索中国象棋 Python 代码实现:从规则逻辑到游戏呈现 中国象棋,这款源远流长的棋类游戏,承载着深厚的文化底蕴与策略智慧。如今,借助 Python 与 Pygame 库,我们能够在数字世界中复刻其魅力,深入探究代码背后…...
LBS 开发微课堂|通过openGL ES轻松实现建筑物渲染及动画
为了让广大开发者 更深入地了解 百度地图开放平台的 技术能力 轻松掌握满满的 技术干货 更加简单地接入 位置服务 我们特别推出了 “位置服务(LBS)开发微课堂” 系列技术案例 第五期的主题是 通过openGL ES轻松实现 建筑物渲染及动画 对于…...
map1[item.id]和map1.get(item.id)的区别为何前者取出的是空,后者取出的是正确的值
在 JavaScript 中,map1[item.id] 和 map1.get(item.id) 用于从 Map 对象中获取值,但它们的工作方式有所不同: map1[item.id]:这种方式用于普通对象(Object),它将 item.id 作为键来获取对应的值…...
window端sqlplus连接linux_oracle11g
1. 环境配置回顾 下载 Oracle Instant Client:根据查询到的版本到链接: oracle官网下载对应版本的三个文件(比如我这里查询到的版本是12.2.0.1.0): instantclient-basic-windows.x64-12.2.0.1.0.zip instantclient-sqlplus-win…...
Go支付中台方案:多平台兼容与多项目对接
一、中台的概念 中台是一种企业级的架构模式,它处于前台应用和后台资源之间,将企业核心能力进行整合、封装,形成一系列可复用的业务能力组件。这些组件就像乐高积木一样,可以被不同的前台业务快速调用,从而避免重复开…...
MySQL触发器的使用详解
MySQL触发器的使用详解 MySQL触发器是一种特殊的存储过程,它与表操作紧密相关,并且在特定事件(如INSERT、UPDATE或DELETE)发生时自动执行。触发器的主要目的是确保数据完整性、实现复杂的业务逻辑以及记录审计信息。它们可以在事…...
关于NLP交互式系统的一些基础入门
【1】What 基于自然语言处理(NLP)的交互式系统是指能够理解、解析并生成人类自然语言的计算机程序。这些系统旨在通过文本或语音与用户进行交流,以提供信息、解决问题或执行任务。以下是关于这类系统的一些关键点: 核心技术&…...
如何在HTML中修改光标的位置(全面版)
如何在HTML中修改光标的位置(全面版) 在Web开发中,控制光标位置是一个重要的技巧,尤其是在表单处理、富文本编辑器开发或格式化输入的场景中。HTML中的光标位置操作不仅适用于表单元素(如<input>和<textarea…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
