【JavaWeb学习笔记】14 - 三大组件其二 Listener Filter

API文档JAVA_EE_api_中英文对照版

Listener

一、监听器Listener

1. Listener监听器它是JavaWeb的三大组件之一。 JavaWeb的三大组件分别是: Servlet程序、Listener监听器、Filter过滤器

2. Listener是JavaEE的规范,就是接口

3.监听器的作用是,监听某种变化(一般就是对象创建/销毁,属性变化),触发对应方法完成相应的任务

4. JavaWeb中的监听器(共八个),目前最常用的是ServletContextListener,后面案例演示.

二、JavaWeb中的监听器

1.ServletContextListener监听器

1.作用:监听ServletCon text创建或销毁(当我们Web应用启动时,就会创建ServletContext),即生命周期监听,应用场景(1 )加载初始化的配置文件;比如spring的配置文件(2)任务调度(配合定时器Timer/TimerTask)

2.相关方法

        void contextInitialized(ServletContextEvent sce)创建Servletcontext时触发void

        contextDestroyed(ServletContextEvent sce)销毁Servletcontext时

/*** 1. 当一个类实现了 ServletContextListener* 2. 该类就是一个监听器* 3. 该类可以监听的事件 由该类实现的监听接口决定 ,比如 实现ServletContextListener*    , 则该类就可以监听 ServletContext对象的创建和销毁, 以此类推* 4. HspServletContextListener 就是一个监听者* 5. 当web应用启动时,就会产生 ServletContextEvent 事件, 会调用监听器的对应事件处理方法*    contextInitialized, 同时会传递 事件对象* 6. 程序员可以通过 ServletContextEvent 事件对象,来获取需要的信息, 然后再进行业务处理* 7. tomcat怎么知道这个监听器存在 ? 因为我们需要在web.xml中配置(Tomcat底层有容器管理这个监听器)*/
public class YhServletContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {ServletContext servletContext = servletContextEvent.getServletContext();System.out.println("YhServletContextListener 监听到" + servletContext + "被创建");}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {ServletContext servletContext = servletContextEvent.getServletContext();System.out.println("YhServletContextListener 监听到" + servletContext + "被销毁");//比如可以对ServletContext对象进行善后工作}
}

2.ServletContextAttributeListener监听器

1.作用:监听ServletContext属性变化

2.相关方法

        void attributeAdded(ServletContextAttributeEvent event)添加属性时调用

        void attributeReplaced(ServletContextAttributeEvent event)替换属性时调用

        void attributeRemoved(ServletContextAttributeEvent event)移除属性时调用

@WebListener()
public class YhServletContextAttributeListener implements ServletContextAttributeListener {public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {System.out.println("HspServletContextAttributeListener 监听到添加属性.."+ servletContextAttributeEvent.getName() + "=" + servletContextAttributeEvent.getValue() );}@Overridepublic void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {System.out.println("HspServletContextAttributeListener 监听到删除属性.."+ servletContextAttributeEvent.getName() + "=" + servletContextAttributeEvent.getValue() );}@Overridepublic void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {System.out.println("HspServletContextAttributeListener 监听到修改属性.."+ servletContextAttributeEvent.getName() + "=" + servletContextAttributeEvent.getValue() );}
}
@WebServlet(name = "HiServlet",urlPatterns = "/hi")
public class HiServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//给servletContext 对象操作属性ServletContext servletContext = request.getServletContext();servletContext.setAttribute("name", "你好!!!!!!!!");servletContext.setAttribute("name", "你好1");servletContext.setAttribute("name", "你好2");servletContext.setAttribute("name", "你好3");servletContext.setAttribute("name", "你好4");servletContext.setAttribute("name", "你好5");servletContext.setAttribute("name", "你好6");servletContext.setAttribute("name", "你好7");servletContext.setAttribute("name", "你好8");servletContext.setAttribute("name", "你好9");servletContext.removeAttribute("name");//获取session对象//FilterHttpSession session = request.getSession();session.setAttribute("age", 100);session.setAttribute("age", 400);session.removeAttribute("age");System.out.println("HiServlet 处理完毕....");}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

3.HttpSessionListener

1.作用:监听Session创建或销毁,即生命周期监听

2.相关方法

        void sessionCreated(HttpSessionEvent se)创建session时 调用void

        sessionDestroyed(HttpSessionEvent se )销毁session时调用

3.可以用于监控用户上线,离线
 

@WebListener()
public class YhHttpSessionListener implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent httpSessionEvent) {HttpSession session = httpSessionEvent.getSession();//当session创建时,我们给它设置一个生命周期 30ssession.setMaxInactiveInterval(30);System.out.println("YhHttpSessionListener 监听到 session创建= " +session.getId());System.out.println("用户id=" + session.getId() + " 上线");}@Overridepublic void sessionDestroyed(HttpSessionEvent httpSessionEvent) {HttpSession session = httpSessionEvent.getSession();System.out.println("YhHttpSessionListener 监听到 session销毁= " +session.getId());System.out.println("用户id=" + session.getId() + " 离线");}
}

默认访问首页 会创建两个session

session可以获得其生命周期并设置

4.HttpSessionAttributeListener监听器

1.作用:监听Session属性的变化

2.相关方法

        void attributeAdded(ServletRequestAttributeEvent srae)添加属性时

        void attributeReplaced(ServletRequestAttributeEvent srae)替换属性时

        void attributeRemoved(ServletRequestAttributeEvent srae)移除属性时

@WebListener
public class YhHttpSessionAttributeListener implements HttpSessionAttributeListener {@Overridepublic void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {//HttpSession session = httpSessionBindingEvent.getSession();System.out.println("HspHttpSessionAttributeListener 监听到session添加属性" +httpSessionBindingEvent.getName() + "=" + httpSessionBindingEvent.getValue());}@Overridepublic void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {HttpSession session = httpSessionBindingEvent.getSession();System.out.println("HspHttpSessionAttributeListener 监听到session删除属性" +httpSessionBindingEvent.getName());}@Overridepublic void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {System.out.println("HspHttpSessionAttributeListener 监听到session修改属性" +httpSessionBindingEvent.getName() + "=" + httpSessionBindingEvent.getValue());}
}

5.ServletRequestListener监听器

1. ServletRequestListener监听器

2.作用:监听Request创建或销毁,即Request生命周期监听

3.相关方法

        void requestInitialized(ServletRequestEvent sre)创建request时

        void requestDestroyed(ServletRequestEvent sre)销毁request时

4.可以用来监控,某个IP,访问我们网站的频率

@WebListener
public class YhRequestListener implements ServletRequestListener {@Overridepublic void requestInitialized(ServletRequestEvent servletRequestEvent) {System.out.println("HspRequestListener 监听到 request对象创建");ServletRequest servletRequest = servletRequestEvent.getServletRequest();System.out.println("记录访问日志....");System.out.println("访问IP= " + servletRequest.getRemoteAddr());System.out.println("访问的资源= " + ((HttpServletRequest)servletRequest).getRequestURL());}@Overridepublic void requestDestroyed(ServletRequestEvent servletRequestEvent) {System.out.println("HspRequestListener 监听到 request对象被销毁");}
}

6.ServletRequestAttributeListener监听器

1.作用:监听Request属性变化

2.相关方法

        void attributeAdded(ServletRequestAttributeEvent srae)添加属性时

        void attributeReplaced(ServletRequestAttributeEvent srae)替换属性时

        void attributeRemoved(ServletRequestAttributeEvent srae)移除属性时

3.使用方法和前面类似

Filter

一、过滤器Filter

1.示意图

2.过滤器介绍

1. Filter过滤器它是JavaWeb的三大组件之工(Servlet程序、Listener监听器、Filter 过滤器)

2. Filter过滤器是JavaEE的规范,是接口

3. Filter过滤器它的作用是:拦截请求,过滤响应。

4.应用场景

        权限检查

        日记操作

        事务管理

二、过滤器的基本原理

三、Filter过滤器的快速入门

需求:在web工程下,有后台管理目录manage,要求该目录下所有资源(html、图片、jsp、Servlet等)用户验证成功登录后才能访问

过滤器工作流程

两个jsp页面 一个表单登录 一个后台管理 一个servlet验证用户登录

创建Filter并在web.xml配置

<!--filter一般写在其它servlet的前面1. 观察我们发现filter 配置和 servlet 非常相似. filter也是被tomcat管理和维护2. url-pattern 就是当请求的url 和 匹配的时候,就会调用该filter3. /manage/* 第一个 / 解析成 http://ip:port/工程路径4. 完整的路径就是 http://ip:port/工程路径/manage/* 当请求的资源url满足该条件时都会调用filter , /manage/admin.jsp--><filter><filter-name>ManageFilter</filter-name><filter-class>com.yinhai.filter.ManageFilter</filter-class></filter><filter-mapping><filter-name>ManageFilter</filter-name><url-pattern>/manage/*</url-pattern></filter-mapping>

Tomcat底层维护这个filter容器 

/**** 1. filter在web项目启动时, 由tomcat 来创建filter实例, 只会创建一个* 2. 会调用filter默认的无参构造器, 同时会调用 init方法, 只会调用一次* 3. 在创建filter实例时,同时会创建一个FilterConfig对象,并通过init方法传入* 4. 通过FilterConfig对象,程序员可以获取该filter的相关配置信息* 5. 当一个http请求和该filter的的url-patter匹配时,就会调用doFilter方法* 6. 在调用doFilter方法时,tomcat会同时创建ServletRequest 和 ServletResponse 和 FilterChain对象* , 并通过doFilter传入.* 7. 如果后面的请求目标资源(jsp,servlet..) 会使用到request,和 response,那么会继续传递* 8. 老师的提醒:到javaweb - ssm - springboot , 有 浏览器和 web服务器(tomcat)参与, 而这两个部分不是我们*    程序员自己写,所以理解起来比 java se要困难!!!*/
public class ManageFilter implements Filter {private int count = 0;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {//当Tomcat 创建 Filter创建,就会调用该方法,进行初始化//回忆我们自己实现tomcat底层机制+servlet程序, 就会了然System.out.println("ManageFilter init被调用...");}@Overridepublic void doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {System.out.println("ManageFilter doFilter() 被调用=" + (++count));//到每次调用该filter时,doFilter就会被调用//如果这里,没有调用继续请求的方法,则就停止//如果继续访问目标资源-> 等价于放行//老师说明:在调用过滤器前,servletRequest对象=request已经被创建并封装//所以:我们这里就可以通过servletRequest获取很多信息, 比如访问url , session//比如访问的参数 ... 就可以做事务管理,数据获取,日志管理等//获取到session//可以继续使用 httpServletRequest 方法.HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;System.out.println("输入密码=" + httpServletRequest.getParameter("password"));HttpSession session = httpServletRequest.getSession();//获取username session对象, 还可以继续使用Object username = session.getAttribute("username");if (username != null) {//filterChain.doFilter(servletRequest, servletResponse)//1. 继续访问目标url上的资源//2. servletRequest 和 servletResponse 对象会传递给目标资源/文件//3. 一定要理解filter传递的两个对象,再后面的servlet/jsp 是同一个对象(指的是在一次http请求)System.out.println("servletRequest=" + servletRequest);System.out.println("日志信息==");System.out.println("访问的用户名=" + username.toString());System.out.println("访问的url=" + httpServletRequest.getRequestURL());System.out.println("访问的IP=" + httpServletRequest.getRemoteAddr());filterChain.doFilter(servletRequest, servletResponse);//相当于放行} else {//说明没有登录过..回到登录页面servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest, servletResponse);}}@Overridepublic void destroy() {//当filter被销毁时,会调用该方法System.out.println("ManageFilter destroy()被调用..");}
}

四、Filter过滤器url-pattern

1、url-pattern : Filter的拦截路径,即浏览器在请求什么位置的资源时,过滤器会进行拦截过滤

2、精确匹配<url-pattern> /a.jsp</ url-pattern>对应的请求地址http:/ /ip[域名]:port/工程路径/a.jsp会拦截

3、目录匹配<url-pattern>/manage/*</url-pattern>对应的请求地址http://ip[域名]:port/工程路径/manage/xx,即web工程manage目录下所有资源会拦截

4、后缀名匹配<url-pattern> *.jsp< /url-pattern> 后缀名可变,比如* .action * .do 等等对应的请求地址http:/ /ip[域名]:port/工程路径/xx.jsp ,后缀名为.jsp请求会拦截

5、Filter过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在

五、Filter过滤器生命周期

1. filter在web项目启动时, 由tomcat 来创建filter实例, 只会创建一个
2. 会调用filter默认的无参构造器, 同时会调用 init方法, 只会调用一次
3. 在创建filter实例时,同时会创建一个FilterConfig对象,并通过init方法传入
4. 通过FilterConfig对象,程序员可以获取该filter的相关配置信息
5. 当一个http请求和该filter的的url-patter匹配时,就会调用doFilter方法
6. 在调用doFilter方法时,tomcat会同时创建ServletRequest 和 ServletResponse 和 FilterChain对象并通过doFilter传入.
7. 如果后面的请求目标资源(jsp,servlet..) 会使用到request,和 response,那么会继续传递
8.到javaweb - ssm - springboot , 有 浏览器和 web服务器(tomcat)参与, 而这两个部分不是我们程序员自己写,所以理解起来比 java se要困难!!!

 

六、FilterConfig

FilterConfig说明

1. FilterConfig是Filter过滤器的配置类

2. Tomcat每次创建Filter的时候,也会创建一一个 FilterConfig对象,这里包含了Filter配置文件的配置信息。

3.FilterConfig对象作用是获取filter过滤器的配置内容

使用web.xml配置或者使用注解配置

注解配置 03-Servlet-注解配置_注解配置servlet-CSDN博客

@WebFilter(filterName = "YhFilterConfig",urlPatterns = "/abc/*",initParams = {
        @WebInitParam(name = "ip",value = "166.66.66.66"),
        @WebInitParam(name = "port",value = "8888")
})

演示设定过滤器的参数以及如何根据参数过滤访问IP 

@WebFilter(filterName = "YhFilterConfig",urlPatterns = "/abc/*",initParams = {@WebInitParam(name = "ip",value = "127.0"),@WebInitParam(name = "port",value = "8888")
})
public class YhFilterConfig implements Filter {private String ip; //从配置获取的ip@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("YhFilterConfig init() 被调用..");//通过filterConfig 获取相关的参数String filterName = filterConfig.getFilterName();ip = filterConfig.getInitParameter("ip");ServletContext servletContext = filterConfig.getServletContext();//可以获取到该filter所有的配置参数名Enumeration<String> initParameterNames =filterConfig.getInitParameterNames();//遍历枚举while (initParameterNames.hasMoreElements()) {System.out.println("名字=" + initParameterNames.nextElement());}System.out.println("filterName= " + filterName);System.out.println("ip= " + ip);System.out.println("servletContext= " + servletContext);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//通过forbidden ip 来进行控制//先获取到访问ipString remoteAddr = servletRequest.getRemoteAddr();//获得访问客户端的IPString localAddr = servletRequest.getLocalAddr();//获得本机IPSystem.out.println(localAddr);System.out.println(remoteAddr);if(remoteAddr.contains(ip)) {System.out.println("封杀该网段..");servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);return; //直接返回}//继续访问目标资源filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {}
}

 

 七、Filter过滤器链

1.案例

注意 过滤器链的顺序和XML书写顺序一样,但是注解没有顺序!

@WebFilter(filterName = "AFilter",urlPatterns = "/admin/*")
public class AFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("AFilter---> 线程id=" +Thread.currentThread().getId());System.out.println("AFilter doFilter 的前置代码...");System.out.println("执行 AFilter doFilter()");filterChain.doFilter(servletRequest, servletResponse);System.out.println("AFilter doFilter 的后置代码...");}@Overridepublic void destroy() {}
}
@WebFilter(filterName = "BFilter",urlPatterns = "/admin/*")
public class BFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("BFilter---> 线程id=" +Thread.currentThread().getId());System.out.println("BFilter doFilter 的前置代码...");System.out.println("执行 BFilter doFilter()");filterChain.doFilter(servletRequest, servletResponse);System.out.println("BFilter doFilter 的后置代码...");}@Overridepublic void destroy() {}
}

2.FilterChain注意事项和细节

1.多个filter和目标资源在一次http请求, 在同一个线程中

2.当一个请求url和filter的 url-pattern 匹配时,才会被执行,如果有多个匹配上,就会顺序执行,形成一个filter调用链

3.多个filter共同执行时,因为是一次http请求, 使用同一个request对象

4.多个filter执行顺序,和web.xmI配置顺序保持一致

5. chain.doFilter(req, resp)方法将执行下一个过滤器的doFilter方法,如果后面没有过滤器,则执行目标资源。

6.注意执行过滤器链时,顺序是(用前面的案例分析) Http请求 -> A过滤器dofilter() -> A过滤器前置代码 -> A过滤器chain.doFilter() -> B过滤器dofilter() -> B过滤器前置代码 -> B过滤器chain.doFilter()  -> 目标文件 -> B过滤器后置代码 -> A过滤器后置代码 -> 返回给浏览器页面/数据

八、Filter作业

需求分析:使用过滤器,完成如下要求.

1)点击发表评论页面topic.jsp,可以在showTopic.jsp显示评论内容

2)如果发表的评论内容,有关键字比如"苹果" "香蕉",就返回topic,并提示有禁用词

3)要求发表评论到showTopic.jsp时,经过过滤器的处理

4)禁用词,配置在过滤器,在启动项目时动态的获取,注意处理中文

过滤器 

@WebFilter(filterName = "TopicFilter",urlPatterns = "/homework/*",initParams = {@WebInitParam(name = "forbiddenword",value = "apple,hello,hi")
})
public class TopicFilter implements Filter {//属性-> 存放禁用词private String[] forbiddenWords = null;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {//获取禁用词String forbiddenword = filterConfig.getInitParameter("forbiddenword");forbiddenWords = forbiddenword.split(",");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//解决从topic.jsp 提交的中文乱码问题servletRequest.setCharacterEncoding("utf-8");//判断评论是不是有禁用词String content = servletRequest.getParameter("content");//循环遍历一把,看看有没有禁用词for (String forbiddenWord : forbiddenWords) {//java基础if (content.contains(forbiddenWord)) {//返回topic.jspservletRequest.setAttribute("errorInfo", "你输入的有禁用词");servletRequest.getRequestDispatcher("/topic.jsp").forward(servletRequest, servletResponse);return;//返回}}//继续到目标filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {}
}

页面

<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head><title>Title</title>
</head>
<body>
<h1>发表对阿凡达电影评论</h1>
过滤词: 苹果, 香蕉 ${errorInfo}
<form method="post" action="<%=request.getContextPath()%>/topic/showTopic.jsp">用户: <input type="text" name="username"><br/>评论: <textarea rows="10" name="content" cols="20"></textarea><br/><input type="submit" value="发表评论">
</form>
</body>
</html>

展示页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>你发表的评论是</h1>
评论内容: <%=request.getParameter("content")%>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/239378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 虚拟机中的内存结构

1 内存结构 1.1 程序计数器 1.1.1 定义 Program Counter Register 程序计数器&#xff08;寄存器&#xff09; 作用&#xff1a;是记住下一条 jvm 指令的执行地址 特点&#xff1a; 是线程私有的&#xff08;每个线程独有自己的一份&#xff09;不会存在内存溢出 1.1.2 作…

基于车轮安装MEMS IMU的航迹推算算法研究

本文由来&#xff1a;前一篇文章“零速更新(ZUPT)辅助INS定位”&#xff0c;并通过开源方案ZUPT-aided-INS进行了算法验证。在验证过程中&#xff0c;意识到在进行多源传感器融合算法中&#xff0c;利用载体自身运动信息进行约束修正非常重要&#xff0c;因为这不需要额外增加传…

前端案例—antdDesign的Select多选框组件加上全选功能

前端案例—antdDesign的Select多选框组件加上全选功能。 实现效果如下&#xff1a; Select 组件里有这个属性&#xff0c;可以利用这个对下拉菜单进行自定义。 const handleChange (e, value) > {setSelectState(e.target.checked)let arr productOptions?productOption…

【开源工程及源码】超级经典开源项目实景三维数字孪生智慧港口

智慧港口可视化平台&#xff0c;旨在实现对港口运营的全面监测、智能管理和优化决策。飞渡科技利用数字化、模拟和仿真的技术&#xff0c;通过互联的传感器和设备&#xff0c;实现实时数据的采集、传输和分析&#xff0c;将港口内外的复杂数据以直观、易懂的方式呈现&#xff0…

Qt配置opencv,cmake编译参考笔记,已成功

Qt版本&#xff1a;Qt5.14.2 opencv&#xff1a;4.5.4&#xff08;不要用4.5.5&#xff01;&#xff01;很坑别问我为什么知道&#xff09; cmake&#xff1a;下的最新版本 前言&#xff1a;为什么非得要用cmake编译呢&#xff1f;跳过cmake不好吗&#xff1f; 之前用的opencv…

服务熔断(Hystrix)

服务雪崩 多个微服务之间调用的时候&#xff0c;假设微服务A调用微服务B和微服务C&#xff0c;微服务B和微服务C又调用其他的微服务&#xff0c;这就是所谓的“扇出”&#xff0c;如果扇出的链路上某个微服务的调用响应时间过长&#xff0c;或者不可用&#xff0c;对微服务A的…

c++打开网页

1.使用ShellExecute 效果图&#xff1a; 相关代码: void Open_url::on_pushButton_clicked() {QString path1 "explorer.exe";QString urlui->lineEdit->text();ShellExecute(NULL, L"open", path1.toStdWString().c_str(), url.toStdWString().c…

Python匹配文件模块的实战技巧

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;文件匹配是许多应用中常见的需求&#xff0c;例如文件管理、数据处理等。本文将深入探讨Python中用于文件匹配的模块&#xff0c;包括glob、fnmatch和os.path等&#xff0c;通过丰富的示例…

Keil5软件仿真 定时器互补通道 波形输出(Logic Analyzer)

步骤一&#xff1a;管脚配置确认。 ①配置定时器的管脚模式为复用推挽输出模式&#xff08;GPIO_MODE_AF_PP&#xff09;&#xff01;&#xff01;&#xff01;&#xff0c;注意&#xff1a;复用开漏模式软件仿真时无波形。 步骤二&#xff1a;编译程序。 ①点击编译按钮。 …

(Mac上)使用Python进行matplotlib 画图时,中文显示不出来

【问题描述】 ①报错确缺失字体&#xff1a; ②使用matplotlib画图&#xff0c;中文字体显示不出来 【问题思考】 在网上搜了好多&#xff0c;关于使用python进行matplotlib画图字体显示不出来的&#xff0c;但是我试用了下&#xff0c;对我来说都没有。有些仅使用于windows系…

小型洗衣机什么牌子好又便宜?内衣裤洗衣机十大排名推荐

作为一个上班族&#xff0c;每天回到家中真的不愿意再动了&#xff0c;市面上也越来越多懒人福利神器&#xff0c;而内衣洗衣机可以称得上是人类最幸福的小家电&#xff0c;它不仅可以释放我们的双手&#xff0c;而且还比我们自己手洗得干净&#xff0c;功能和清洁力都比我们传…

Ubuntu 常用命令之 zip 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 Ubuntu系统下的zip命令是用来压缩文件的。这个命令可以将一个或多个文件或者目录压缩成一个.zip文件&#xff0c;也可以将整个目录树压缩成一个.zip文件。 zip命令的基本格式 zip [选项] [压缩文件名] [要压缩的文件或目录...]z…

选择移动订货系统源码的四大原因

移动订货系统需要选择源码支持的厂家&#xff0c;有以下四个原因&#xff0c;其中第四个是比较重要的&#xff0c;大家点个关注点个赞&#xff0c;我们接着往下看。 1.可自行定制&#xff1a;支持源码的移动订货系统可以根据企业的具体需求进行定制开发&#xff0c;满足企业特定…

电脑完全重装教程——原版系统镜像安装

注意事项 本教程会清除所有个人文件 请谨慎操作 请谨慎操作 请谨慎操作 前言 本教程是以系统安装U盘为介质进行系统重装操作&#xff0c;照着流程操作会清除整个硬盘里的文件&#xff0c;请考虑清楚哦&#xff5e; 有些小伙伴可能随便在百度上找个WinPE作为启动盘就直接…

运维实施工程师计算机基础

目录 一.运维实施工程师需要具备的知识 1.1.运维工程师、实施工程师是啥&#xff1f; 1.2. 运维工程师、实施工程师做些啥&#xff1f; 1.3.运维工程师、实施工程师需要具备啥技能&#xff1f; 二.计算机的组成 2.1.简介 2.1.1.CPU&#xff08;中央处理器&#xff09; 2.…

25.BFD双向转发检查

BFD双向转发检查 链路故障检测工具&#xff0c;结合三层协议使故障检测更加快速 例如两台路由器之间加了一台二层设备 在修改优先级后&#xff0c;默认选择了下面那条优先级高的路由&#xff0c;R1 ping R2的时候是正常能ping通的 但是&#xff0c;当下面的路由出现故障后&a…

Mybatis3系列课程8-带参数查询

简介 上节课内容中讲解了查询全部, 不需要带条件查, 这节我们讲讲 带条件查询 目标 1. 带一个条件查询-基本数据类型 2.带两个条件查询-连个基本数据类型 3.带一个对象类型查询 为了实现目标, 我们要实现 按照主键 查询某个学生信息, 按照姓名和年级编号查询学生信息 按照学生…

解决GD32VF103编译printf无法打印 float

解决GD32VF103编译printf无法打印 float 在GD32VF103编译后&#xff0c;采用printf打印float变量时&#xff0c;总是无法显示&#xff0c;是因为编译时采用用newlib-nano库&#xff0c;但是这个库对printf做了优化&#xff0c;在eclipse的build配置use-newlib-nano的选项取消勾…

【Amazon 实验②】使用Amazon WAF做基础 Web Service 防护之自定义规则

文章目录 1. 自定义规则1.1 介绍 2. 实验步骤2.1 测试2.2 输出 上一篇章介绍了使用Amazon WAF做基础 Web Service 防护中的Web ACLs 配置 & AWS 托管规则的介绍和演示操作 【Amazon 实验①】使用Amazon WAF做基础 Web Service 防护&#xff0c;本篇章将继续介绍关于自定义…

Web 开发与移动应用程序开发 – 哪一种适合您的业务?

目录 Web 开发&#xff1a;释放浏览器的力量 1. 可访问性和跨平台兼容性&#xff1a; 2. 成本效益&#xff1a; 3. 内容交付和搜索引擎优化&#xff1a; 4.即时更新&#xff1a; 持续的网络维护&#xff1a; 移动应用程序开发&#xff1a;针对设备功能定制体验 1.增强用户体验&…