【SpringBoot】| SpringBoot 和 web组件
目录
一:SpringBoot 和 web组件
1. SpringBoot中使用拦截器(重点)
2. SpringBoot中使用Servlet
3. SpringBoot中使用过滤器(重点)
4. 字符集过滤器的应用
一:SpringBoot 和 web组件
1. SpringBoot中使用拦截器Interceptor(重点)
拦截器是SpringMVC中一种对象,能够拦截器对Controller的请求!
拦截器框架中有系统的拦截器, 还可以自定义拦截器, 实现对请求预先处理!
实现自定义拦截器:
第一步:创建一个类实现SpringMVC框架的HandlerInterceptor接口,重写方法。
HandlerInterceptor接口源码中有三个默认方法,常用的是preHandle方法中进行拦截:
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 {}
}
编写LoginInterceptor类实现HandlerInterceptor接口,并重写preHandler方法
package com.zl.web;import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;// 自定义拦截器
public class LoginInterceptor implements HandlerInterceptor {/*** @param request* @param response* @param handler 被拦截的控制器对象* @return boolean,true:表示请求能被Controller处理,false:表示被截断* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception { // handler是被拦截的控制器对象System.out.println("请求拦截器执行了");return true;}
}
第二步:SpringBoot中注册声明拦截器
SpringMVC框架中注册声明拦截器
<mvc:interceptors><mvc:interceptor><mvc:path="url" /><bean class="拦截器类全限定名称"/></mvc:interceptor>
</mvc:interceptors>
SpringBoot框架中注册声明拦截器
(1)使用类+注解的方式,编写一个类实现WebMvcConfigurer接口(这个接口很重要,很多与SpringMVC有关的功能都在这),并添加@Configuration注解,关于SpringMVC有关的功能都在WebMvcConfigurer接口中实现了!
(2)重写addInterceptors方法,在方法中添加拦截器对象,注入到容器当中;然后在调用addPathPatterns添加拦截的请求,再调用excludePathPatterns排除拦截的请求。
package com.zl.config;import com.zl.web.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration // 这个类当做配置文件使用
public class MyAppConfigurer implements WebMvcConfigurer {// 添加拦截器对象,注入到容器中@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 创建拦截器对象HandlerInterceptor interceptor = new LoginInterceptor();// 调用addInterceptor方法表示注入到容器中// 调用addPathPatterns方法表示可以拦截的请求// 调用excludePathPatterns方法表示通过的请求registry.addInterceptor(interceptor).addPathPatterns("/user/**").excludePathPatterns("/user/login");}
}
第三步:编写controller进行访问
package com.zl.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class BootController {@RequestMapping("/user/account") // 会被拦截@ResponseBodypublic String userAccount(){return "访问user/account地址";}@RequestMapping("/user/login")@ResponseBodypublic String userLogin(){return "访问user/login地址"; // 会被通过
}
2. SpringBoot中使用Servlet
在SpringBoot框架中使用Servlet对象!
使用步骤:
②创建Servlet类继承HttpServlet类。
②注册Servlet ,让框架能找到Servlet。
第一步:创建Servlet类继承HttpServlet
重写doGet和doPost方法,并且在doGet中调用doPost方法,这样不论发过来post请求还是get请求都没有问题!
package com.zl.web;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 调用doPost方法doPost(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 使用HttpServletResponse输出数据,应答结果response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();out.println("执行的是Servlet");out.flush();out.close();}
}
第二步:注册Servlet ,让框架能找到Servlet
(1)ServletRegistrationBean用来做在 servlet 3.0+容器中注册 servlet 的功能,但更具有 SpringBean友好性。
(2)首先写一个类,类名随意,加上@Configuration注解,表示这个类是配置信息的类;再类中编写一个servletRegistrationBean()方法,返回值是ServletRegistrationBean对象
(3)添加上@Bean注解。@Bean用于将对象存入spring的ioc容器中,同@controller、@Service、@Component、@Configuration、@Repository等几个注解是一样的,都是负责将对象存入容器当中。只不过方式不同,四个注解它们是用在类上面的,然后将当前类通过无参构造函数创建对象然后放入容器;而@Bean是用在方法上,将当前方法的返回值对象放到容器当中!可以理解为前者是由spring自动创建对象,而@Bean创建对象是交给我们自己来控制。
package com.zl.config;import com.zl.web.MyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.servlet.Servlet;
import javax.servlet.http.HttpServlet;@Configuration
public class WebAppConfig {// 定义方法,注册Servlet对象@Bean // 把ServletRegistrationBean对象放到容器当中public ServletRegistrationBean servletRegistrationBean(){// 创建ServletRegistrationBean对象,有两个参数:// 一个参数是servlet,一个参数是url地址HttpServlet servlet = new MyServlet();ServletRegistrationBean bean = new ServletRegistrationBean(servlet,"/myservlet");return bean;}
}
当然也可以使用无参数构造方法,调用引用.set方法进行赋值,对于路径也可以赋多个
ServletRegistrationBean bean = new ServletRegistrationBean();
bean.setServlet(servlet);
bean.addUrlMappings("/login","/test"); // 多个路径都可以访问
3. SpringBoot中使用过滤器Filter(重点)
Filter是Servlet规范中的过滤器,可以处理请求、对请求的参数、属性进行调整; 常常在过滤器中处理字符编码。
使用步骤:
①创建自定义过滤器类;
②注册Filter过滤器对象;
注:对于过滤器和拦截器的简单理解
(1)过滤器是用来过滤request或者response参数的(比如:增加一些乱码),侧重于对数据的过滤;
(2)而拦截器是用来验证请求的,能够截断请求!
第一步:创建自定义过滤器类
创建MyFilter类实现Filter接口,重写doFilter方法,进行处理;处理好以后调用filterChain参数的doFilter方法,把请求传递出去,继续进行下一步操作。
package com.zl.web;import javax.servlet.*;
import java.io.IOException;
// 自定义过滤器类
public class MyFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {// 处理字符集编码response.setContentType("text/html;charset=UTF-8");System.out.println("Filter过滤器执行了");// 把请求转发出去filterChain.doFilter(request,response);}
}
第二步:注册过滤器对象
写一个配置类,类名随意,加上@Configuration注解,表示这个类是配置信息的类;再类中编写一个filterRegistrationBean()方法,返回值是FilterRegistrationBean对象,并在方法上加上@Bean注解,把返回的对象交给Spring容器管理。
package com.zl.config;import com.zl.web.MyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.servlet.FilterRegistration;@Configuration
public class WebApplicationConfig {@Beanpublic FilterRegistrationBean filterRegistrationBean (){// 调用无参数构造方法FilterRegistrationBean bean = new FilterRegistrationBean();bean.setFilter(new MyFilter()); // 指定过滤器对象bean.addUrlPatterns("/user/*"); // 指定过滤的地址return bean;}
}
编写controller进行访问
package com.zl.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class CustomerFilterController {@RequestMapping("/user/account")@ResponseBodypublic String userAccount(){return "user/account执行了";}
}
4. 字符集过滤器的应用
CharacterEncodingFilter:解决post请求中乱码的问题;在SpringMVC框架, 在web.xml注册过滤器,配置它的属性,解决乱码问题!

创建一个Servlet
package com.zl.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("在Servlet中使用中文");out.flush();out.close();}
}
注册Servlet
package com.zl.web;import com.zl.servlet.MyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;@Controller
public class WebAppConfig {// 注册Servlet@Beanpublic ServletRegistrationBean servletRegistrationBean(){MyServlet myServlet = new MyServlet();ServletRegistrationBean bean = new ServletRegistrationBean(myServlet, "/myservlet");return bean;}
}
进行访问:发现中文乱码

F12,刷新请求并打开,发现默认的编码方式是:ISO-8859-1

第一种解决方式:自定义过滤器,比较麻烦,不推荐
①在注册Servlet中添加过滤器
package com.zl.web;import com.zl.servlet.MyServlet;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;
import org.springframework.web.filter.CharacterEncodingFilter;@Controller
public class WebAppConfig {// 注册Servlet@Beanpublic ServletRegistrationBean servletRegistrationBean(){MyServlet myServlet = new MyServlet();ServletRegistrationBean bean = new ServletRegistrationBean(myServlet, "/myservlet");return bean;}// 注册Filter@Beanpublic FilterRegistrationBean filterRegistrationBean(){FilterRegistrationBean bean = new FilterRegistrationBean();// 使用框架中的字符过滤器CharacterEncodingFilter filter = new CharacterEncodingFilter();// 指定使用的编码方式filter.setEncoding("UTF-8");// 指定request,response使用encoding的值filter.setForceEncoding(true);// 给filter设置参数bean.setFilter(filter);bean.addUrlPatterns("/*"); // 过滤所有的地址return bean;}
}
②修改application.properties文件, 让自定义的过滤器起作用
默认使用的是系统配置好的

让自己的配置生效
(1)SpringBoot中默认已经配置启用了CharacterEncodingFilter,编码默认ISO-8859-1;
(2)设置enabled=false 作用是关闭系统中配置好的过滤器, 使用自定义的CharacterEncodingFilter;
server.servlet.encoding.enabled=false
第二种方式:直接使用框架中的过滤器,比较简单,推荐使用
注:实际上SpringBoot已经把字符编码的过滤器自动纳入容器管理了,通过源码分析可以发现这个配置与配置文件application.properties中的server.servlet.encoding配置进行了绑定。
package org.springframework.boot.autoconfigure.web.servlet;import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.filter.OrderedCharacterEncodingFilter;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.boot.web.servlet.server.Encoding;
import org.springframework.context.annotation.Bean;
import org.springframework.core.Ordered;
import org.springframework.web.filter.CharacterEncodingFilter;@AutoConfiguration
@EnableConfigurationProperties({ServerProperties.class})
@ConditionalOnWebApplication(type = Type.SERVLET
)
@ConditionalOnClass({CharacterEncodingFilter.class})
@ConditionalOnProperty(prefix = "server.servlet.encoding",value = {"enabled"},matchIfMissing = true
)
public class HttpEncodingAutoConfiguration {private final Encoding properties;public HttpEncodingAutoConfiguration(ServerProperties properties) {this.properties = properties.getServlet().getEncoding();}// 自动装入了容器中去@Bean@ConditionalOnMissingBeanpublic CharacterEncodingFilter characterEncodingFilter() {CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();filter.setEncoding(this.properties.getCharset().name());filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.REQUEST));filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.RESPONSE));return filter;}@Beanpublic LocaleCharsetMappingsCustomizer localeCharsetMappingsCustomizer() {return new LocaleCharsetMappingsCustomizer(this.properties);}static class LocaleCharsetMappingsCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>, Ordered {private final Encoding properties;LocaleCharsetMappingsCustomizer(Encoding properties) {this.properties = properties;}public void customize(ConfigurableServletWebServerFactory factory) {if (this.properties.getMapping() != null) {factory.setLocaleCharsetMappings(this.properties.getMapping());}}public int getOrder() {return 0;}}
}
直接修改application.properties文件进行更改
第一种方式:使用的是自己定义的过滤器,然后让系统的关闭,让自己的生效,比较麻烦;
第二种方式:就是用系统已经配置好的,我们直接修改内部参数的编码方式即可;
#让系统的CharacterEncdoingFilter生效,默认就是开启的,不写也行
server.servlet.encoding.enabled=true
#直接指定使用的编码方式
server.servlet.encoding.charset=utf-8
#直接强制request,response都使用charset属性的值
server.servlet.encoding.force=true
相关文章:
【SpringBoot】| SpringBoot 和 web组件
目录 一:SpringBoot 和 web组件 1. SpringBoot中使用拦截器(重点) 2. SpringBoot中使用Servlet 3. SpringBoot中使用过滤器(重点) 4. 字符集过滤器的应用 一:SpringBoot 和 web组件 1. SpringBoot中使…...
dflow工作流使用1——架构和基本概念
对于容器技术、工作流等概念完全不懂的情况下理解dflow的工作方式会很吃力,这里记录一下个人理解。 dflow涉及的基本概念 工作流的概念很好理解,即某个项目可以分为多个步骤,每个步骤可以实现独立运行,只保留输入输出接口&#x…...
python小游戏课程设计报告,python游戏课程设计报告
大家好,给大家分享一下python2048游戏课程设计报告,很多人还不知道这一点。下面详细解释一下。现在让我们来看看!...
使用Windbg分析从系统应用程序日志中找到的系统自动生成的dump文件去排查问题
目录 1、尝试将Windbg附加到目标进程上进行动态调试,但Windbg并没有捕获到 2、在系统应用程序日志中找到了系统在程序发生异常时自动生成的dump文件 2.1、查看应用程序日志的入口 2.2、在应用程序日志中找到系统自动生成的dump文件 3、使用Windbg静态分析dump文…...
后端技术趋势指南|如何选择自己的技术方向
编程多条路,条条通罗马 后台大佬 后台路线都是面对后台服务器业务,比如web后台服务器,视频后台服务器,搜索后台服务器,游戏后台服务器,直播后台服务器,社交IM后台服务器等等,大部分…...
Delphi XE的原生JSONObject如何判断键值是否存在?
【问题现象】 Delphi XE的原生JSONObject,取出键值的时候如下: //json是传入的参数,里面包括"food_name"等之类的键值,没有food_type键值 procedure XXXXFunciton(json:TJSONObject) var strFoodName,strFoodType:S…...
Go Runtime功能初探
以下内容,是对 运行时 runtime的神奇用法[1] 的学习与记录 目录: 1.获取GOROOT环境变量 2.获取GO的版本号 3.获取本机CPU个数 4.设置最大可同时执行的最大CPU数 5.设置cup profile 记录的速录 6.查看cup profile 下一次堆栈跟踪数据 7.立即执行一次垃圾回收 8.给变量…...
01|Oracle学习(监听程序、管理工具、PL/SQL Developer、本地网络服务介绍)
基础概念 监听程序:运行在Oracle服务器端用于侦听客户端请求的程序。 相当于保安,你来找人,他会拦你,问你找谁。他去帮你叫人过来。 配置监听程序应用场景 Oracle数据库软件安装之后没有监听程序(服务)…...
滴滴数据服务体系建设实践
什么是数据服务化 大数据开发的主要流程分为数据集成、数据开发、数据生产和数据回流四个阶段。数据集成打通了业务系统数据进入大数据环境的通道,通常包含周期性导入离线表、实时采集并清洗导入离线表和实时写入对应数据源三种方式,当前滴滴内部同步中心…...
VBA技术资料MF36:VBA_在Excel中排序
【分享成果,随喜正能量】一个人的气质,并不在容颜和身材,而是所经历过的往事,是内在留下的印迹,令人深沉而安谧。所以,优雅是一种阅历的凝聚;淡然是一段人生的沉淀。时间会让一颗灵魂࿰…...
Shell脚本学习3
文章目录 Shell脚本学习3函数函数定义及使用函数参数获取函数返回值 重定向输入输出重定向 其他Here Document/dev/null 文件Shell文件包含获取当前正在执行脚本的绝对路径按特定字符串截取字符串 Shell脚本学习3 函数 函数定义及使用 函数可以让我们将一个复杂功能划分成若…...
代理模式--静态代理和动态代理
1.代理模式 定义:代理模式就是代替对象具备真实对象的功能,并代替真实对象完成相应的操作并且在不改变真实对象源代码的情况下扩展其功能,在某些情况下,⼀个对象不适合或者不能直接引⽤另⼀个对象,⽽代理对象可以在客户…...
C++容器——list的模拟实现
目录 一.list的基本结构 二. 接下来就是对list类构造函数的设计了: 三.链表数据的增加: 四.接下来就是迭代器的创建了: 四.简单函数的实现: 五.构造与析构 六.拷贝构造和赋值重载 传统写法: 现代写法: 七.迭…...
VUE3 祖孙组件传值调用方法
1.在 Vue 3 中,你可以使用 provide/inject 来实现祖孙组件之间的传值和调用方法。 首先,在祖组件中使用 provide 来提供数据或方法,例如: // 祖组件 import { provide } from vue;export default {setup() {const data Hello;c…...
我的网安之路
机缘 我目前从事网安工作,一转眼我从发布的第一篇文章到现在已经过去了4年了,感慨时间过得很快 曾经我是一名Java开发工程师所以我的第一篇文章是跟开发相关的那个时候还是实习生被安排 一个很难的工作是完成地图实时定位以及根据GPS信息模拟海上追捕,这对刚入职的我来说很难 …...
langchain-ChatGLM源码阅读:webui.py
样式定制 使用gradio设置页面的视觉组件和交互逻辑 import gradio as gr import shutilfrom chains.local_doc_qa import LocalDocQA from configs.model_config import * import nltk import models.shared as shared from models.loader.args import parser from models.load…...
<C++>二、 类和对象
1.面向对象和面向过程 C语言是面向过程的,关注的是过程,分析出求解问题的步骤, 通过函数调用逐步解决问题。 C是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。 2. C类 C…...
【HttpRunnerManager】搭建接口自动化测试平台实战
目录 一、需要准备的知识点 二、我搭建的环境 三、搭建过程 四、访问链接 五、两个问题点 【整整200集】超超超详细的Python接口自动化测试进阶教程,真实模拟企业项目实战!! 一、需要准备的知识点 1. linux: 安装 python3、nginx 安装和…...
【adb】adb常用命令
Android Debug Bridge (adb) Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令可用于执行各种设备操作,例如安装和调试应用。adb 提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它…...
SAP 委外副产品业务
SAP 委外副产品业务 1.订单bom设置数量为负 2.采购收货时,副产品O库存增加,545 O 借:原材料 贷:委外加工-发出材料 3.从O库存调拨回本地库存,542...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
【Ftrace 专栏】Ftrace 参考博文
ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...
