1. 程式人生 > 程式設計 >Java web三件套listener、filter、servelt原理解析

Java web三件套listener、filter、servelt原理解析

一、listener、filter、servelt 的執行順序和生命週期

1、啟動順序

想知道 web 三大件的啟動順序其實只需要檢視啟動日誌就好了,啟動順序為:listener、filter、servelt

2、生命週期

檢視結束和執行時候的日誌不難發現:

1> listener 的生命週期:一直從程式啟動到結束,其中:

  • ServletRequestListener (用來監控 session 的建立,銷燬等):每次訪問一個 Request 資源前,都會執行 requestInitialized() 方法,方法訪問完畢,都會執行 requestDestroyed() 方法。
  • ServletRequestListener (用於監控 servlet 上下文 request ):每次呼叫 request.getSession(),都會執行 sessionCreated() 方法,執行 session.invalidate() 方法,都會執行sessionDestroyed() 方法。
  • ServletRequestAttributeListener (用於監控 request 中的 attribute 的操作):每次呼叫 request.setAttribute() 都會執行 attributeAdded() 方法,如果 set 的 key 在 request 裡面存在,就會執行 attributeReplacerd() 方法,呼叫 request.removeAttribute() 方法,都會執行 attributeRemoved() 方法。

2> Filter 生命週期:程式啟動呼叫 Filter 的 init() 法(永遠只調用一次,具體看啟動日誌),程式停止呼叫 Filter 的 destroy() 方法(永遠只調用一次,具體看關閉日誌), doFilter() 方法每次的訪問請求如果符合攔截條件都會呼叫(程式第一次執行,會在 servlet 呼叫 init() 方法以後呼叫,不管第幾次,都在呼叫 doGet(),doPost() 方法之前)。

3> Servlet 生命週期:程式第一次訪問,會呼叫 servlet 的 init() 方法初始化(只執行一次,具體看日誌),每次程式執行都會根據請求呼叫 doGet() 或者 doPost() 方法,程式停止呼叫 destory()方法(具體看結束日誌)。

二、http 協議中 get 請求和 post 請求區別

1、post 更加安全不會作為url的一部分,不會被快取、儲存在伺服器日誌、以及瀏覽器瀏覽記錄中)

2、GET 把引數包含在URL中, POST 通過 request body 傳遞引數;

3、post 傳送的資料更大( 1> http 協議並未規定 get 和 post 的長度限制; 2> get 的最大長度限制是因為瀏覽器和 web 伺服器限制了 URL 的長度; 3> 不同的瀏覽器和 web 伺服器,限制的最大長度不一樣;4> 要支援 IE,則最大長度為 2083byte ,若支援 Chrome ,則最大長度 8182byte);

4、post 能傳送更多的資料型別( get只能傳送 ASCII 字元);

5、get 比 post 快;(其一 post 請求包含了很多請求頭,也就是說 post 需要在請求的 body 部分包含資料;其二 post 在真正接收資料之前會先將請求頭髮送給伺服器進行確認,然後才真正傳送資料(三次握手);其三 get 會將資料快取起來,而 post 不會;其四 post 不能進行管道化傳輸);

5、post 用於修改和寫入資料, get 一般用於搜尋排序和篩選之類的操作(淘寶,支付寶的搜尋查詢都是 get 提交),目的是資源的獲取,讀取資料;

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。