• 监听器


    今天学习了新的知识 监听器
    监听器就是监听某个对象的的状态变化的组件,是基于观察者模式设计的
    Listener 监听器是 Servlet 中一种比较特殊的类,能帮助监听 web 中的特定事件,如 ServletContext
    HttpSession ServletRequest 的创建和销毁;变量的创建、销毁和修改等;也可以在某些动作前后增 加处理,实现监控。servlet2.5 规范中共有 8 Listener
    监听器的相关概念:
    事件源:被监听的对象  ----- 三个域对象 request  session  servletContext
    监听器:监听事件源对象   事件源对象的状态的变化都会触发监听器
    注册监听器:将监听器与事件源进行绑定
    响应行为:监听器监听到事件源的状态变化时 所涉及的功能代码 ---- 程序员编写代 码
    基础编程
    需要监听 session 的创建和销毁
    监听什么操作使用对应的接口
    while ( w !=- 1 ){
    sb . append ( instr . substring ( 0 , w ));
    sb . append ( newstr );
    instr = instr . substring ( w + oldstr . length ());
    w = instr . indexOf ( oldstr );
    }
    sb . append ( instr );
    return sb . toString (). getBytes ();
    }
    }
    web.xml 中配置监听器
    session 对象的销毁操作
    注解开发方式
    监听器原理
    Listener 监听器就是一个实现特定接口的普通 Java 程序,这个程序专门用于监听一个 java 对象的方法调用 或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
    被监听对象 A 中,关联着 B 对象。事件源 A 类对外提供一个方法,用于设置监听器对象 B A 类的某一实例变量中。在需要监听事件源的方法中,方法体的某一处先构造创建一个Event 对象,将 this B 与相关的动作封装进Event 对象中,然后调用监听器 B 对象的 doXXXX(event) 方法,将事件对象传入方法实参中。
    对应接口
    1 ServletContextListener 完成 Servlet 上下文整体监听
    contextInitialized(ServletContextEvent event) 监听 application 上下文初始化。
    public class MyListener implements HttpSessionListener {
    @Override
    public void sessionCreated ( HttpSessionEvent se ) { //session 对象创建时回调
    的方法
    System . out . println ( " 创建 session, 对应的时间对象为 " + se + ", 对应的事件
    " + se . getSession ());
    }
    @Override
    public void sessionDestroyed ( HttpSessionEvent se ) { //session 对象销毁时回
    调的方法
    System . out . println ( " 销毁 session, 对应的时间对象为 " + se + ", 对应的事件
    " + se . getSession ());
    }
    }
    com.yan.listeners.MyListener
    session . invalidate ();
    @WebListener
    public class MyListener implements HttpSessionListener {
    2 contextDestroyed(ServletContextEvent event) 监听 application 上下文关闭。
    2 ServletContextAttibuteListener 完成 Servlet 上下文内容监听
    attibuteAdded(ServletContettributeEevent event) 监听对象加入 application 的范围时。
    atributeReplaced(ServetContexttributeEvent event) 监听在 application 范围对象取代另一个对象
    atributeRemoved(erleCotettributcEvent event) 监听对象从 application 的范围移除时。
    3 HttpSessionListener 完成 session 整体监听
    sessionCreated(HttpSessionEvent event) 监听 session 初始化。
    sessionDetoyed(HtpSessionEvent event) 监听 session 销毁。
    4 HttpSessionActivationListener 完成 session 激活钝化状态监听
    sessionDidActivate(HtpSessionEvent event) 监听 session 变为有效状态。
    sessionWillPassivae(HttpSessionEvent event) 监听 session 变为无效状态。
    5 HttpSessionAttributeListener 完成 session 内容监听
    attributeAdded(HttpSessionBindingEvent event) 监听对象加入 session
    attributeReplaced(HttpSessionBindingEvent event) 监听 session 中有对象取代另一个对象时
    attributeRemoved(HttpSessionBindingEvent event) 监听对象从 session 中移除时。
    6 HttpSessionBindingListener 完成 session 绑定监听
    valueBound(HttpSessionBindingEvent event) 监听对象加入 session
    valueUnBound(HttpSessionBindingEvent event) 监听对象从 session 中移除。
    7 ServletRequestListener 完成 ServletRequest 监听
    requestInitalized(ServletRequestEvent event) 监听 ServletRequest 已经被初始化
    requestDestroyed(ServletRequestEvent event) 监听 ServletRequest 已经被销毁
    8 ServletRequestAttributeListener 完成 ServletRequest 内容监听
    attributeAdded(ServletRequestAttributeEvent event) 监听对象加入 request
    attributeReplaced(ServletRequestAttributeEvent event) 监听 request 中有对象取代另一个对象
    attributeRemoved(ServletRequestAttributeEvent event) 监听对象从 request 中移除时。
    监听 request
    ServletRequestListener 是用户响应监听器,用于对 Request 请求进行监听,包括创建和销毁
    简单使用 servletRequestListener 来实现 web 浏览量的变化 在servletRequest 对象被建立的时候调用初始化方法,从内存中读取 servletContext 对象的 count 属性, 而后输出历史访问量。 同时在此基础上加一重新设置servletContext 对象的 count 属性的内容,当 servletRequest对象被销毁的时候调用销毁时的方法打印出当前浏览量,这样就简单的实现了 web 浏览的量的累加计数
    public class ListenerTest implements ServletRequestListener {
    @Override
    请求监听
    监听客户端请求,本地机无许登陆
    特殊:绑定监听
    HttpSessionBindingListener 完成 session 绑定监听
    valueBound(HttpSessionBindingEvent event) 监听对象加入 session
    valueUnBound(HttpSessionBindingEvent event) 监听对象从 session 中移除。
    前者为数据绑定。所谓对 session 进行数据绑定,就是调用 session.setAttribute()
    HttpSessionBindingListener 保存进 session 中。
    后者为取消绑定
    valueUnbound 的触发条件是以下三种情况:
    1. 执行 session.invalidate() 时。
    2. session 超时,自动销毁时。
    3. 执行 session.setAttribute(“onlineUserListener”, “ 其他对象 ”);
    session.removeAttribute(“onlineUserListener”); listener session 中删除时。
    因此,只要不将 listener session 中删除,就可以监听到 session 的销毁。)
    public void requestDestroyed ( ServletRequestEvent arg0 ) {
    System . out . println ( "requestDestroyed" + "," + new Date ());
    System . out . println ( " 当前访问次数: " +
    arg0 . getServletContext (). getAttribute ( "count" ));
    }
    @Override
    public void requestInitialized ( ServletRequestEvent arg0 ) {
    System . out . println ( "requestInitialized" + "," + new Date ());
    Object count = arg0 . getServletContext (). getAttribute ( "count" );
    Integer cInteger = 0 ;
    if ( count != null ) {
    cInteger = Integer . valueOf ( count . toString ());
    }
    System . out . println ( " 历史访问次数:: " + count );
    cInteger ++ ;
    arg0 . getServletContext (). setAttribute ( "count" , cInteger );
    }
    }
    public class LoginListener implements ServletRequestListener {
    public void requestDestroyed ( ServletRequestEvent arg0 ) {
    }
    public void requestInitialized ( ServletRequestEvent arg0 ) {
    ServletRequest req = arg0 . getServletRequest ();
    if ( req . getRemoteAddr (). startsWith ( "127" ))
    req . setAttribute ( "isLog" , new Boolean ( true ));
    }
    }
    public class OnlineUserBindingListener implements HttpSessionBindingListener
    {
    总结
    监听器 Listener 就是在 application session request 三个对象创建、销毁或者往其中添加修改删
    除属性时自动执行代码的功能组件
    Listener Servlet 的监听器,可以监听客户端的请求,服务端的操作等
    Listener 实现了 javax.servlet.ServletContextListener 接口的服务器端程序,它也是随 web 应用的
    启动而启动,只初始化一次,随 web 应用的停止而销毁。主要作用是:做一些初始化的内容添加工
    作、设置一些基本的内容、比如一些参数或者是一些固定的对象等
    注解开发
    Servlet3 之前的版本都是在 web.xml 中配置的,而 Servlet3 之后的版本则使用更为便捷的注解方式来配置。此外,不同版本的Servlet 所需的 Java/JDK 版本也不相同, Servlet3 要求 JDK1.6 ,对应 Tomcat7
    @WebServlet 注解定义在 Servlet 的类声明之前,用于定义 Servlet 组件。使用该注解,就无须在
    web.xml 文件中对 Servlet 进行配置
    name(String) 等价于 - name> , 如果没有显式指定,则为类的全限定名
    value(String[]) 该属性等价于 urlPatterm 属性。两个属性不能同时使用
    urlPatterns(String[]) 等价于 标签
    loadOnStartup(int) 指定 Servlet 的加载顺序,等价于 - on - startup> 标签
    initParams(WebInitParam[]) 指定一组 Servlet 初始化参数,等价于 - param> 标签
    asyncSupported(boolean) 声明 Servlet 是否支持异步操作模式,等价于 - suppored> 标签
    description(String) Servlet 的描述信息,等价于 标签
    String username ;
    public OnlineUserBindingListener ( String username ){
    this . username = username ;
    }
    public void valueBound ( HttpSessionBindingEvent event ) {
    HttpSession session = event . getSession ();
    ServletContext application = session . getServletContext ();
    // 把用户名放入在线列表
    List onlineUserList = ( List )
    application . getAttribute ( "onlineUserList" );
    // 第一次使用前,需要初始化
    if ( onlineUserList == null ) {
    onlineUserList = new ArrayList ();
    application . setAttribute ( "onlineUserList" , onlineUserList );
    }
    onlineUserList . add ( this . username );
    }
    public void valueUnbound ( HttpSessionBindingEvent event ) {
    HttpSession session = event . getSession ();
    ServletContext application = session . getServletContext ();
    // 从在线列表中删除用户名
    List onlineUserList = ( List )
    application . getAttribute ( "onlineUserList" );
    onlineUserList . remove ( this . username );
    System . out . println ( this . username + " 退出。 " );
    }
    }
    @WebFilter 注解用于声明过滤器,该注解将会在部署时被容器处理,容器根据具体的属性配置将相应的
    类部署为过滤器。
    filterName(String) 指定过滤器的 name 属性,等价于 - name>
    value(String[]) 该属性等价于 urlPatterns 属性。但是两者不应该同时使用
    urlPattemns(String[]) 指定一组过滤器的 URL 匹配模式。等价于 - patterm> 标签
    servletNames(String[]) 指定过滤器将应用于哪些 Servlet
    initParams(WebInitParam]) 指定一组过滤器初始化参数,等价于 - param> 标签
    asyncSupported(Boolean) 声明过滤器是否支持异步操作模式,等价于 - supported> 标签
    description(String) 该过滤器的描述信息,等价于 标签
    @WebListener 用于声明监听器,还可以用于充当给定 Web 应用上下文中各种 Web 应用事件的监听器的类。可以使用 @WebListener 来标注一个实现 ServletContextListener
    ServletContextAttributeListener ServletRequestListener ServletRequestAttributeListener
    HttpSessionListener HttpSessionAttributeListener 的类。 @WebListener 注释有一个 value 的属
    性,该属性为可选属性,用于描述监听器信息。使用该注释就不需要在 web.xml 文件中配置标签了。
    @WebInitParam 注解等价于 web.xml 文件中的和的子标签该注解通常不单独使用,而是配合
    @WebServlet 或者 @WebFilter 使用。它的作用是为 Servlet 或者过滤器指定初始化参数。
    @MultipartConfig 注解主要是为了从 request 对象中获取 Part 文件对象。一般用于文件上传的 Servlet上。
  • 相关阅读:
    【网络安全】修改Host文件实现域名解析
    Pytorch显示图片
    元宇宙,小荷才露尖尖角
    【ASM】字节码操作 工具类与常用类 LocalVariablesSorter 类 简单介绍与使用
    开放之光——湖北电大搜题助力学习之旅
    六、K8S之StatefulSet
    用ARM进行汇编语言编程(7)HelloWorld和gdb调试Arm程序
    产品-Axure9英文版,A页面内a1状态跳转B页面的b2状态,(条件跳转状态)
    实战:用激活函数、Keras框架解决分类问题
    MySQL搭建主从复制流程及相关问题
  • 原文地址:https://blog.csdn.net/zjh0101/article/details/128087073