01. Filter
a. Filter 是一个接口,需要写一个类实现这个接口
> 接口: javax.servlet 下的 Filter;
> 在 doFilter中实现过滤,并将符合条件的请求放行:
>> filterChain.doFilter(servletRequest,servletResponse);
b. 拦截路径配置
1. 注解方式
@WebFilter("/*")
2. web.xml配置
c. 最简易过滤器下的异常及处理
> 新建一个 Filter实现类,重载 Filter
> 启动服务时发现异常
> 异常点识别
> 注释掉默认的 super 调用
d. 过滤器的生命周期
> 一个过滤器,在实现接口时,有三个接口需要实现;
> init: 在服务启动后会被自动加载,执行一次;一般用于资源的加载;
> destroy: 在服务正常关闭销毁时,会自动执行一次;一般用于资源的释放;
> doFilter: 过滤处理,可以执行多次;基于配置的拦截路径,有业务请求时,都会执行;
e. 过滤器的执行流程
f. 过滤器配置详解
1. 拦截路径的配置
a. 具体资源路径的拦截: /index.jsp >> 只有访问 index.jsp期间资源时,过滤器才会被执行;
b. 目录拦截: /user/* 访问/user下的所有资源时,过滤器都会被执行;
c. 后缀名拦截: *.jsp 访问所有后缀名为 .jsp 的资源时,过滤器都会被拦截;
d. 拦截所有资源: /* 访问所有资源时,过滤器都会被执行;
2. 拦截方式配置: 资源被访问的方式
> 注解配置:
* 设置 DispatcherType 属性;
a. REQUEST: 默认值;浏览器直接请求资源;
b. FORWARD: 转发访问资源;
c. INCLUDE: 包含访问资源;
d. ERROR: 错误跳转资源;
f. ASYNC: 异步访问资源;
* web.xml配置
需要配置 <dispatcher> DispatcherType五种选择 </dispatcher> 标签即可;
g: 过滤器链( 多个过滤器)
> 执行顺序: 过滤器1执行 > 过滤器2执行 > 资源执行 > 过滤器2执行 > 过滤器1执行
> 多个过滤器执行先后问题
* 注解配置方式: 按照类名的字符串比较规则比较,值小的先执行;
* web.xml 配置: <filter-mapping> 谁定义在上边,谁先执行;
2.代理
1 public static void main(String[] args) { 2 //01.创建真实对象 3 ASUS asus = new ASUS(); 4 //02.创建代理对象 5 SalePC proxyInstance = (SalePC) Proxy.newProxyInstance(// 6 asus.getClass().getClassLoader(),// 7 asus.getClass().getInterfaces(),// 8 //代理对象调用的所有方法都会调用这个方法 9 new InvocationHandler() { 10 @Override 11 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 12 //识别方法 13 if("Sale".equalsIgnoreCase(method.getName())){ 14 //参数增强 15 Double p = (Double) args[0]; 16 p = p*0.8; 17 System.out.println("方法体增强:专车接你..."); 18 //传递的是处理后的参数,不再是原参数 19 String invoke = (String) method.invoke(asus, p); 20 System.out.println("方法体增强:专车送货..."); 21 //增强返回 22 invoke = "结果增强: "+ invoke+"_赠送鼠标键盘及鼠标垫"; 23 return invoke; 24 }else{ 25 Object invoke = method.invoke(asus, args); 26 return invoke; 27 } 28 } 29 }); 30 //03.执行 31 proxyInstance.Show(); 32 String sale = proxyInstance.Sale(8000); 33 System.out.println(sale); 34 35 }
3. 监听Listener
a. 概念: web的三大组件之一
* 事件监听机制
* 事件:一个事情;
* 事件源:事件发生的地方;
* 监听器: 一个对象
* 注册监听: 将事件、事件源、监听器绑定在一起;当事件源上发生某个事件后,执行监听器代码;
b. ServletContextListener: 监听ServletContext对象的创建与销毁
* void contextDestroyed(ServletContextEvent sce): ServletContext 对象被销毁前调用本方法;
* void contextInitalized(ServletContextEvent sce): ServletContext 对象创建后会调用该方法;
c. 在 contextInitalized 函数中,主要用来加载全局资源,服务一启动就将被加载;
d. 新建监听类实现接口监听,
f. 参数配置:
监听配置(web.xml):
注解方式:
直接配置: @WebListener
初始化资源配置: 代码中可通过 String s = context.getInitParameter("initFile"); 读取到 param-value中的值;