Filter 过滤器--基本原理--Filter 过滤器生命周期--过滤器链--注意事项和细节--全部应用实例--综合代码示例

news2024/11/24 1:22:27

目录

Filter 过滤器

Filter 过滤器说明

过滤器介绍

4. 应用场景

Filter 过滤器基本原理

代码示例

login.jsp

LoginCLServlet.java

admin.jsp

ManageFilter.java

xml配置

Filter 过滤器 url-pattern

Filter 过滤器生命周期

● Filter 生命周期图

FilterConfig

● FilterConfig 说明

应用实例

 WyxFilterConfig 

 web.xml

FilterChain 过滤器链

基本原理示意图

应用实例 

 AFilter.java

BFilter.java

hi.jsp

xml

FilterChain 注意事项和细节

6. 小结:

综合代码示例

运行效果图

 topic.jsp

TopicServlet.java

配置过滤器

showTopic.jsp


Filter 过滤器

Filter 过滤器说明

为啥要过滤器-需求示意图

 

 

过滤器介绍

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

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

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

 

4. 应用场景

● 权限检查

● 日记操作

● 事务管理

Filter 过滤器基本原理

代码示例

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

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>管理后台登录</title>
</head>
<body>
<h1>管理后台登录</h1>
<%
    System.out.println("request=" + request);
%>
<form action="<%=request.getContextPath() %>/loginCheckServlet" method="post">
    u:<input type="text" name="username"/> <br/><br/>
    p:<input type="password" name="password"/> <br/><br/>
    <input type="submit" value="用户登录"/></form>
</body>
</html>

LoginCLServlet.java

public class LoginCheckServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取到用户名和密码->DB
        //假设密码是123456, 就可以通过
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("request=" + request);
        if("123456".equals(password)) {

            //合法, 讲用户名,加入session
            request.getSession().setAttribute("username", username);
            //请求转发到admin.jsp
            request.getRequestDispatcher("/manage/admin.jsp")
                    .forward(request,response);
        } else {
            //不合法, 返回登录页面
            request.getRequestDispatcher("/login.jsp")
                    .forward(request,response);

        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

admin.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>后台管理</title>
    <base href="<%=request.getContextPath() %>/manage/"/>
</head>
<body>
<h1>后台管理</h1>
<%
    //验证request对象是和前面的filter是一个对象
    System.out.println("request=" + request);
%>
<a href="#">用户列表</a>||<a href="#">添加用户</a>||<a href="#">删除用户</a>
<hr/>
<img src="shunping.jpg" height="300"/>
</body>
</html>

ManageFilter.java

/**
 * 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,那么会继续传递
 */
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()被调用..");
    }
}

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.filter.ManageFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>ManageFilter</filter-name>
        <url-pattern>/manage/*</url-pattern>
    </filter-mapping>

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 过滤器生命周期

● 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,那么会继续传递

FilterConfig

● FilterConfig 接口

 

● FilterConfig 说明

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

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

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

应用实例

 WyxFilterConfig 

public class WyxFilterConfig implements Filter {

    private String ip; //从配置获取的ip

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("WyxFilterConfig 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();
        if(remoteAddr.contains(ip)) {

            System.out.println("封杀该网段..");
            servletRequest.getRequestDispatcher("/login.jsp").
                    forward(servletRequest,servletResponse);
            return; //直接返回

        }

        //继续访问目标资源
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

 web.xml

    <filter>
        <filter-name>WyxFilterConfig</filter-name>
        <filter-class>com.filter.WyxFilterConfig</filter-class>
        <!--这里就是给该filter配置的参数-根据业务逻辑来设置-->
        <init-param>
            <param-name>ip</param-name>
            <param-value>127.0</param-value>
        </init-param>
        <init-param>
            <param-name>port</param-name>
            <param-value>8888</param-value>
        </init-param>
        <init-param>
            <param-name>email</param-name>
            <param-value>123@qq.com</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>WyxFilterConfig</filter-name>
        <url-pattern>/abc/*</url-pattern>
    </filter-mapping>

FilterChain 过滤器链

一句话: FilterChain: 在处理某些复杂业务时,一个过滤器不够,可以设计多个过滤器共同完成过滤任务,形成过滤器链。

基本原理示意图

应用实例 

需求: 演示过滤器链的使用

 AFilter.java

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() {

    }
}

BFilter.java

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() {

    }
}

hi.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>hi</title>
</head>
<body>
<h1>admin目录下的 hi.jsp</h1>
<h1>后台管理</h1>
<a href="#">用户列表</a>||<a href="#">添加用户</a>||<a href="#">删除用户</a>
<hr/>
</body>
</html>

xml

 <filter>
        <filter-name>AFilter</filter-name>
        <filter-class>com.filter.AFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>AFilter</filter-name>
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>BFilter</filter-name>
        <filter-class>com.filter.BFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>BFilter</filter-name>
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>

FilterChain 注意事项和细节

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

2. 当一个请求 url 和 filter 的 url-pattern 匹配时, 才会被执行, 如果有多个匹配上,就会顺序执行,形成一个 filter 调用链 (底层可以使用一个数据结构搞定)如LinkedHashMap

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

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

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

6. 小结:

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

综合代码示例

● 需求分析: 使用过滤器, 完成如下要求
1) 点击发表评论页面 topic.jsp, 可以在 showTopic.jsp 显示评论内容
2) 如果发表的评论内容,有关键字比如 "苹果" "香蕉", 就返回 topic.jsp, 并提示有禁用词
3) 要求发表评论到 showTopic.jsp 时,经过过滤器的处理
4) 禁用词, 配置在过滤器, 在启动项目时动态的获取, 注意处理中文

运行效果图

 

 

 topic.jsp

<%@ 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>

TopicServlet.java

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() {

    }
}

配置过滤器

<filter>
        <filter-name>TopicFilter</filter-name>
        <filter-class>com.filter.TopicFilter</filter-class>
        <!--配置禁用词-->
        <init-param>
            <param-name>forbiddenword</param-name>
            <param-value>苹果,香蕉</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>TopicFilter</filter-name>
        <url-pattern>/topic/*</url-pattern>
    </filter-mapping>

showTopic.jsp

<%@ 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/449092.html

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

相关文章

RabbitMQ-后台使用

1、首先本地启动rabbitMQ,登录网址 http://localhost:15672/ 默认账号与密码都是gust 2、使用 user:创建用户 virtual-host:创建某个项目单独使用一个单独host和用户 3、命令添加用户与授权 添加用户 rabbitmqctl add_user admin admin 设置permissions rabbitmqctl set_…

Oracle系列之九:一文搞懂Oracle常用函数

Oracle常用系统函数 1. 字符串函数2. 数学函数3. 日期函数4. 聚合函数5. 其他 Oracle是一种关系型数据库管理系统&#xff0c;它提供了许多内置函数&#xff0c;以便用户可以更轻松地处理数据。 1. 字符串函数 &#xff08;1&#xff09;lengthb/length 计算字符串长度 len…

Linux常用命令整理

Linux常用命令整理 1. cat显示2. reboot 重启3. cd切换目录4. ls目录查看5. mkdir创建目录6. rm 删除文件7. mv目录修改8. cp拷贝9. find查找10. touch新建文件11. vi/vim修改文件12. chmod改变权限13. tar -zcvf 打包文件14. tar -xvf 解压文件15. grep文本搜索16. su, sudo17…

数据库学习总结(MySQL)

一.为什么要使用数据库? 在我们平时存储数据的时候,往往采用文件存储即可,所以,为什么要使用数据库呢? 原因在于,文件存储数据有以下缺点: 文件的安全性问题 文件不利于数据查询和管理 文件不利于存储海量数据 文件在程序中控制不方便 为了解决上述问题,我们创造了更适合…

Revit构件显隐:参数和插件控制构件显隐性操作

一、如何通过参数来控制族中不同构件的显隐性? 在这里&#xff0c;将它分享给大家~ 首先&#xff0c;我们在项目中任意绘制一道墙&#xff0c;然后任意布置一个带有门把手的门&#xff0c;如下图&#xff1a; 接着&#xff0c;我们【双击】进入这个门族的编辑界面&#xff0c;…

C++ 互斥锁原理以及实际使用介绍

兄弟姐妹们&#xff0c;我又回来了&#xff0c;今天带来实际开发中都需要使用的互斥锁的内容&#xff0c;主要聊一聊如何使用互斥锁以及都有哪几种方式实现互斥锁。实现互斥&#xff0c;可以有以下几种方式&#xff1a;互斥量&#xff08;Mutex&#xff09;、递归互斥量&#x…

掌握虚拟专用网络配置

目录 一、防火墙的IPSEC VPN 二、DSVPN 一、防火墙的IPSEC VPN 总体拓扑如下&#xff1a;实现PC间的加密通信。 FW1的配置&#xff1a;划分接口配置地址。 定义感兴趣流&#xff1a; 注&#xff1a;什么是感兴趣流&#xff1f;答&#xff1a;感兴趣流是VPN的术语&#xff0…

银行数字化转型导师坚鹏:数字化思维创新与金融业转型升级

数字化思维创新与金融业转型升级 课程背景&#xff1a; 很多金融机构存在以下问题&#xff1a; 金融机构的员工不知道需要具备什么样的数字化思维 不清楚数字化思维对金融机构转型升级的重要影响&#xff1f; 不清楚数字化背景下如何进行金融机构转型升级&#xff1f; …

Linux 块设备 EMMC 驱动介绍

目录: 高质量文章导航-持续更新中 前置:硬件接口 EMMC(Embedded Multi-Media Card)是一种用于存储和传输数据的嵌入式存储器(芯片),通常用于移动设备和嵌入式设备中。Linux内核提供了一个通用的EMMC驱动框架,可以支持各种不同的EMMC设备。 EMMC总线采用了典型的主从…

通过Python的PIL库给图片添加图片水印

文章目录 前言一、素材准备1.原图2.水印图 二、使用PIL库给图片添加图片水印1.引入库2.定义图片路径3.打开原图4.打开水印图片5.计算水印图片大小6.计算原图大小7.调整水印图片大小7.1调整前7.2调整后 8.计算水印图片位置8.1左上8.2左下8.3右上8.4右下8.5中间 9.添加水印10.保存…

Windows11台式机连接Type-C触摸屏显示器

我的设备是GoBiggerR便携触控屏&#xff0c;有1个mini-HDMI和2个USB-C接口。家用的是台式机&#xff0c;玩一些游戏用触控比较方便&#xff0c;于是想把触控屏利用上。 先说结论&#xff0c;我的方案是使用arpara VR DisplayPort 1.4数据线。 arpara 5K VR头显配件3.5米数据线…

U-Boot 初次编译

1.在 Ubuntu 中创建存放 uboot 的目录 &#xff0c;比如我的是/home/hsj/linux/IMX6ULL/uboot,然后在此目录 下新建一个名为“alientek_uboot”的文件夹用于存放 uboot 源码。alientek_uboot 文件夹创建成功以后使用 FileZilla 软件将正点原子提供的 uboot 源码拷贝到此目录中.…

Docker 部署 MySQL 一主多从

服务器规划&#xff1a;使用docker方式创建&#xff0c;主从服务器IP一致&#xff0c;端口号不一致 主服务器&#xff1a;容器名 mysql-master&#xff0c;端口 3306从服务器&#xff1a;容器名 mysql-slave1&#xff0c;端口 3307从服务器&#xff1a;容器名 mysql-slave2&am…

springboot+vue幼儿园管理系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的幼儿园管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌…

删除Android手机自带应用

目录 1、下载手机adb插件 2、进入开发者模式 3、删除应用 4、之后记得关闭手机usb及开发模式 1、下载手机adb插件 Downloads - ADB Shell 之后路径行输入cmd&#xff0c;或者winr&#xff0c;进入该目录&#xff1a; 2、进入开发者模式 设置--系统--关于手机--快速多次点…

YOLOv7+双目实现三维跟踪(python)

YOLOv7双目实现三维跟踪&#xff08;python&#xff09; 1. 目标跟踪2. 测距模块2.1 测距原理2.2 添加测距 3. 细节修改&#xff08;可忽略&#xff09;4. 实验效果 相关链接 1. YOLOV5 双目测距&#xff08;python&#xff09; 2. YOLOV7 双目测距&#xff08;python&#x…

快速发展、持续领跑,软件顶级盛会第二届中国国际软件发展大会成功召开

2023年4月18日&#xff0c;第二届中国国际软件发展大会在北京国家会议中心召开&#xff0c;工业和信息化部党组成员、副部长王江平出席大会并致辞。 王江平副部长表示&#xff0c;党的十八大以来&#xff0c;我国软件产业快速发展&#xff0c;核心技术持续突破&#xff0c;产业…

LiveCharts2 初步认识

文章目录 1 LiveCharts2 是什么&#xff1f;2 LiveCharts2 可以做什么&#xff1f;3 简单使用LiveCharts2 &#xff0c;实现动态曲线图 1 LiveCharts2 是什么&#xff1f; GitHub&#xff1a;https://github.com/beto-rodriguez/LiveCharts2 官网&#xff1a; https://lvchar…

CANoe自带的诊断工程分析

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

基于matlab的长短期神经网络的三维路径跟踪预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的三维路径跟踪预测 MATALB代码 效果图 结果分析 展望 参考论文 背影 路径跟踪是指通过计算机算法&#xff0c;。长短期记忆模型对复杂&#xff0c;非线性运动的目标跟踪&#xff0c;解决目标跟踪困难&a…