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

news2025/2/2 10:54:43

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 {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        ServletContext servletContext = servletContextEvent.getServletContext();
        System.out.println("YhServletContextListener 监听到" + servletContext + "被创建");
    }

    @Override
    public 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() );
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("HspServletContextAttributeListener 监听到删除属性.."
                + servletContextAttributeEvent.getName() + "=" + servletContextAttributeEvent.getValue() );
    }

    @Override
    public 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对象
        //Filter

        HttpSession 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 {
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        HttpSession session = httpSessionEvent.getSession();
        //当session创建时,我们给它设置一个生命周期 30s
        session.setMaxInactiveInterval(30);
        System.out.println("YhHttpSessionListener 监听到 session创建= " +
                session.getId());
        System.out.println("用户id=" + session.getId() + " 上线");
    }

    @Override
    public 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 {
    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
        //HttpSession session = httpSessionBindingEvent.getSession();
        System.out.println("HspHttpSessionAttributeListener 监听到session添加属性" +
                httpSessionBindingEvent.getName() + "=" + httpSessionBindingEvent.getValue());
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
        HttpSession session = httpSessionBindingEvent.getSession();

        System.out.println("HspHttpSessionAttributeListener 监听到session删除属性" +
                httpSessionBindingEvent.getName());
    }

    @Override
    public 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 {
    @Override
    public 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());
    }
    @Override
    public 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 和 匹配的时候,就会调用该filter
        3. /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;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //当Tomcat 创建 Filter创建,就会调用该方法,进行初始化
        //回忆我们自己实现tomcat底层机制+servlet程序, 就会了然
        System.out.println("ManageFilter init被调用...");
    }

    @Override
    public 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);
        }
    }

    @Override
    public 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

    @Override
    public 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);


    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        //通过forbidden ip 来进行控制
        //先获取到访问ip
        String remoteAddr = servletRequest.getRemoteAddr();//获得访问客户端的IP
        String localAddr = servletRequest.getLocalAddr();//获得本机IP
        System.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);
    }

    @Override
    public void destroy() {

    }
}

 

 七、Filter过滤器链

1.案例

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

@WebFilter(filterName = "AFilter",urlPatterns = "/admin/*")
public class AFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public 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 的后置代码...");
    }

    @Override
    public void destroy() {

    }
}

@WebFilter(filterName = "BFilter",urlPatterns = "/admin/*")
public class BFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public 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 的后置代码...");
    }

    @Override
    public 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;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //获取禁用词
        String forbiddenword = filterConfig.getInitParameter("forbiddenword");
        forbiddenWords = forbiddenword.split(",");
    }

    @Override
    public 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.jsp
                servletRequest.setAttribute("errorInfo", "你输入的有禁用词");
                servletRequest.getRequestDispatcher("/topic.jsp")
                        .forward(servletRequest, servletResponse);
                return;//返回
            }
        }

        //继续到目标
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public 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.coloradmin.cn/o/1329069.html

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

相关文章

湖北省工程类助理工程师申报评审通过不是难事

湖北省工程类助理工程师申报评审通过不是难事 想要初级职称/助理工程师工程类&#xff0c;建筑施工、土木工程、市政、路桥、水利水电、机电、园林、测绘等一系列建筑类的初级职称。12月份交资料&#xff0c;春节前可以评审出来。 初级职称申报周期-一个月左右 一般初级职称申…

【容器Docker】Docker学习笔记

1、什么是Docker&#xff1a; Docker 将程序和程序运行所依赖的所有环境都打包到镜像里。“build once, run anywhere”Docker 是容器的一种实现。 Windows 下如何安装Docker: 官方安装教程&#xff1a;Install Docker Desktop on Windows | Docker Docs有两种安装套装&…

配置BGP的基本示例

目录 BGP简介 BGP定义 配置BGP目的 受益 实验 实验拓扑 ​编辑 组网需求 配置思路 配置步骤 配置各接口所属的VLAN 配置各Vlanif的ip地址 配置IBGP连接 配置EBGP 查看BGP对等体的连接状态 配置SwitchA发布路由10.1.0.0/16 配置BGP引入直连路由 BGP简介 BGP定义 …

四、Spring IoC实践和应用(基于注解方式管理 Bean)

本章概要 基于注解方式管理 Bean 实验一&#xff1a; Bean注解标记和扫描 (IoC)实验二&#xff1a; 组件&#xff08;Bean&#xff09;作用域和周期方法注解实验三&#xff1a; Bean属性赋值&#xff1a;引用类型自动装配 (DI)实验四&#xff1a; Bean属性赋值&#xff1a;基本…

01-基于粤嵌GEC6818实现屏幕的显示固定颜色进行自动切换

基于GEC6818实现屏幕颜色的切换 本文使用开发板GEC6818&#xff0c;实现屏幕显示特定颜色并且进行自动切换的功能。 文章目录 基于GEC6818实现屏幕颜色的切换一、 初始化开发板--&#xff08;开发板是新的则可以省略很多步骤&#xff09;1.1 **删除文件和文件夹**1.2 **查看磁盘…

STM32的以太网外设+PHY(LAN8720)使用详解(2):硬件设计

0 工具准备 1.野火 stm32f407霸天虎开发板 2.LAN8720数据手册 3.STM32F4xx中文参考手册1 PHY&#xff08;LAN8720&#xff09;硬件配置 1.1 硬件配置引脚说明 在LAN8720上电或复位时会读取一些特定引脚的电平&#xff0c;根据电平来进行硬件配置。LAN8720的引脚分布如下&…

在MongoDB中使用数组字段和子文档字段进行索引

本文主要介绍在MongoDB使用数组字段和子文档字段进行索引。 目录 MongoDB的高级索引一、索引数组字段二、索引子文档字段 MongoDB的高级索引 MongoDB是一个面向文档的NoSQL数据库&#xff0c;它提供了丰富的索引功能来加快查询性能。除了常规的单字段索引之外&#xff0c;Mong…

深度学习建模从零开始步骤流程

深度学习建模从零开始步骤流程 步骤如下&#xff1a; 环境准备三方库安装建模开发 环境准备 Anaconda安装&#xff1a; Anaconda下载网址&#xff0c;下载win10下的64位版本。 清华镜像站 下载完毕后点击安装&#xff0c;一直点确定或下一步 到上图点击 Just me&#xff…

基于SpringBoot的桃花峪滑雪场租赁系统 JAVA简易版

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 游客服务2.2 雪场管理 三、数据库设计3.1 教练表3.2 教练聘请表3.3 押金规则表3.4 器材表3.5 滑雪场表3.7 售票表3.8 器材损坏表 四、系统展示五、核心代码5.1 查询教练5.2 教练聘请5.3 查询滑雪场5.4 滑雪场预定5.5 新…

黑芝麻智能与亿咖通科技签署战略合作协议,深化协同助力智能驾驶量产落地

12月22日&#xff0c;全球智能汽车计算芯片引领者黑芝麻智能与全球出行科技企业亿咖通科技共同签署战略合作协议&#xff0c;通过深化合作&#xff0c;整合双方研发、产品和技术资源&#xff0c;联手打造领先智能驾驶系统解决方案&#xff0c;合力推进商业拓展和市场应用&#…

左值右值引用,完美转发

1.c98/03&#xff0c;类模板和函数模板只能含固定数量的模板参数&#xff0c;c11的新特性可以创建接受可变参数的函数模板和类模板 //Args是一个模板参数包&#xff0c;args是一个函数形参参数包 //声明一个参数包Args… args,这个参数包可以包括0到任意个模板参数 template&l…

Ignite数据流处理

数据流处理 #1.概述 Ignite提供了一个数据流API&#xff0c;可用于将大量连续的数据流注入Ignite集群&#xff0c;数据流API支持容错和线性扩展&#xff0c;并为注入Ignite的数据提供了至少一次保证&#xff0c;这意味着每个条目至少会被处理一次。 数据通过与缓存关联的数据…

【AI】YOLO学习笔记三-YOLOV5代码解析

YOLOv5是Glenn Jocher等人研发&#xff0c;它是Ultralytics公司的开源项目。YOLOv5根据参数量分为了n、s、m、l、x五种类型&#xff0c;其参数量依次上升&#xff0c;其效果也是越来越好。由于其代码是长期维护的且具有工程化的思维&#xff0c;所以方便应用在实际的项目中&…

【算法】使用二分查找解决算法问题:理解二分法思想,模板讲解与例题实践

文章目录 二分算法思想 / 性质 / 朴素模板二分查找的引入&#xff08;二段性&#xff09;704.二分查找 模板34.在排序数组中查找元素的第一个和最后一个位置 二分查找的前提条件 / 时间复杂度分析 算法题69.x的平方根35.搜索插入位置852.山脉数组的峰顶索引162.寻找峰值153.寻找…

Servlet-Filter 执行顺序测试

Servlet-Filter 执行顺序测试 对于 web.xml 文件注册过滤器这里就不多说了&#xff0c;就是谁声明的早&#xff0c;谁先被调用。因为在上面的过滤器信息最先被扫描到。 模型抽象 为了便于在实践中使用&#xff0c;结合部分底层原理&#xff0c;我们可以对 Filter 链的执行做…

【3D生成与重建】SSDNeRF:单阶段Diffusion NeRF的三维生成和重建

系列文章目录 题目&#xff1a;Single-Stage Diffusion NeRF: A Unified Approach to 3D Generation and Reconstruction 论文&#xff1a;https://arxiv.org/pdf/2304.06714.pdf 任务&#xff1a;无条件3D生成&#xff08;如从噪音中&#xff0c;生成不同的车等&#xff09;、…

PlatEMO UI 界面

&#x1f389; 博主相信&#xff1a; 有足够的积累&#xff0c;并且一直在路上&#xff0c;就有无限的可能&#xff01;&#xff01;&#xff01; &#x1f468;‍&#x1f393;个人主页&#xff1a; 青年有志的博客 &#x1f4af; Github 源码下载&#xff1a;https://github.…

【快速开发】使用SvelteKit

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

数据结构之进阶二叉树(二叉搜索树和AVL树、红黑树的实现)超详细解析,附实操图和搜索二叉树的实现过程图

绪论​ “生命有如铁砧&#xff0c;愈被敲打&#xff0c;愈能发出火花。——伽利略”&#xff1b;本章主要是数据结构 二叉树的进阶知识&#xff0c;若之前没学过二叉树建议看看这篇文章一篇掌握二叉树&#xff0c;本章的知识从浅到深的对搜索二叉树的使用进行了介绍和对其底层…

uniapp H5项目使用ucharts的Echart组件方式创建圆环

问题&#xff1a;没有报错但是图表不出来 【 调试了半天圆环图表没有不出来。是因为没有明示设置宽度与高度】 /* 请根据实际需求修改父元素尺寸&#xff0c;组件自动识别宽高 */ .charts-box { width: 100%; height: 300px; } 最终效果 先导入ucharts到项目 uniapp的项目…