JavaWeb三大組件
Servlet,Filter,Listener。
Servlet
Servlet的作用
在Java web b/s架構中,servlet扮演了重要的角色,作為一個中轉處理的容器,他連接了客戶端和服務器端的信息交互和處理。簡單來說,客戶端發送請求,傳遞到servlet容器,而servlet將數據轉換成服務器端可以處理的數據再發送給服務器端,再數據處理之后,再傳遞到servlet容器,servlet再轉譯到客戶端,完成了一次客戶端和服務器端的信息交互。
Servlet是通過Java編寫的,因為他也具備了Java的一些特點,比如跨平台性,可擴展性高,然而他的優點不僅僅是局限於語言方面,因為Servlet的出現,可以使我們將JSP頁面中的一些JAVA代碼移植到Servlet中來,可無疑使前端人員深受喜歡,方便了項目的修改完善,而Servlet的使用也是非常的簡單。
Servlet的生命周期有四個階段,第一個階段,實例化,會調用構造方法,第二個階段是初始化,會調用init()方法,第三個階段是請求處理,調用service方法,第四個階段,服務終止也就是銷毀階段,調用destroy方法。
前台如何將數據傳遞給Servlet?也是非常簡單的,只需表單提交就可以輕松完成,Servlet可以使用request.getParameter來接受,傳遞給前台就可以使用request.setA什么的來賦值。
頁面提交的時候有get和post兩種方式,這倆種方式都會在Servlet中處理,如果是get則會調用doget,post則會dopost,而同時使用,只需要post調用doget方法就可以。
Filter
Filter的作用
filter用於攔截用戶請求,在服務器作出響應前,可以在攔截后修改request和response,這樣實現很多開發者想得到的功能。
filter是一個可以復用的代碼片段,可以用來轉換HTTP請求、響應和頭信息。Filter不像Servlet,它不能產生一個請求或者響應,它只是修改對某一資源的請求,或者修改從某一的響應。
常見用途
處理全站中文亂碼問題
實現自動登錄
過濾敏感詞匯
壓縮網頁
選擇性讓瀏覽器緩存
這幾種功能的實現采用同樣的原理,那就是使用包裝模式或動態代理增強request或response對象的功能。
Filter詳解
http://www.cnblogs.com/vanl/p/5742501.html。
Filter的生命周期
構造器:創建Filter實例時調用,Filter實例服務器一旦啟動就會被創建
init():實例創建后馬上被調用,用來對Filter做一些初始化的操作
doFilter():Filter的主要方法,用來完成過濾器主要功能的方法,每次訪問目標資源時都會調用。
destroy():服務器停止時調用,用來釋放資源。
Filter的執行順序
在使用MVC的時候,ActionFilter提供了一個Order屬性,用戶可以根據這個屬性控制Filter的調用順序,而Web API卻不再支持該屬性。Web API的Filter有自己的一套調用順序規則:
所有Filter根據注冊位置的不同擁有三種作用域:Global、Controller、Action:
通過HttpConfiguration類實例下Filters.Add()方法注冊的Filter(一般在App_Start\WebApiConfig.cs文件中的Register方法中設置)就屬於Global作用域;
通過Controller上打的Attribute進行注冊的Filter就屬於Controller作用域;
通過Action上打的Attribute進行注冊的Filter就屬於Action作用域;
他們遵循了以下規則:
1、在同一作用域下,AuthorizationFilter最先執行,之后執行ActionFilter
2、對於AuthorizationFilter和ActionFilter.OnActionExcuting來說,如果一個請求的生命周期中有多個Filter的話,執行順序都是Global->Controller->Action;
3、對於ActionFilter,OnActionExecuting總是先於OnActionExecuted執行;
4、對於ExceptionFilter和ActionFilter.OnActionExcuted而言執行順序為Action->Controller->Global;
5、對於所有Filter來說,如果阻止了請求:即對Response進行了賦值,則后續的Filter不再執行。
Servlet和filter的區別
Filter:可以理解一個一種特殊Servlet,主要用於對用戶請求進行預處理。也可以對HttpServletResponse進行后處理是一個典型的處理鏈過濾請求,無法向用戶生成響應。
Servlet:主要用來在業務處理之前進行控制url傳來之后,就對其進行處理。處理完成,返回或轉向到某一自己指定的頁面,可以向用戶生成響應。
傳遞性:1、Filter具有傳遞性 。url傳來之后,檢查之后,可保持原來的流程繼續向下執行,被下一個filter, servlet接收處理。
2、Servlet不具有傳遞性 。servlet 處理之后,不會繼續向下傳遞。
處理流程:Filter對用戶請求進行預處理;接着,將請求交給 Servlet進行處理,並生成響應;最后,Filter再對服務器響應進行后處理。
1、servlet 流程是短的,url傳來之后,就對其進行處理,之后返回或轉向到某一自己指定的頁面。它主要用來在 業務處理之前進行控制。
2、filter 流程是線性的,url傳來之后,檢查之后,可保持原來的流程繼續向下執行,被下一個filter, servlet接收等,而servlet 處理之后,不會繼續向下傳遞。filter功能可用來保持流程繼續按照原來的方式進行下去,或者主導流程,而servlet的功能主要用來主導流程。
filter可用來進行字符編碼的過濾,檢測用戶是否登陸的過濾,禁止頁面緩存等。
下面從四個方面介紹他們之間的區別:
1.概念。
2.生命周期。
3.職責。
4.執行過程。
一、概念:
1、servlet:servlet是一種運行服務器端的java應用程序,具有獨立於平台和協議的特性,並且可以動態的生成web頁面,它工作在客戶端請求與服務器響應的中間層。
2、filter:filter是一個可以復用的代碼片段,可以用來轉換HTTP請求、響應和頭信息。Filter不像Servlet,它不能產生一個請求或者響應,它只是修改對某一資源的請求,或者修改從某一的響應。
二、生命周期:
1、servlet:servlet的生命周期始於它被裝入web服務器的內存時,並在web服務器終止或重新裝入servlet時結束。servlet一旦被裝入web服務器,一般不會從web服務器內存中刪除,直至web服務器關閉或重新結束。
(1)、裝入:啟動服務器時加載Servlet的實例;
(2)、初始化:web服務器啟動時或web服務器接收到請求時,或者兩者之間的某個時刻啟動。初始化工作有init()方法負責執行完成;
(3)、調用:從第一次到以后的多次訪問,都是只調用doGet()或doPost()方法;
(4)、銷毀:停止服務器時調用destroy()方法,銷毀實例。
2、filter:(一定要實現javax.servlet包的Filter接口的三個方法init()、doFilter()、destroy(),空實現也行)
(1)、啟動服務器時加載過濾器的實例,並調用init()方法來初始化實例;
(2)、每一次請求時都只調用方法doFilter()進行處理;
(3)、停止服務器時調用destroy()方法,銷毀實例。
三、職責:
1、servlet:
創建並返回一個包含基於客戶請求性質的動態內容的完整的html頁面;
創建可嵌入到現有的html頁面中的一部分html頁面(html片段);
讀取客戶端發來的隱藏數據;
讀取客戶端發來的顯示數據;
與其他服務器資源(包括數據庫和java的應用程序)進行通信;
通過狀態代碼和響應頭向客戶端發送隱藏數據。
2、filter:
filter能夠在一個請求到達servlet之前預處理用戶請求,也可以在離開servlet時處理http響應:
在執行servlet之前,首先執行filter程序,並為之做一些預處理工作;
根據程序需要修改請求和響應;
在servlet被調用之后截獲servlet的執行。
四、執行過程:
servlet:
1、客戶端發出http請求;
2、web服務器將請求轉發到servlet容器;
3、servlet容器解析url並根據web.xml找到相對應的servlet,並將request、response對象傳遞給找到的servlet;
4、servlet根據request就可以知道請求者、請求信息;
5、當servlet處理完業務邏輯后會將信息放入到response並響應到客戶端。
filter:
Jsp和Servlet的區別
jsp就是在html里面寫java代碼,servlet就是在java里面寫html代碼。其實jsp經過容器解釋之后就是servlet。具體不同描述如下:
一、jsp和servlet的不同之處
1.Servlet在Java代碼中通過HttpServletResponse對象動態輸出HTML內容。
2.JSP在靜態HTML內容中嵌入Java代碼,Java代碼被動態執行后生成HTML內。
二、jsp和servlet各自的特點
1.Servlet能夠很好地組織業務邏輯代碼,但是在Java源文件中通過字符串拼接的方式生成動態HTML內容會導致代碼維護困難、可讀性差。
2.JSP雖然規避了Servlet在生成HTML內容方面的劣勢,但是在HTML中混入大量、復雜的業務邏輯同樣也是不可取的。(思考:前后端分離)
Listener
監聽器常用的用途
通常使用Web監聽器做以下的內容:
統計在線人數,利用HttpSessionLisener
加載初始化信息:利用ServletContextListener
統計網站訪問量
實現訪問監控
參考
servlet的作用:https://blog.csdn.net/qq_41142325/article/details/80059798。
filter:https://www.cnblogs.com/liaoyanglong/p/6155719.html。
filter的執行順序:https://www.cnblogs.com/UliiAn/p/5402146.html。
servlet和filter的區別:https://blog.csdn.net/nangeali/article/details/81487172、https://www.cnblogs.com/acmwangpeng/p/5943462.html。
servlet執行過程:https://blog.csdn.net/qq_38537286/article/details/82697055。
Jsp和Servlet的區別:https://zhidao.baidu.com/question/71537713.html。
listener:https://www.cnblogs.com/w-wfy/p/6425357.html。