【回炉重造系列】之简介过滤器Filter初始化以及web.xml配置

理解Filter:初始化、web.xml配置及Mapping规则解析
本文详细介绍了Filter过滤器的工作原理,包括过滤器在容器初始化时的调用,以及如何通过web.xml配置多个过滤器。文中通过实例展示了过滤器的执行顺序与配置顺序的关系,并探讨了过滤器与拦截器的区别。此外,还讲解了web.xml中相关配置元素的加载顺序和Servlet映射规则,以及Mapping的匹配策略。

Filter过滤器:

过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。
这里写图片描述
如图,浏览器发出的请求先递交给第一个filter进行过滤,符合规则则放行,递交给filter链中的下一个过滤器进行过滤。过滤器在链中的顺序与它在web.xml中配置的顺序有关,配置在前的则位于链的前端。当请求通过了链中所有过滤器后就可以访问资源文件了,如果不能通过,则可能在中间某个过滤器中被处理掉。

doFilter()方法中,chain.doFilter()前的一般是对request执行的过滤操作,chain.doFilter后面的代码一般是对response执行的操作。过滤链代码的执行顺序如下:

这里写图片描述

Filter1:

public class FilterTest01 extends OncePerRequestFilter{
   
   

@Override
protected void doFilterInternal(HttpServletRequest httpServletReq,
    HttpServletResponse httpServletResp, FilterChain filterChain)
            throws ServletException, IOException {
    System.out.println("...filter1开始了....doFilterInternal...");
    filterChain.doFilter(httpServletReq,httpServletResp );
    System.out.println("...filter1结束了....doFilterInternal....");    
    }
}

Filter2:

public class FilterTest02 extends OncePerRequestFilter{
   
   

@Override
protected void doFilterInternal(HttpServletRequest httpServletReq,
    HttpServletResponse httpServletResp, FilterChain filterChain)
            throws ServletException, IOException {
    System.out.println("...filter2开始了....doFilterInternal...");
    filterChain.doFilter(httpServletReq,httpServletResp );
    System.out.println("...filter2结束了....doFilterInternal....");    
    }
}

web.xml

   <filter>
     <filter-name>filter01</filter-name>
     <filter-class>com.edu.dcx.filters.FilterTest01</filter-class>
     </filter>
    <filter-mapping>
     <filter-name>filter01</filter-name>
     <url-pattern>/*</url-pattern>
     </filter-mapping>
           <filter>
     <filter-name>filter02</filter-name>
     <filter-class>com.edu.dcx.filters.FilterTest02</filter-class>
  </filter>
  <filter-mapping>
     <filter-name>filter02</filter-name>
     <url-pattern>/*</url-pattern>
     </filter-mapping>

执行结果:

...filter1开始了....doFilterInternal...
...filter2开始了....doFilterInternal...
...filter2结束了....doFilterInternal....
...filter1结束了....doFilterInternal....

如果调换Filter过滤器的定义顺序,

web.xml

 <filter-name>filter02</filter-name>
     <filter-class>com.edu.dcx.filters.FilterTest02</filter-class>
  </filter>
  <filter-mapping>
     <filter-name>filter02</filter-name>
     <url-pattern>/*</url-pattern>
     </filter-mapping>
   <filter>
     <filter-name>filter01</filter-name>
     <filter-class>com.edu.dcx.filters.FilterTest01</filter-class>
   </filter>
  <filter-mapping>
     <filter-name>filter01</filter-name>
     <url-pattern>/*</url-pattern>
     </filter-mapping>

运行结果:

...filter2开始了....doFilterInternal...
...filter1开始了....doFilterInternal...
...filter1结束了....doFilte
在机器人开发中,SDH(Spong Denavit-Hartenberg)模型和 MDH(Modified Denavit-Hartenberg)模型是用于描述机器人连杆和关节之间几何关系的两种参数化方法。它们的核心目标是为机器人运动学建模提供标准化的数学框架,从而便于正向运动学分析、控制和仿真。 ### SDH模型的特点与应用 SDH模型是基于经典的 Denavit-Hartenberg 参数法,最初由 Mark Spong 提出。该方法通过四个参数(连杆长度 $a_i$、连杆扭角 $\alpha_i$、连杆偏移 $d_i$ 和关节角 $\theta_i$)来描述相邻连杆之间的相对位姿。SDH模型主要用于**串联结构(serial structure)机器人**,例如六自由度机械臂等。 然而,SDH模型在处理**树状结构(tree structure)机器人**或**闭环结构(closed loop structure)机器人**时存在一定的局限性[^1]。例如,当机器人具有多个分支或存在闭环约束时,传统的 SDH 参数化方法可能导致建模歧义或无法唯一表示。 ### MDH模型的特点与应用 MDH 模型是对 SDH 方法的扩展和改进。它通常基于由 John J. Craig 提出的参数化方法,引入了额外的参数或变换顺序,使得建模过程更加灵活和统一。MDH 模型可以处理**串联结构、树状结构、闭环结构**,甚至**移动机器人(mobile robots)**的建模问题。 MDH 的参数定义通常采用不同的坐标系变换顺序(例如 ZX 变换),并且在某些实现中会引入第五个参数来进一步增强建模能力[^2]。这种扩展使得 MDH 在现代机器人开发中更为通用,特别是在涉及复杂结构或需要多体动力学分析的场景中。 ### 应用场景对比 - **SDH 的典型应用场景**包括传统工业机械臂的运动学建模,尤其是在教学和基础研究中仍广泛使用。由于其参数化方式较为简单,适合结构清晰的串联机器人。 - **MDH 的典型应用场景**则更广泛,适用于具有复杂拓扑结构的机器人系统,如仿生机器人、多自由度并联机构、移动操作臂等。MDH 的统一建模能力使其在多体动力学仿真软件(如 MATLAB Robotics Toolbox、ADAMS)中得到广泛应用。 ### 示例代码:MDH 参数化建模 以下是一个使用 Python 实现 MDH 参数化建模的基本框架示例: ```python import numpy as np def dh_transform(a, alpha, d, theta): """ 根据 MDH 参数计算齐次变换矩阵 """ return np.array([ [np.cos(theta), -np.sin(theta)*np.cos(alpha), np.sin(theta)*np.sin(alpha), a*np.cos(theta)], [np.sin(theta), np.cos(theta)*np.cos(alpha), -np.cos(theta)*np.sin(alpha), a*np.sin(theta)], [0, np.sin(alpha), np.cos(alpha), d ], [0, 0, 0, 1 ] ]) # 示例:计算某关节的变换矩阵 a = 0.1 alpha = np.pi / 2 d = 0.2 theta = np.pi / 4 T = dh_transform(a, alpha, d, theta) print("MDH变换矩阵:\n", T) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值