11:filter&listener
1 ## 今日内容 2 1. Filter:过滤器 3 2. Listener:监听器 4 5 6 7 8 # Filter:过滤器 9 1. 概念: 10 * 生活中的过滤器:净水器,空气净化器,土匪、 11 * web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。 12 * 过滤器的作用: 13 * 一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤... 14 15 2. 快速入门: 16 1. 步骤: 17 1. 定义一个类,实现接口Filter 18 2. 复写方法 19 3. 配置拦截路径 20 1. web.xml 21 2. 注解 22 2. 代码: 23 @WebFilter("/*")//访问所有资源之前,都会执行该过滤器 24 public class FilterDemo1 implements Filter { 25 @Override 26 public void init(FilterConfig filterConfig) throws ServletException { 27 28 } 29 30 @Override 31 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 32 System.out.println("filterDemo1被执行了...."); 33 34 35 //放行 36 filterChain.doFilter(servletRequest,servletResponse); 37 38 } 39 40 @Override 41 public void destroy() { 42 43 } 44 } 45 46 47 3. 过滤器细节: 48 1. web.xml配置 49 <filter> 50 <filter-name>demo1</filter-name> 51 <filter-class>cn.itcast.web.filter.FilterDemo1</filter-class> 52 </filter> 53 <filter-mapping> 54 <filter-name>demo1</filter-name> 55 <!-- 拦截路径 --> 56 <url-pattern>/*</url-pattern> 57 </filter-mapping> 58 2. 过滤器执行流程 59 1. 执行过滤器 60 2. 执行放行后的资源 61 3. 回来执行过滤器放行代码下边的代码 62 3. 过滤器生命周期方法 63 1. init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源 64 2. doFilter:每一次请求被拦截资源时,会执行。执行多次 65 3. destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源 66 4. 过滤器配置详解 67 * 拦截路径配置: 68 1. 具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行 69 2. 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行 70 3. 后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行 71 4. 拦截所有资源:/* 访问所有资源时,过滤器都会被执行 72 * 拦截方式配置:资源被访问的方式 73 * 注解配置: 74 * 设置dispatcherTypes属性 75 1. REQUEST:默认值。浏览器直接请求资源 76 2. FORWARD:转发访问资源 77 3. INCLUDE:包含访问资源 78 4. ERROR:错误跳转资源 79 5. ASYNC:异步访问资源 80 * web.xml配置 81 * 设置<dispatcher></dispatcher>标签即可 82 83 5. 过滤器链(配置多个过滤器) 84 * 执行顺序:如果有两个过滤器:过滤器1和过滤器2 85 1. 过滤器1 86 2. 过滤器2 87 3. 资源执行 88 4. 过滤器2 89 5. 过滤器1 90 91 * 过滤器先后顺序问题: 92 1. 注解配置:按照类名的字符串比较规则比较,值小的先执行 93 * 如: AFilter 和 BFilter,AFilter就先执行了。 94 2. web.xml配置: <filter-mapping>谁定义在上边,谁先执行 95 4. 案例: 96 1. 案例1_登录验证 97 * 需求: 98 1. 访问day17_case案例的资源。验证其是否登录 99 2. 如果登录了,则直接放行。 100 3. 如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录"。 101 102 103 104 2. 案例2_敏感词汇过滤 105 * 需求: 106 1. 对day17_case案例录入的数据进行敏感词汇过滤 107 2. 敏感词汇参考《敏感词汇.txt》 108 3. 如果是敏感词汇,替换为 *** 109 110 * 分析: 111 1. 对request对象进行增强。增强获取参数相关方法 112 2. 放行。传递代理对象 113 114 115 * 增强对象的功能: 116 * 设计模式:一些通用的解决固定问题的方式 117 1. 装饰模式 118 2. 代理模式 119 * 概念: 120 1. 真实对象:被代理的对象 121 2. 代理对象: 122 3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的 123 * 实现方式: 124 1. 静态代理:有一个类文件描述代理模式 125 2. 动态代理:在内存中形成代理类 126 * 实现步骤: 127 1. 代理对象和真实对象实现相同的接口 128 2. 代理对象 = Proxy.newProxyInstance(); 129 3. 使用代理对象调用方法。 130 4. 增强方法 131 132 * 增强方式: 133 1. 增强参数列表 134 2. 增强返回值类型 135 3. 增强方法体执行逻辑 136 137 138 ## Listener:监听器 139 * 概念:web的三大组件之一。 140 * 事件监听机制 141 * 事件 :一件事情 142 * 事件源 :事件发生的地方 143 * 监听器 :一个对象 144 * 注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码 145 146 147 * ServletContextListener:监听ServletContext对象的创建和销毁 148 * 方法: 149 * void contextDestroyed(ServletContextEvent sce) :ServletContext对象被销毁之前会调用该方法 150 * void contextInitialized(ServletContextEvent sce) :ServletContext对象创建后会调用该方法 151 * 步骤: 152 1. 定义一个类,实现ServletContextListener接口 153 2. 复写方法 154 3. 配置 155 1. web.xml 156 <listener> 157 <listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class> 158 </listener> 159 160 * 指定初始化参数<context-param> 161 2. 注解: 162 * @WebListener