大数据WEB阶段(十六)JavaEE三大 核心技术之监听器Listener

Listener监听器

一、概述

  1. Servlet三大核心技术之一 Servlet、Filter、Listener
  2. Servlet技术规范中定义了八种监听器用来监听web应用开发中对应的事件。
  3. 监听器可以用来监听web应用执行过程中相关的事件 , 来进行相应的处理

二、 开发一个监听器

  1. 写一个类实现监听器接口
  2. 在web.xml文件中配置监听器

三、监听三大作用域创建和销毁的监听器

  1. ServletContextListener

    1. 生命周期 :
      1. 创建:在web应用启动时创建出来 , 之后一直驻留在内存中唯一代表当前web应用 ,
      2. 销毁:直到web应用被移除或 服务器 关闭时随着web应用销毁 , ServletConextListener也跟着被销毁
    2. 作用范围 : 整个web应用内
    3. 主要功能 : 在整个web应用作用范围并且在生命周期中共享数据
    4. 案例:

      写一个类实现监听器接口
      public class MyServletContextListener implements ServletContextListener{
      
          public void contextDestroyed(ServletContextEvent sce) {
              System.out.println("servletContext被销毁"+sce.getServletContext());
      
          }
      
          public void contextInitialized(ServletContextEvent sce) {
              System.out.println("servletContext被创建"+sce.getServletContext());
          }
      
      }
      
      在web.xml文件中注册监听器
      <listener>
          <listener-class>com.tj.listener.MyServletContextListener</listener-class>
      </listener>
      下面两个监听方式的开发方式相同
      
  2. HttpSessionListener

    1. 生命周期:

      1. 创建:第一次调用request.getSession()时创建
      2. 销毁:

        1. 自杀 :调用session.invalidate()
        2. 超时: 发呆时间超过session存活时间(默认30分钟)

          扩展: 修改session销毁时间为1分钟
          
          <session-config>
              <session-timeout>1</session-timeout>
          </session-config>
          
        3. 意外身亡:服务器非正常关闭

          扩展:session钝化 、 活化
              1. 钝化: 在服务器正常关闭时,  仍然在存活期间的session会被序列化后保存在tomcat的work目录下
              2. 活化: 在服务器正常启动时 , 将仍在存活期间的session读取到内存中 。继续使用 
          
    2. 作用范围 : 整个会话
    3. 主要功能: 在整个会话范围内 ,整个会话的生命周期内共享数据
  3. ServletRequestListener
    1. 生命周期:
      1. 创建:请求开始时创建
      2. 销毁:请求结束时销毁
    2. 作用范围: 一次请求响应
    3. 主要功能: 在请求过程中、作用范围内共享数据

四、 监听三大作用域中属性增加和减少的监听器

  1. ServletContextAtrributeListener

    1. 案例

          创建一个类 , 并实现对应的接口
          public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener{
      
          public void attributeAdded(HttpSessionBindingEvent se) {
              System.out.println("session域中添加了属性"+se.getName()+":"+se.getValue());
          }
      
          public void attributeRemoved(HttpSessionBindingEvent se) {
              System.out.println("session域中移除了属性:"+se.getName()+":"+se.getValue());
          }
      
          public void attributeReplaced(HttpSessionBindingEvent se) {
              System.out.println("session域中有属性被替换:"+se.getName()+":"+se.getValue()+"值被替换为:"+se.getSession().getAttribute(se.getName()));
          }
      
      }
      在web.xml文件中注册
      <listener>
          <listener-class>com.tj.listener.MyHttpSessionAttributeListener</listener-class>
      </listener>
      下面两个开发方式相同
      
  2. HttpServletSessionAtrributeListener

  3. ServletRequestAtrributeListener

五、使JavaBean自己感知自己在session作用域中状态变化的监听器

  1. HttpSessionBindingListener
    1. 使JavaBean自己感知自己在session域中被加入或移除的监听器
  2. HttpSessionActivationListener
    1. 使JavaBean自己感知自己在session域被钝化、活化监听器
  3. 注意:
    1. 这两个监听器比较特殊 , 不需要单独创建和在web.xml文件中配置 , 在需要在JavaBean中实现这两个接口就可以了 。
    2. 钝化实际上是序列化的过程 , 要将JavaBean随着session钝化 , 就需要JavaBean实现Serlizeable接口 , 表示这个JavaBean可以被序列化和反序列化 。 JavaBean随着session的活化而被移入内存中 ,虽然JavaBean内的属性值一致 ,但早已不是原先的那个JavaBean了 。
  4. 案例:

    public class Person implements HttpSessionBindingListener,HttpSessionActivationListener,Serializable {
    
        private String name;
        private int age;
    
        public Person() {
        }
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
    
        public void valueBound(HttpSessionBindingEvent event) {
            System.out.println("javabean自己感知到自己被存入session了。。。");
        }
    
        public void valueUnbound(HttpSessionBindingEvent event) {
            System.out.println("javabean自己感知到自己被移除出session了。。。");
        }
    
        public void sessionWillPassivate(HttpSessionEvent se) {
            System.out.println("javabean自己感知到自己随着session被钝化了。。。");
        }
    
        public void sessionDidActivate(HttpSessionEvent se) {
            System.out.println("javabean自己感知到自己随着session被活化了。。。");
        }
    
    }
    

六、监听器的应用

  1. 开发MyServletContextListener 。 在web应用启动ServletContext创建时 , 向ServletContext域中添加app属性 , 值为当前应用的路径 , 在servletContext销毁时删除该属性 , 这样以后需要在JSP页面中写 pageContext.request.getCntextPath {app}就可以了
  2. 代码:

    public class MyServletContextListener implements ServletContextListener{
    
        public void contextDestroyed(ServletContextEvent sce) {
            sce.getServletContext().setAttribute("app", sce.getServletContext().getContextPath());
    
        }
    
        public void contextInitialized(ServletContextEvent sce) {
            sce.getServletContext().removeAttribute("app");
        }
    
    }
        在web.xml文件中注册监听器
        <listener>
            <listener-class>com.tj.listener.MyServletContextListener</listener-class>
        </listener>
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java EE 控制层代码通常由 Servlet、Filter、ListenerJSP 等组成。 以下是一个简单的 Servlet 控制器示例: ```java @WebServlet("/hello") public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); String message = "Hello, " + name + "!"; request.setAttribute("message", message); request.getRequestDispatcher("/hello.jsp").forward(request, response); } } ``` 这个 Servlet 接收一个 GET 请求,从请求参数中获取名字,然后生成一个问候语,并将其设置为请求属性。最后,将请求转发到一个 JSP 页面进行显示。 以下是一个简单的 Filter 控制器示例: ```java @WebFilter("/*") public class EncodingFilter implements Filter { public void init(FilterConfig config) throws ServletException { // 初始化代码 } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); } public void destroy() { // 销毁代码 } } ``` 这个 Filter 是一个编码过滤器,它将请求和响应的字符编码设置为 UTF-8。 以下是一个简单的 Listener 控制器示例: ```java @WebListener public class SessionListener implements HttpSessionListener { public void sessionCreated(HttpSessionEvent se) { // 会话创建时的代码 } public void sessionDestroyed(HttpSessionEvent se) { // 会话销毁时的代码 } } ``` 这个 Listener 监听 HttpSession 的创建和销毁事件,在会话创建时执行一些代码,在会话销毁时执行另一些代码。 最后,以下是一个简单的 JSP 控制器示例: ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>Hello</title> </head> <body> <h1>${message}</h1> </body> </html> ``` 这个 JSP 接收一个名为 message 的请求属性,并将其显示在页面上。 这些示例只是 Java EE 控制层代码的冰山一角,实际上,Java EE 控制层有很多复杂的框架和模式,如 Spring、Struts、MVC 等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值