JavaWeb三大組件之 監聽器 -- Listener入門

前言:

JavaWeb中的監聽器與 Java 圖形化界面中的監聽器類似,比如我們在點擊一個按鈕後,想對應的顯示一些內容,這時候就需要有個事件監聽器監聽這個按鈕,一旦這個按鈕被點擊,就觸發相應的時間。
如果上面的解釋不夠清晰(深知自身的表達不足),來看一個生活中的例子:
現在有個神偷準備去盜一把,但是警察叔叔早就開始監視他了,一旦神偷將夜明珠偷到,警察叔叔立馬逮捕(就等你小子落網啦)。
在這個案例中:
事件源: 小偷。- - 被監聽的對象
事件:偷東西。 - - 什麼時候 action
監聽器:警察叔叔。 - - 監聽者
監聽器中的方法: 抓捕。

監聽器的實現:

1、它是一個接口,具體內容由我們自己實現
2、它需要進行註冊(告訴警察叔叔有小偷)。
3、監聽器中的方法會在特殊事件發生時進行調用。

JavaWeb中的監聽器:

事件源: 三大域(需要監聽的對象)

ServletContext:

監聽者:
服務器啓動關閉時會啓動。-- 一般用於初始化。
生命週期監聽:ServletContextListener,它有兩個方法,一個在出生時調動,在死亡時調用。

屬性監聽:ServletContextAttributeListener,它有三個方法,一個在添加屬性時調用,一個在替換屬性時調用,最後一個在移除屬性時調用。

HttpSession:

監聽者:
啓動關閉 Session 時會啓動。
生命週期監聽:HttpSessionListener,它有兩個方法,一個在出生時調動,在死亡時調用。

屬性監聽:HttpSessionAttributeListener,它有三個方法,一個在添加屬性時調用,一個在替換屬性時調用,最後一個在移除屬性時調用。

ServletRequest:

監聽者:
啓動關閉Request是會啓動。(使用較頻繁)
生命週期監聽:ServletRequestListener,它有兩個方法,一個在出生時調動,在死亡時調用。

屬性監聽:ServletRequestAttributeListener,它有三個方法,一個在添加屬性時調用,一個在替換屬性時調用,最後一個在移除屬性時調用。

JavaWeb 中編寫監聽器:

​ 寫一個監聽器類: 要求必須去實現某個監聽器接口

​ 註冊: 通過註冊的方式或者 配置 web.xml 文件進行註冊

案例一:生命週期監聽:ServletContextListener:

AListener.java - - 監聽 ServletContext:

package rj.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/**
 *  ServletContext 生命週期監聽
 *  可以在這個監聽器中放一些在 tomcat 啓動時就要完成的代碼。
 *
 * */


// 通過註解的方式進行註冊(只需要將監聽器的 name 放入即可)
@WebListener("AListener")
public class AListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        // 服務器啓動時就會調用,這個比較常用
        System.out.println("哇,我來啦!");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        // 服務器關閉時進行調用
        System.out.println("不好,我要掛了!");
    }
}

index.jsp 進行測試:

<%--
  Created by IntelliJ IDEA.
  User: Acer
  Date: 2020/5/31
  Time: 15:58
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>

        <form action="Demo04/AServlet" method="post">
          <input type="text" name="username">
            <input type="submit" value="登錄">
        </form>

  </body>
</html>

效果圖:

在這裏插入圖片描述
關於 Session和Request 的監聽器使用都是類似的,在此不再多加贅述,有興趣的小夥伴可以自行測試。

案例二: 屬性監聽:ServletContextAttributeListener

AttributeListener.java – 對屬性的操作進行監聽

package rj.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;

/**
 *  屬性監聽,有三個方法需要實現
 *
 *
 * */

// 註解方式進行註冊
@WebListener("AttributeListener")
public class AttributeListener implements ServletContextAttributeListener {

    // 增加屬性
    @Override
    public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {

        System.out.println("您向 Application 中添加了"+servletContextAttributeEvent.getName() + ",值爲:"+servletContextAttributeEvent.getValue());
        // 獲取監聽的對象(小偷)
        System.out.println(servletContextAttributeEvent.getServletContext());

    }

    // 移除屬性
    @Override
    public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {

    }

    // 替換屬性
    @Override
    public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {

    }
}

index.jsp – 添加屬性進行測試

<%--
  Created by IntelliJ IDEA.
  User: Acer
  Date: 2020/5/31
  Time: 15:58
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>


        <%
            application.setAttribute("xxx","XXX");
        %>

  </body>
</html>

效果圖:
在這裏插入圖片描述
其他的移除和替代都是類似的,在此只介紹方法,具體的實現可以自己進行測試。加油!
代碼還是要自己敲的,嘻嘻。

後記:

監聽器這一部分的知識可以當做瞭解,聽大佬說在實際開發中用的不是太多,所以先了解了一些基礎的知識,之後遇到相關的問題再進行深究,奧利給!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章