Java24:会话管理 过滤器 监听器
一 会话管理
1.cookie
是一种客户端会话技术,cookie由服务端产生,它是服务器存放在浏览器的一小份数据,浏览器
以后每次访问服务器的时候都会将这小份的数据带到服务器去。
//创建cookie对象
Cookie cookie1=new Cookie("keya","valuea");
Cookie cookie2=new Cookie("keyb","valueb");
//设置cookie的时效性,单位为秒
cookie1.setMaxAge(10);
//设置访问路径
cookie1.setPath("/servlet1");
//把cookie对象返回客户端
resp.addCookie(cookie1);
resp.addCookie(cookie2);
2. session
HttpSession 是一种保留更多信息在服务端的一种技术,服务器会为每个客户端开辟一块内存空 间,即session对象,
客户端在发送请求时,都可以使用自己的session,这样服务端就可以通过session来记录
某个客户端的状态了
服务器在为客户端创建session时,会同时将session对象的id即,JSESSIONID以cookie的
形式放入响应对象
后端在创建完session后,客户端会收到一个特殊的cookie,叫做JSESSIONID
客户端下一次请求时携带JSESSINID,后端收到后,根据JESSINID找到对应的session对象
通过该机制,服务端通过session 就可以存储一些专门针对某个客户端的信息了。
session 也是域对象
//创建session对象
HttpSession session = req.getSession();
//设置session属性
session.setAttribute("name","zhanasan");
//获取sessionid
String id = session.getId();
System.out.println(id);
//判断session是否新建
System.out.println(session.isNew());
3.ServletContext
应用域对象是ServletContext,传递数据范围是本应用之内,可以跨多个会话
创建ServletContext对象
getServletContext()
三大域使用场景:
请求转发时,请求域可以传递数据:请求域内一般存放本次请求业务相关的数据,如查询到的所有部门信息
同一个会话内,不用请求转发,会话域可以传递数据,会话域内一般放本次会话的客户端有关的数据,如当前客户端登录的用户
同一个app内,不同的客户端应用域可以传递数据,应用域内一般放本程序应用有关的数据 ,如Spring框架的IOC容器
4.实例:获取三大域属性 :ServletA 设置三个域的属性,ServletB获取三个域的属性,通过变更访问路径验证三个域的范围
@WebServlet("/servletA") public class ServletA extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 请求域req.setAttribute("request","requestvalue");// 会话域HttpSession session = req.getSession();String id = session.getId();System.out.println("session:"+id);session.setAttribute("session","sessionvalue");//应用域ServletContext servletContext = this.getServletContext();servletContext.setAttribute("application","applicationvalue");//请求转发req.getRequestDispatcher("/servletB").forward(req,resp);} }
@WebServlet("/servletB") public class ServletB extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取请求域对象属性值String requestvalue = (String) req.getAttribute("request");System.out.println("request:"+requestvalue);// 获取会话域属性值HttpSession session = req.getSession();String id = session.getId();System.out.println("session:"+id);String sessionvalue = (String) session.getAttribute("session");System.out.println("session:"+sessionvalue);//应用域ServletContext servletContext = this.getServletContext();servletContext.setAttribute("application:","applicationvalue");String applicationvalue = (String) servletContext.getAttribute("application");System.out.println("application:"+applicationvalue);} }
二:过滤器
1.定义
过滤器 是JAVAEE技术规范之一,作用目标资源的请求进行过滤的一套技术规范,是java web项目中最为实用的技术之一。
2.过滤器位置
3.过滤器原理及实现
》Filter接口定义了过滤器的开发规范,所有的过滤器都要实现该接口
》Filter的工作位置是项目中所有目标资源之前,容器在创建HttpServletRequest和HttpServletResponse对象后,会先调用Filter的doFilter方法
》Filter的doFilter方法可以控制请求是否继续,如果放行,则请求继续,如果拒绝,则请求到此为止,由过滤器本身做出响应
》Filter 不仅可以对请求做出过滤,也可以在目标资源做出响应前,对响应再次进行处理
》过滤器实现过滤需在web.xml 配置过滤资源路径或者通过注解实现(@WebFilter)
》web.xml配置方式:
<filter><filter-name>filter1</filter-name><filter-class>com.cn.filter.Filter1</filter-class> </filter><filter-mapping><filter-name>filter1</filter-name><url-pattern>/*</url-pattern></filter-mapping>
4.过滤器实现访问资源耗时统计
@WebFilter("/*") public class FilterTest implements Filter {private SimpleDateFormat simpleDateFormat= new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//请求父转子,获取请求资源HttpServletRequest httpServletRequest= (HttpServletRequest) servletRequest;HttpServletResponse httpServletResponse= (HttpServletResponse) servletResponse;StringBuffer requestURL = httpServletRequest.getRequestURL();String format = simpleDateFormat.format(new Date());String info="在"+format+"访问资源"+requestURL;System.out.println(info);long t1 = System.currentTimeMillis();//放行过滤器filterChain.doFilter(servletRequest,servletResponse);//统计访问资源耗时long t2 = System.currentTimeMillis();System.out.println(info+"共耗时"+(t2-t1)+"毫秒");} }
@WebServlet("/servlet1") public class MyServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("servlet。。。");resp.getWriter().write("hello");} }
5.过滤器生命周期
阶段 对应方法 执行时机 执行次数
创建对象 构造器 web应用启用 1
初始化方法 void init(FilterConfig filterConfig) 构造完毕 1
过滤请求 void doFilter(三个参数) 每次请求 多次
销毁 defalut void destroy() weby 应用关闭 1
6.过滤器链执行顺序
一个web项目中 ,可以同时定义多个过滤器,多个过滤器对同一个资源过滤时,工作位置有先后,整体形成一个工作链,称之为过滤器链
》过滤器链中的过滤器顺序由filter-mapping顺序决定
》每个过滤器过滤的范围不同,针对同一个资源来说,过滤器链中的过滤器个数可能是不同的
》如果某个Filter是使用ServletName进行匹配规则的配置,那么这个Filter执行的优先级要更低
过滤器执行顺序实现
三个过滤器
public class Filter1 implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("dofilter1 before invoke");filterChain.doFilter(servletRequest,servletResponse);System.out.println("dofilter1 after invoke");} }
public class Filter2 implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("dofilter2 before invoke");filterChain.doFilter(servletRequest,servletResponse);System.out.println("dofilter2 after invoke");} }
public class Filter3 implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("dofilter3 before invoke");filterChain.doFilter(servletRequest,servletResponse);System.out.println("dofilter3 after invoke");} }
访问资源 @WebServlet("/servlet1") public class Servlet1 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("servlet1");resp.getWriter().write("good!");} }
过滤路径配置:(如果使用注解,则按照过滤器类名排序)
<filter><filter-name>filter1</filter-name><filter-class>com.cn.filter.Filter1</filter-class> </filter><filter-mapping><filter-name>filter1</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>filter2</filter-name><filter-class>com.cn.filter.Filter2</filter-class> </filter><filter-mapping><filter-name>filter2</filter-name><url-pattern>/*</url-pattern> </filter-mapping><filter><filter-name>filter3</filter-name><filter-class>com.cn.filter.Filter3</filter-class> </filter><filter-mapping><filter-name>filter3</filter-name><url-pattern>/*</url-pattern></filter-mapping>
7.过滤器实现登录控制 :实现浏览器在不登录的情况下不能直接访问资源:ScheduleController 和loginsucess.html
ScheduleController代码:
@WebServlet("/schedule/*") public class ScheduleController extends BaseController{protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("add");} }
loginsucess.html代码:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title> </head><body> <h1>登录成功!请浏览你的日程吧!</h1></body> </html>
SysUserController 修改后的代码
@WebServlet("/sysuser/*")
public class SysUserController extends BaseController {private SysUserService userservice = new SysUserServiceImpl();protected void login(HttpServletRequest req, HttpServletResponse resp) throws Exception {//1获取请求参数String username = req.getParameter("username");String userPwd = req.getParameter("pwd");//调用服务层处理SysUser sysuer = userservice.login(username);if(null==sysuer){resp.sendRedirect("/loginusernameerror.html");}else if( !userPwd.equals(sysuer.getUserPwd())){resp.sendRedirect("/loginpassworderror.html");}else{ //登录成功后,把用户信息存入session域HttpSession session = req.getSession();session.setAttribute("sysuer",sysuer);resp.sendRedirect("/loginsucess.html");}}}
LoginFilter过滤器代码:
@WebFilter(urlPatterns = {"/schedule/*","/loginsucess.html"}) public class LoginFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest httpservletRequest= (HttpServletRequest) servletRequest;HttpServletResponse httpservletRespone = (HttpServletResponse) servletResponse;HttpSession session = httpservletRequest.getSession();Object sysuer = session.getAttribute("sysuer");if(sysuer==null){//未登录,直接跳转登录界面httpservletRespone.sendRedirect("/login.html");}else{//登录成功,直接放行filterChain.doFilter(servletRequest,servletResponse);}} }
三.监听器
1. 定义:
专门用于对域对象身上发生的事件或状态改变进行监听和相应处理的对象
》监听器时GOF设计模式中,观察者模式的典型案例
》观察者模式:当被观察的对象发生某些改变时,观察者自动采取对应的行动的一种设计模式
》监听器使用的感受类似JS中的事件,被观察的对象发生某些情况时,自动触发代码的执行
》监听器并不监听web项目的所有组件,仅仅是对三大域对象做相关的事件监听
2.监听器分类
application域监听器:ServletContextListener, ServletContextAttributeListener
session域监听器:HttpSessionListener , HttpSessionAttributeListener
rquest域监听器:ServletRequestListener,ServletRequestAttributeListener
3.实例
servlet代码:
@WebServlet("/servlet1") public class Servlet1 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext ServletContext = getServletContext();ServletContext.setAttribute("keya","keyavalue");HttpSession session = req.getSession();session.setAttribute("k1","v1");} }
@WebServlet("/servlet2") public class Servlet2 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext ServletContext = getServletContext();ServletContext.setAttribute("keya","keyaXXXX");HttpSession session = req.getSession();session.setAttribute("k1","v11");} }
@WebServlet("/servlet3") public class Servlet3 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext ServletContext = getServletContext();ServletContext.removeAttribute("keya");HttpSession session = req.getSession();session.removeAttribute("k1");} }
监听器代码:
@WebListener public class MyListener implements ServletContextListener, ServletContextAttributeListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {ServletContext servletContext = sce.getServletContext();System.out.println(sce.hashCode()+"初始化了");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {ServletContext servletContext = sce.getServletContext();System.out.println(sce.hashCode()+"销毁了");}@Overridepublic void attributeAdded(ServletContextAttributeEvent sce) {ServletContext servletContext = sce.getServletContext();String name = sce.getName();Object value = sce.getValue();System.out.println(sce.hashCode()+"新增属性"+name+"值为:"+value);}@Overridepublic void attributeReplaced(ServletContextAttributeEvent sce) {ServletContext servletContext = sce.getServletContext();String name = sce.getName();Object value = sce.getValue();Object newvalue = servletContext.getAttribute(name);System.out.println(sce.hashCode()+"修改属性"+name+"值为:"+value+"新值"+newvalue);}@Overridepublic void attributeRemoved(ServletContextAttributeEvent sce) {ServletContext servletContext = sce.getServletContext();String name = sce.getName();servletContext.removeAttribute(name);System.out.println(sce.hashCode()+"删除属性"+name);} }
四.Ajax
1.简介
Ajax=Asynchronous JavaScript and XML(异步的JavaScript和XML)
Ajax 不是新的编程语言,,而是一种使用现有标准的新方法
Ajax 最大的优点是在不重新加载整个界面的情况下,可以与服务器交换数据并更新部分网页内容
Ajax 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行
XMLHttpRequest只是实现Ajax的一种方式
2.实例:实现用户注册,用户名重复的提示功能,并使用json格式返回给前端
枚举类定义响应码和响应信息:ResultCodeEnum
public enum ResultCodeEnum {SUCESS(200,"sucess"),USERNAME_ERROR(501,"username_error"),PASSWORD_ERROR(502,"password_error"),NOTLOGIN(503,"notlogin"),NAMEDUSED(505,"nameused");private Integer code;private String message;private ResultCodeEnum(Integer code,String message){this.code=code;this.message=message;}public Integer getCode() {return code;}public String getMessage() {return message;} } 响应结果的实体类定义:Result<T>
public class Result<T> {private Integer code;private String message;private T data;public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public T getData() {return data;}public void setData(T data) {this.data = data;}public Result(){}protected static <T> Result<T> build(T data){Result<T> result= new Result<T>();if(data!=null){result.setData(data);}return result;}public static <T> Result<T>build(T body,Integer code,String message){Result<T> result=build(body);result.setCode(code);result.setMessage(message);return result;}public static <T> Result<T> build(T body , ResultCodeEnum resultCodeEnum){Result<T> result=build(body);result.setCode(resultCodeEnum.getCode());result.setMessage(resultCodeEnum.getMessage());return result;}public static <T> Result<T> ok(T data){Result<T> result=build(data);return build(data,ResultCodeEnum.SUCESS);}}
控制器新增方法:SysUserController
WebServlet("/sysuser/*") public class SysUserController extends BaseController {
protected void checkusernameused(HttpServletRequest req, HttpServletResponse resp) throws Exception {String username = req.getParameter("username");SysUser user = userservice.findByName(username);Result result=Result.ok(null);if(user!=null){result=Result.build(null, ResultCodeEnum.NAMEDUSED);}//把对象转换为json格式ObjectMapper objectMapper =new ObjectMapper();String info = objectMapper.writeValueAsString(result);//返回信息,设置格式为jsonresp.setContentType("application/json;charset=utf-8");resp.getWriter().write(info );} }
前端register.html 修改的代码(红色部分为Ajax实现的部分)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>span{font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif;color: red;}</style><script>//校验用户名function checkusername(){var reg=/^[a-zA-Z0-9]{6,10}$/var usernameobj= document.getElementById("user1")var uservalue=usernameobj.valuevar usercheck=reg.test(uservalue)var sp1= document.getElementById("sp1")if(!usercheck){sp1.innerText="用户名不正确"return false}//用户名登录正确,校验是否被占用 //1.创建对象var request= new XMLHttpRequest()//2.设置回调函数request.onreadystatechange=function (){if(request.readyState==4&&request.status==200){var info= JSON.parse(request.responseText)if(info.code==505){sp1.innerText="不可用"}}}// 3.设置访问路径request.open("get","/sysuser/checkusernameused?username="+uservalue)//4.发送访问request.send()sp1.innerText="OK"return true}//校验密码function checkpassword(){var reg=/^\d{6}$/var pwdobj= document.getElementById("pw1")var pwdvalue=pwdobj.valuevar pwdcheck=reg.test(pwdvalue)var sp2= document.getElementById("sp2")if(!pwdcheck){sp2.innerText="密码不正确"return false}sp2.innerText="OK"return true}//校验确认密码function checkconformpassword(){var reg=/^\d{6}$/var pwdobj2= document.getElementById("pw2")var pwdvalue2=pwdobj2.valuevar pwdcheck2=reg.test(pwdvalue2)var sp3= document.getElementById("sp3")if(!pwdcheck2){sp3.innerText="密码格式不正确"return false}//获取密码输入,并和确认密码比较是否相等var pwdobj= document.getElementById("pw1")var pwdvalue=pwdobj.valueif(pwdvalue2!=pwdvalue){sp3.innerText="密码和确认密码不相等"return false}sp3.innerText="OK"return true}//表单提交校验function checkregister(){
var flag1=checkpassword()
var flag2=checkpassword()
var flag3=checkconformpassword()return flag1&&flag2&&flag3}</script>
</head>
<body>
<h1 >登录管理系统</h1><form action="/sysuser/register" method="get" οnsubmit="return checkregister()"><table cellspacing="0px" ><tr><td>用户名:</td><td><input type="text" name="username" id="user1" οnblur="checkusername()"><span id="sp1"></span><br></td></tr><tr><td>密 码:</td><td><input type="password"name="userpwd" id="pw1" οnblur="checkpassword()"><span id="sp2"></span><br></td></tr><tr><td>确认密 码:</td><td><input type="password" id="pw2" οnblur="checkconformpassword()"><span id="sp3"></span><br></td></tr><tr><td colspan="2"><input type="submit" value="注册"><input type="reset" value="重置"><button> <a href="login.html">登录</a> </button></td></tr></table></form>
</body>
</html>
相关文章:
Java24:会话管理 过滤器 监听器
一 会话管理 1.cookie 是一种客户端会话技术,cookie由服务端产生,它是服务器存放在浏览器的一小份数据,浏览器 以后每次访问服务器的时候都会将这小份的数据带到服务器去。 //创建cookie对象 Cookie cookie1new Cookie("…...
web前端电影简介标签:深度解析与创意应用
web前端电影简介标签:深度解析与创意应用 在web前端开发中,电影简介标签的设计与实现是一项既具挑战性又充满创意的任务。这些标签不仅需要准确传达电影的核心信息,还要通过精美的设计和交互效果吸引用户的眼球。本文将从四个方面、五个方面…...
Java面向对象-方法的重写、super
Java面向对象-方法的重写、super 一、方法的重写二、super关键字1、super可以省略2、super不可以省略3、super修饰构造器4、继承条件下构造方法的执行过程 一、方法的重写 1、发生在子类和父类中,当子类对父类提供的方法不满意的时候,要对父类的方法进行…...
解锁ChatGPT:从GPT-2实践入手解密ChatGPT
⭐️我叫忆_恒心,一名喜欢书写博客的研究生👨🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支…...
20240605解决飞凌的OK3588-C的核心板刷机原厂buildroot不能连接ADB的问题
20240605解决飞凌的OK3588-C的核心板刷机原厂buildroot不能连接ADB的问题 2024/6/5 13:53 rootrootrootroot-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508$ ./build.sh --help rootrootrootroot-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508$ ./build.sh lun…...
c++手写的bitset
支持stl bitset 类似的api #include <iostream> #include <vector> #include <climits> #include <utility> #include <stdexcept> #include <iterator>using namespace std;const int W 64;class Bitset { private:vector<unsigned …...
【机器学习系列】深入理解集成学习:从Bagging到Boosting
目录 一、集成方法的一般思想 二、集成方法的基本原理 三、构建集成分类器的方法 常见的有装袋(Bagging)和提升(Boosting)两种方法 方法1 :装袋(Bagging) Bagging原理如下图: …...
用FFMPEG对YUV序列进行编辑的笔记
还是单独开一个吧 每次找挺烦的 播放YUV序列 ffmpeg -f rawvideo -pix_fmt yuv420p -s 3840x2160 -i "Wood.yuv" -vf "scale1280x720" -c:v rawvideo -pix_fmt yuv420p -f sdl "Wood"4K序列转720P ffmpeg -f rawvideo -pix_fmt yuv420p -s 38…...
智能投顾:重塑金融理财市场,引领行业新潮流
一、引言 在数字化浪潮的推动下,金融行业正经历着前所未有的变革。其中,智能投顾作为金融科技的重要分支,以其高效、便捷和个性化的服务,逐渐成为金融理财市场的新宠。本文旨在探讨智能投顾如何引领金融理财新潮流,通过丰富的案例及解决方案,展示其独特的魅力和价值。 二…...
iOS18 新变化提前了解,除了AI还有这些变化
iOS 18即将在不久的将来与广大iPhone用户见面,这次更新被普遍认为是苹果历史上最重要的软件更新之一。据多方报道和泄露的消息,iOS 18将带来一系列全新的功能和改进,包括在人工智能领域的重大突破、全新的设计元素以及增强的性能和安全性。现…...
力扣算法题:多数元素 --多语言实现
无意间看到,力扣存算法代码居然还得升级vip。。。好吧,我自己存吧 golang: func majorityElement(nums []int) int {count : 0condidate : 0for _,val : range nums {if count 0 {condidate valcount 1} else if val condidate {count} …...
[Kubernetes] 容器运行时 Container Runtime
文章目录 1.容器运行时(Container Runtime)2.容器运行时接口3.容器运行时层级4.容器运行时比较5.强隔离容器6.K8S为何难以实现真正的多租户 1.容器运行时(Container Runtime) Container Runtime 是运行于 k8s 集群每个节点中,负责容器的整个生命周期。Docker 就目前…...
10进制与二、八、十六进制的转换
x进制转10进制 1、如八进制数123,通过把每一位数字和8的指数级进行相乘 1 * 8^2 2 * 8^1 3 * 8^01 * 64 2 * 8 3 * 164 16 383 2、十六进制1A3 1 * 16^2 A(即10) * 16^1 3 * 16^01 * 256 10 * 16 3 * 1256 160 3419 3、二进制1010 1 * 2^3 0 * 2…...
日常实习-小米计算机视觉算法岗面经
文章目录 流程问题请你写出项目中用到的模型代码,Resnet50(1)网络退化现象:把网络加深之后,效果反而变差了(2)过拟合现象:训练集表现很棒,测试集很差 把你做的工作里面的…...
(C++)string模拟实现
string底层是一个是字符数组 为了跟库里的string区别,所以定义一个命名空间将类string包含 一、构造 1.构造函数 注意:将char*传给const char*是范围缩小,因此只能1:1构造一个 strlen遇到nullptr解引用会报错,因此…...
类和对象的学习总结(一)
面向对象和面向过程编程初步认识 C语言是面向过程的,关注过程(分析求解问题的步骤) 例如:外卖,关注点菜,接单,送单等 C是面向对象的,关注对象,把一件事拆分成不同的对象&…...
力扣22. 括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。 示例 1:输入:n 3 输出:["((()))","(()())","(())()","()(())","()()(…...
检测窗口是否最大化兼容 Win10/11
检测窗口是否最大化(窗口覆盖或独占全屏)兼容 Win10/11 问题描述 在 Win10/11 上有很多 UWP 进程,检测窗口是否最大化将迎来新的挑战。这些窗口以其不能够使用 Win32 的 IsWindowVisible 获取窗口可见性为特征。此时,必须使用 D…...
【qsort函数】
前言 我们要学习qsort函数并利用冒泡函数仿照qsort函数 首先我们要了解一下qsort(快速排序) 这是函数的的基本参数 void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*)); 简单解释一下 base:指向…...
python类元编程示例-使用类型注解来检查转换属性值的类框架
用三种方式实现使用类型注解来检查转换属性值的类框架 1 __init_subclass__方式 1.1 代码实现 from collections.abc import Callable # <1> from typing import Any, NoReturn, get_type_hints from typing import Dict, Typeclass Field:def __init__(self, name: …...
Python3 笔记:字符串的 zfill() 和 rjust()
1、zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0。 语法:str.zfill(width) width :指定字符串的长度。原字符串右对齐,前面填充0。 str1 2546 str2 2 print(str1.zfill(10)) # 运行结果࿱…...
SpringBoot项目启动提示端口号占用
Windows环境下,SpringBoot项目启动时报端口号占用: *************************** APPLICATION FAILED TO START ***************************Description:Web server failed to start. Port 8080 was already in use.Action:Identify and stop the proc…...
音视频开发23 FFmpeg 音频重采样
代码实现的功能 目的是 将: 一个采样率为 44100,采样通道为 2,格式为 AV_SAMPLE_FMT_DBL 的 in.pcm 数据 转换成 一个采样率为 48000,采样通道为 1,格式为 AV_SAMPLE_FMT_S16 的 out.pcm 数据 1.重采样 1.1 为什么要重…...
windows系统下安装fnm
由于最近做项目要切换多个node版本,查询了一下常用的有nvm和fnm这两种,对比了一下选择了fnm。 下载fnm 有两种方式,目前最新版本是1.37.0: 1.windows下打开powershell,执行以下命令下载fnm winget install Schniz.f…...
【Linux网络】传输层协议 - UDP
文章目录 一、传输层(运输层)运输层的特点复用和分用再谈端口号端口号范围划分认识知名端口号(Well-Know Port Number)两个问题① 一个进程是否可以绑定多个端口号?② 一个端口号是否可以被多个进程绑定? n…...
debugger(四):源代码
〇、前言 终于来到令人激动的源代码 level 了,这里将会有一些很有意思的算法,来实现源代码级别的调试,这将会非常有趣。 一、使用 libelfin 库 我们不可能直接去读取整个 .debug info 段来进行设置,这是没有必要的,…...
基于运动控制卡的圆柱坐标机械臂设计
1 方案简介 介绍一种基于运动控制卡制作一款scara圆柱坐标的机械臂设计方案,该方案控制器用运动控制卡制作一台三轴机械臂,用于自动抓取和放料操作。 2 组成部分 该机械臂的组成部分有研华运动控制卡,触摸屏,三轴圆柱坐标的平面运…...
MongoDBTemplate-基本文档查询
文章目录 流程概述步骤1:创建一个MongoDB的连接步骤2:创建一个查询对象Query步骤3:设置需要查询的字段步骤4:使用查询对象执行查询操作 流程概述 步骤描述步骤1创建一个MongoDB的连接步骤2创建一个查询对象Query步骤3设置需要查询…...
23种设计模式——创建型模式
设计模式 文章目录 设计模式创建型模式单例模式 [1-小明的购物车](https://kamacoder.com/problempage.php?pid1074)工厂模式 [2-积木工厂](https://kamacoder.com/problempage.php?pid1076)抽象⼯⼚模式 [3-家具工厂](https://kamacoder.com/problempage.php?pid1077)建造者…...
idm究竟有哪些优势
IDM(Internet Download Manager)是一款广受好评的下载管理工具,其主要优势包括: 高速下载:IDM支持最大32线程的下载,可以显著提升下载速度1。文件分类下载:IDM可以根据文件后缀进行分类&#x…...
wordpress特色图片/重庆seo关键词优化服务
ELK集群搭建 环境介绍 主机名备注web运行apache web服务node1作为elk节点1,kibana将安装在此节点node2作为elk节点2 所有主机修改主机名,以node1 [rootlocalhost ~]# hostnamectl set-hostname node1所有主机添加主机名解析 [rootlocalhost ~]# vim …...
中国建设工程招投网站/网络黄页推广大全
目录背景生成requirements.txt的办法方案一方案二安装requirements.txt中的类库内容背景 因为项目在windows开发,有1台测试环境,还有正式环境;第一次搭建环境的时候,就需要安装很多依赖;一个一个的安装很麻烦…...
上海网站建设费用/企业网络推广的方法
功能:1、下拉加载2、上拉加载3、显示加载图标4、更新列表数据,隐藏加载图标flutter库:flutter_spinkit: ^3.1.0 加载图标其他:加载列表需要列表,基于上一节的flutter 列表展示细节:1、列表构造器a、绑定列表…...
灵雀云 wordpress/seo网页优化平台
Dubbo分布式服务子系统划分需要把控系统的数量 过多: 可能划分过细,破坏业务子系统的独立性 部署维护工作量大,独立进程占用内存多 过少: 没能很好的解耦 开发维护不好分工 升级维护影响面大 服务子系统划分注意事项&#…...
建设好学校网站/网络推广怎么推广
为了完成推送功能,在了解了业务,研究了需求之后,开始在网上搜索。最值得参考的是 文章:http://blog.csdn.net/zhuqilin0/article/details/6527113 源代码是:https://github.com/Redth/APNS-Sharp 只要将源代码修改少许…...
天水嘉通建设集团网站/如何在手机上开自己的网站
目录一、简介二、常见类型转换1、转换为字符串2、转换为指定类型数组3、转换为日期对象4、转换为集合5、指定泛型6、转换为指定类型三、时间日期1、当前时间2、字符串转Date3、Date转字符串4、获取Date对象的某个部分5、开始和结束时间6、日期时间偏移7、日期时间对象-DateTime…...