1. 程式人生 > >javaweb中的三大元件和八大監聽器

javaweb中的三大元件和八大監聽器

一、三大元件

   JavaWeb三大元件指的是:Servlet、Filter、Listener,這三個元件在JavaWeb開發中分別提供不同的功能,然而很多人可能只用過其中一個或者兩個(Servlet、Filter,比如我),很難接觸到第三個元件,因此對原始JavaWeb開發還不夠熟悉,在這種情況下進行框架學習,這種做法是並不可取,框架是大牛們對原始JavaWeb進行封裝的結果,沒有原始JavaWeb開發基礎是很難真正學會框架的。這篇部落格就是通過簡單的介紹JavaWeb的三大元件來熟悉原始JavaWeb開發。

1、Servlet  Servlet是用來處理客戶端請求的動態資源,也就是當我們在瀏覽器中鍵入一個地址回車跳轉後,請求就會被髮送到對應的Servlet上進行處理。

Servlet的任務有:

接收請求資料:我們都知道客戶端請求會被封裝成HttpServletRequest物件,裡面包含了請求頭、引數等各種資訊。 處理請求:通常我們會在service、doPost或者doGet方法進行接收引數,並且呼叫業務層(service)的方法來處理請求。 完成響應:處理完請求後,我們一般會轉發(forward)或者重定向(redirect)到某個頁面,轉發是HttpServletRequest中的方法,重定向是HttpServletResponse中的方法,兩者是有很大區別的。 Servlet的建立:Servlet可以在第一次接收請求時被建立,也可以在在伺服器啟動時就被建立,這需要在web.xml的< servlet>中新增一條配置資訊 < load-on-startup>5< /load-on-startup>,當值為0或者大於0時,表示容器在應用啟動時就載入這個servlet,當是一個負數時或者沒有指定時,則指示容器在該servlet被請求時才載入。  Servlet的生命週期方法:

servlet的初始化方法,只在建立servlet例項時候呼叫一次,Servlet是單例的,整個伺服器就只建立一個同類型Servlet

servlet的處理請求方法,在servle被請求時,會被馬上呼叫,每處理一次請求,就會被呼叫一次。ServletRequest類為請求類,ServletResponse類為響應類

servlet銷燬之前執行的方法,只執行一次,用於釋放servlet佔有的資源,通常Servlet是沒什麼可要釋放的,所以該方法一般都是空的

2、Filter  filter與servlet在很多的方面極其相似,但是也有不同,例如filter和servlet一樣都又三個生命週期方法,同時他們在web.xml中的配置檔案也是差不多的、 但是servlet主要負責處理請求,而filter主要負責攔截請求,和放行。  filter四種攔截方式

REQUEST:直接訪問目標資源時執行過濾器。包括:在位址列中直接訪問、表單提交、超連結、重定向,只要在位址列中可以看到目標資源的路徑,就是REQUEST; FORWARD:轉發訪問執行過濾器。包括RequestDispatcher#forward()方法、< jsp:forward>標籤都是轉發訪問; INCLUDE:包含訪問執行過濾器。包括RequestDispatcher#include()方法、< jsp:include>標籤都是包含訪問; ERROR:當目標資源在web.xml中配置為< error-page>中時,並且真的出現了異常,轉發到目標資源時,會執行過濾器。 執行filter的順序  如果有多個過濾器都匹配該請求,順序決定於web.xml filter-mapping的順序,在前面的先執行,後面的後執行  3、Listener  Listener就是監聽器,我們在JavaSE開發或者Android開發時,經常會給按鈕加監聽器,當點選這個按鈕就會觸發監聽事件,呼叫onClick方法,本質是方法回撥。在JavaWeb的Listener也是這麼個原理,但是它監聽的內容不同,它可以監聽Application、Session、Request物件,當這些物件發生變化就會呼叫對應的監聽方法。  應用域監聽:  Ø ServletContext(監聽Application)

¨ 生命週期監聽:ServletContextListener,它有兩個方法,一個在出生時呼叫,一個在死亡時呼叫;

¨ 屬性監聽:ServletContextAttributeListener,它有三個方法,一個在新增屬性時呼叫,一個在替換屬性時呼叫,最後一個是在移除屬性時呼叫。

 HttpSession(監聽Session)

¨ 生命週期監聽:HttpSessionListener,它有兩個方法,一個在出生時呼叫,一個在死亡時呼叫;

屬性監聽:HttpSessioniAttributeListener,它有三個方法,一個在新增屬性時呼叫,一個在替換屬性時呼叫,最後一個是在移除屬性時呼叫。

感知Session監聽:  1:HttpSessionBindingListener監聽  ⑴在需要監聽的實體類實現HttpSessionBindingListener介面  ⑵重寫valueBound()方法,這方法是在當該實體類被放到Session中時,觸發該方法  ⑶重寫valueUnbound()方法,這方法是在當該實體類從Session中被移除時,觸發該方法  2:HttpSessionActivationListener監聽  ⑴在需要監聽的實體類實現HttpSessionActivationListener介面  ⑵重寫sessionWillPassivate()方法,這方法是在當該實體類被序列化時,觸發該方法  ⑶重寫sessionDidActivate()方法,這方法是在當該實體類被反序列化時,觸發該方法

二、八大監聽器

Servlet監聽器的作用是監聽Web容器的有效期事件,可以監聽由於Web應用中狀態改變而引起的Servlet容器產生的相應事件,然後接受並處理這些事件。其中提供的LIstener介面有這些:

(1)ServletContextListener;        

Servlet的上下文監聽,它主要實現監聽ServletContext的建立和刪除。該介面提供了兩種方法

                  1.contextInitialized(ServletContextEvent event);   通知正在收聽的物件,應用程式已經被載入和初始化。

                  2.contextDestroyed(ServletCotextEvent event);   通知正在收聽的物件,應用程式已經被載出,即關閉。

(2)ServletAttributeListener;    

  主要實現監聽ServletContext屬性的增加,刪除和修改。該介面提供了一下3個方法

                1.attributeAdded(ServletContextAttributeEvent event);   

當有物件加入Application的範圍時,通知正在收聽的物件

                2.attributeReplaced(ServletContextAttributeEvent event);

當在application的範圍有物件取代另一個物件的時,通知正在收聽的物件

                3.attributeRemoved(ServletContextAttributeEvent event); 

  當有物件從application的範圍移除時,通知正在收聽的物件

(3)HttpSessionListener;          

  HTTP會話監聽,該介面實現監聽HTTP會話建立、銷燬。該介面提供了一下兩種方法

                   1.sessionCreated(HttpSessionEvent event);       

通知正在收聽的物件,session已經被載入及初始化

                   2. sessionDestoryed(HttpSessionEvent event)l        

  通知正在收聽的物件,session已經被載出(HttpSessionEvent類的主要方法是getSession(),可以使用該方法回傳一個session物件)

(4)HttpSessionActivationListener;         

 該介面實現監聽HTTP會話active和passivate。 該介面提供了一下3個方法 

                   1.attributeAdded(HttpSessionBindingEvent event);       

  當有物件加入session的範圍時,通知正在收聽的物件

                   2.attributeReplaced(HttpSessionBindingEvent event);    

   當在session的範圍有物件取代另一個物件時,通知正在收聽的物件。

                   3.attributeRemoved(HttpSessionBindingEvent event);          

  當有物件從session的範圍有物件取代另一個物件時,通知正在收聽的物件 其中HttpSessionBindingEvent類主要有三個方法:getName()、getSession()和getValue()

(5)HttpBindingListener;                      

  介面實現監聽HTTP會話中物件的繫結資訊。它是唯一不需要在web.xml中設定Listener的。該介面提供了以下2個方法

                  1.valueBound(HttpSessionBindingEvent event);                      

當有物件加入session的範圍時會被自動呼叫

                  2.valueUnBound(HttpSessionBindingEvent event);                    

  當有物件從session的範圍內移除時會被自動呼叫

(6)HttpSessionAttributeListener;             

  該介面實現監聽HTTP會話中屬性的設定請求。該介面提供了以下兩個方法。

                 1.sessionDidActivate(HttpSessionEvent event);          

  通知正在收聽的物件,它的session已經變為有效狀態。

                 2.sessionWillPassivate(HttpSessionEvent event);          

  通知正在收聽的物件,它的session已經變為無效狀態

(7)ServletRequestListener;                   

  該介面提供了以下兩個方法。

                   1.requestInitalized(ServletRequestEvent event)             

通知正在收聽的物件,ServletRequest已經被載入及初始化

                   2.requestDestroyed(ServletRequestEvent event)         

  通知正在收聽的物件,ServletRequest已經被載出,即關閉 (8)ServletRequestAttributeListener               

  該介面提供了一下三種方法

                    1.attributeAdded(ServletRequestAttributeEvent event);     

   當有物件加入request的範圍時,通知正在收聽的物件

                    2.attributeReplaced(ServletRequestAttributeEvent event);        

當在request的範圍內有物件取代兩一個物件時,通知正在收聽的物件

                   3.attributeRemoved(ServletRequestAttributeEvent event);    

  當有物件從request的範圍移除時,通知正在收聽的物件

---------------------  轉自:https://blog.csdn.net/wyz0516071128/article/details/81591892