A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-6-21 14:23 编辑

Listner& Filter学习笔记

监听器Listener
  • 三大类:

    • 一类:监听三个域对象的创建和销毁的监听器

      • ServletContextListener:监听ServletContext对象的创建和销毁
        contextDestroyed():是在服务器关闭的时候执行的方法
        contextInitialized():是在服务器启动的时候执行的方法
      • HttpSessionListener:监听HttpSession的创建和销毁的监听器sessionCreated():用来通知已创建会话sessionDestroyed():用来通知会话即将失效
      • ServletRequestListener:监听ServletRequest对象的创建和销毁的监听器reqeustDestroyed():请求即将超出WEB程序的范围requestInitialized():请求即将进入WEB程序的范围

    • 二类:监听三个域对象的属性变更的监听器:(属性添加,移除,替换

      • ServletContextAttributeListener:监听ServletContext对象的属性变更attributeAdded():通知将新属性添加到servlet实例attributeRemoved():---删除---attributeReplaced():---替换---
      • HttpSessionAttributeListener:监听HttpSession中的属性变更attributeAdded():将属性添加到这个会话中的通知attributeRemoved():---删除---attributeReplaced():---替换---
      • ServletRequestAttributeListener:监听ServletRequest对象的属性变更的attributeAdded():将新属性添加到servlet请求中attributeRemoved():---删除---attributeReplaced():---替换---

    • 三类:监听HttpSession中的JavaBean的对象的状态改变的监听器

      • HttpSessionBindingListener:监听HttpSession中的JavaBean的绑定和解除绑定的valueBound():通知对象被绑定到会话并标识valueUnbound():---解除绑定---
      • HttpSessionActivationListener:监听HttpSession中的JavaBean的钝化和活化的sessionDidActivate():通知会话刚刚被激活,活化(反序列化)sessionWillPassivate():会话钝化,序列化到硬盘

  • 就是一个java类,用来监听其他的java的状态的变化
  • 用途:

    • 用来监听其他的对象的变化
    • 主要应用在图像化界面中比较多

      • GUI,Android

  • 监听器的术语

    • 事件源:指的是被监听的对象
    • 监听器:指的是监听的对象
    • 事件源和监听器的绑定,:就是在汽车上安装报警器
    • 事件指的是事件源的改变

  • 必须要记住的方法:ServletContextLisener类

    • contextInitialized()
    • contexDestroyed()
    • 加载配置文件:如spring
    • 定时任务调度:有专门的框架去实现,Timer,TimerTak
    • servletContext 对象的创建和销毁

      • 创建: 服务器启动的时候,为每个WEB应用黄建一个属于该WEB项目的对象ServletContext
      • 销毁: 服务器关闭或者项目从服务器中移除的时候
      • 举个简单的例子:在一些论坛,社区及聊天室当中,删除在线的超时用户就可以利用这个接口来实现

   
[Java] 纯文本查看 复制代码
public class MyServletContextListener implements ServletContextListener{
   
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContext对象被创建了...");
    }
   
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext对象被销毁了...");
    }
   
   }
   配置
   <web-app>
   <listener>
     <listener-class>
      life.listeners.MyServletContextListener
     </listener-class>
   </listener>
   <servlet/>
   <servlet-mapping/>
   </web-app>
  • HttpSession 何时创建和销毁的

    • 创建:服务器端第一次调用getSession();
    • 销毁:

      • 非正常关闭服务器(正常关闭session会序列化)
      • session过期类默认30分钟
      • 手动调用session.invalidate();

  • HttpSession 问题

    • 访问Servlet会不会创建Session:不会
    • 访问JSP会不会创建Session:会
    • 访问html会不会创建Session:不会

  • request对象何时创建和销毁

    • 创建:客户端向服务器发送一次请求,服务器就会创建request对象.
    • 销毁:服务器对这次请求作出响应后就会销毁request对象.

    访问一个Servlet会不会创建request对象:会
    访问一个JSP会不会创建request对象:会
    访问一个HTML会不会创建request对象:会
  • 优化Session:

    • 通过配置<Context>标签配置定时session序列化.
    • 在tomcat/conf/context.xml中配置<Context> :在tomcat中所有的虚拟主机和虚拟路径都会按照这个配置执行.
    • 在tomcat/conf/Catalina/localhost/context.xml配置<Context> :在tomcat中的localhost虚拟主机中的所有虚拟路径按照这个配置执行.
    • 在当前的工程下的META-INF/context.xml配置<Context> :当前这个工程按照配置执行.

过滤器 Filter
  • 利用Cookie 记住用户的用户名和密码
  • Fileter:过滤器的概述

    • 什么是过滤器的Filter:过滤从客户端向服务器,默认过滤的是来自客户端的请求
    • 过滤器的使用:

      • 进行ip的过滤,脏话过滤,自动登录,响应压缩...

  • 使用过滤器:

    • destroy,销毁,当这个filter实例被销毁前进行调用。
    • doFilter,执行过滤器,(ServletRequest,ServletResponse,FilterChain)

      • FilterChain是过滤器中和Servlet不一样的地方,他代表着一个链条,这个链条将多个filter链在了一起。这个链条中的过滤器的过滤顺序是按照在web.xml中配置mapping的顺序来过滤的。而且,当一个过滤器起作用后,必须执行这个filterChain.doFilter方法释放这个过滤器,他才会接着传递到下一个过滤器进行过滤 .

    • init (FilterConfig)

    ​       这个方法是在servlet容器初始化这个filter类实例之后就被调用,其中的FilterConfig参数可获取在web.xml中配置的这个filter的所有的相关信息。
    • 过滤器的配置对象                FilterCofig
      getFilterNmae()                获取过滤器名称 getInitParameter()        获取过滤器的初始化参数 getInitPatameterNames()        获取过滤器所有初始化参数的名称,获取的是枚举的对象---Enumeration,要去遍历 getServletContext()        获取servletContext对象,也可以再在后面调方法,比如: getAttribute() 过滤器链        FilterChain        只要url-pattern能匹配上,filter都会执行,构成过滤器链,里面有多个过滤器
    • 多个过滤器的执行顺序由filter-mapping的配置顺序决定
    • 过去的是123,目标执行结束后,回来后是321,chain.
    • Fileter相关的配置

      • 完全路径匹配                 / 开始, /a/b/c.jsp目录匹配                        / 开始 * 结束 , /a/*  扩展名匹配                不能以 / 开始, 以 * 开始, * . a

    • <serlvet-name>的配置:根据Servlet的名称拦截Servlet
    • <url-pattern>我们需要过滤哪些URL请求</url-mapping>
    • <dispatcher>的配置:

      • REQUEST        默认值RORWARD        转发 INCLUDE        包含 ERROR                错误页面跳转(全局错误页面)

  • 生命周期

    • 服务器启动的时候创建
    • 服务器关闭或者项目移除的时候销毁

[Java] 纯文本查看 复制代码
需要创建一个Filter实现类,继承javax.servlet.Filter接口。且必须实现这个接口的三个方法.
filter和servlet除了filterchain这一点不同之外,servlet还有几个封装的实现类可以使用,如HttpServlet和GenericServlet,而filter却没有它具体的实现类和接口,需要我们自己封装一个类似于HttpFilter的实现类供我们以后使用.
配置:
    <filter>
        <filter-name>过滤器名称</filter-name>
        <filter-class>过滤器完整类名</filter-class>
        <init-param>
            <description>描述信息,可以省略</description>
            <param-name>参数名称</param-name>
            <param-value>参数值</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>过滤器名称</filter-name>
        <url-pattern>URL</url-pattern>
        <dispatcher>[REQUEST|INCLUDE|FORWARD|ERROR]</dispatcher>
    </filter-mapping>

类型
作用
REQUEST用户直接访问页面时,web容器会调用该过滤器
FORWARD目标资源是通过RequestDispatcher的forward方法访问时,过滤器将被调用
INCLUDE目标资源是通过RequestDispatcher的include方法调用时,过滤器将被调用
ERROR目标资源是通过声明式异常处理机制调用时,过滤器被将被调用
ASYNC(Servlet3.0新增加)支持异步处理



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马