[轉]Tomcat 學習總結(1) --Servlet技術
原文:https://www.cnblogs.com/2019wxw/p/10799519.html
————————————————————————————————————————————————————
Tomcat 學習總結(1) --Servlet技術
在Web應用中,Servlet是一門重要的技術,Servlet是利用Java類編寫的服務端程式,與平臺架構,協議無關。
JSP的實質就是Servlet,因為所有的JSP頁面傳回服務端時要轉為Servlet進行編譯執行。
JSP編寫HTML頁面直觀且易除錯,所以JSP逐步取代了Servlet在開發頁面中的作用。
1,Servlet 是什麼?#
Servlet就是一種實現了Servlet介面的類,它是由web容器負責建立並呼叫,它可以被看做是一個位於客戶端和服務端的中間層,負責接收和響應使用者的請求。並把處理結果返回到客戶端顯示,是執行在服務端一段程式。
專業理解:
Servlet是一個Java編寫的程式,此程式是基於Http協議的,在伺服器端執行的(如tomcat),是按照Servlet規範編寫的一個Java類。
在BS架構中,早期的Web伺服器只能處理靜態資源的請求,也就是無法根據請求進行計算後再生成相應的HTML內容。為了補充Web伺服器的這個缺陷,於是增強伺服器功能的CGI技術最早產生了。CGI(Common Gateway Interface通用閘道器介面)也是一種規範,可以使用不同的語言來開發,如Perl,C,Java等都可以。當客戶端請求靜態資源時,Web伺服器會自己處理並返回,當客戶端請求動態資源時,Web伺服器會把請求轉交給擴充套件程式來處理,並將擴充套件程式的處理結果返回給客戶端。但是CGI技術開發複雜,效能較差,只要有一個請求到達,Web伺服器就會單獨分配一個程序來進行處理,可移植性不好,所以慢慢就由後來的Servlet技術所取代。
Servlet技術是使用Java語言開發的一套元件規範,不再像CGI技術那樣需要分配單獨的程序來處理請求,而是單獨分配一個執行緒來處理,於是大大提升了處理效率。並且Java語言是跨平臺的語言,也提升了Web伺服器擴充套件程式的可移植性,已經取代了CGI技術,成為BS架構中的主流技術。所有後續的BS架構中的主流框架本質上都是基於Servlet來實現的。
2,Servlet 提供的功能#
(1)對客戶端傳送的資料進行讀取和攔截
客戶端傳送一個請求時,一般都會攜帶一些資料(例如:URL中的引數,頁面中的表單,Ajax提交的引數等),當一個Servlet接收到這些請求時,Java Servlet 中的類通過所提供的的方法就能得到這些引數,(例如:方法request.getParameterName(name)用於獲得名為name的引數值),也正是這些原因,Servlet可以對傳送請求起到攔截作用,他在某些請求前先做一個預處理分析,從而判斷客戶端是否可以做這些請求(例如:檢查訪問許可權,設定程式的字符集,檢查使用者角色等),當Servlet有上面這些功能時,一般稱為攔截器。
(2)讀取客戶端請求的隱含資料
客戶端請求的資料可以分為隱含資料和顯示資料:
隱含資料:一般是不直接跟隨於URL中,它存在於請求的來源,快取資料(Cookie),客戶端型別中;
顯式資料:顯然是使用者可以直觀看到的(例如:表單資料,URL引數),
Servlet不僅可以處理顯式資料,而且可以處理隱含資料,是個“多面手”;
(3)執行結果或者生成結果
當一個Web應用程式對客戶端發出的請求作出響應時,一般需要很多中間過程,才能得到結果,Servlet就是起到這個中間角色的作用,它協調各元件,各部分完成響應功能,根據不同的請求作出相應的響應並顯示結果。
(4)傳送響應的資料
Servlet在客戶端作出響應並經過處理得出結果後,會對客戶端傳送響應的資料,以便讓客戶端獲取請求的結果資料。在Web應用程式中,Servlet的這個作用相當突出,無論現有技術多麼突出,都是基於這個技術點出發的。
綜上所述,servlet的執行順序大概如下圖所示: Servlet執行流程
1.客戶端傳送請求給伺服器。
2.伺服器開始接受,先判斷該請求的servlet例項是否存在,如果不存在先裝載一個servlet類並建立例項。如果存在則直接呼叫該servlet的service方法,之後進行判斷是呼叫doGet方法還是doPost方法。
3.servlet建立例項後,呼叫init方法進行初始化。之後呼叫servce方法,判斷是呼叫doGet方法還是doPost方法。
4.最後判斷服務是否關閉,如果關閉則呼叫destroy方法。
(開始----Servlet例項是否存在----裝載Servlet類並建立例項 構造方法----呼叫init(Servlet)類並建立例項----呼叫service(Servlet Requst Servlet Response)方法----伺服器關閉-----呼叫Destroy的方法)
訪問Servlet流程
1、提交超連結請求後,伺服器會在web.xml中的<servlet-mapping>尋找對應的url(url-pattern)地址,然後得到這個servlet的名稱。
2、得到名稱後,在servlet中尋找名稱相同的標籤,然後得到處理類(servlet-class檔案)
3、進入servlet處理類,根據請求方式(get或者post)執行d(oGet或者doPost)方法
3,Servlet技術的特點#
Servlet在開發中帶來的優點是:能及時響應和處理Web端的請求,使得一個不懂網頁的Java開發人員,也能編寫出Web應用程式,只是在開發/修改時比較困難,因此,程式碼的可讀性,比較差,也比較難以維護。但是它具有以下優點:
(1)高效性
Servlet本身就是一個Java類,在執行的時候位於同一個java虛擬機器中,可以快速的響應客戶端的請求並並生成結果,在一個Web伺服器中處理一個請求都是用的是執行緒而非程序,也就是說在效能開銷方面小很多,無需大量啟動程序時間,在高併發量訪問時,一個程序可以有多個執行緒,併發時執行緒在CPU使用的開銷代價遠小於程序的開銷代價。
(2)開發一個Web程式時,從開發順序上說,比較簡單,首先定義一個Servlet類,然後在系統(web.xml)中配置程式,繼而釋出程式,這樣一個web就完成了,在開發過程中,系統提供了大量實用工具,可以處理複雜的HTML表單資料,處理cookie,跟蹤網頁會話等。
4,servlet的生命週期#
分為三個階段 初始化(包括裝載和初始化) 執行 消亡 #
(0)載入和例項化(裝載Servlet例項)
裝載就是:由Servlet容器裝載一個Servlet的類,把它裝載到一個java記憶體中,Servlet容器可以建立一個Servlet物件並與web.xml對應;
當Servlet容器啟動或客戶端傳送一個請求時,Servlet容器會查詢記憶體中是否存在該Servlet例項,若存在,則直接讀取該例項響應請求;如果不存在,就建立一個Servlet例項。
(1) 初始化
例項化後,Servlet容器將呼叫Servlet的init()方法進行初始化(一些準備工作或資源預載入工作)。
(2)服務
初始化後,Servlet處於能響應請求的就緒狀態。當接收到客戶端請求時,Servlet容器將建立HttpServletRequest和HttpServletResponse物件呼叫service(HttpServletRequest request ,HttpServletResponse response)的方法 處理客戶端請求,service()方法通過request物件獲得請求物件的資訊並加以處理,再由response物件對客戶端作出響應。
(3)銷燬
當Servlet容器關閉時,Servlet例項也隨時銷燬。其間,Servlet容器會呼叫Servlet 的destroy()方法去判斷該Servlet是否應當被釋放(或回收資源)。
5,Servlet和JSP的比較
(1)Servlet是Java程式碼,jsp是頁面程式碼。
編寫Servlet就是編寫Java程式碼,所以應用java中的規範去編寫Servlet類就可以了,但是若想在客戶端響應結果,就必須在程式碼中加入大量的Html程式碼,可想而知,當想要得到一個比較美觀,複雜的介面時,html會相當的多,而且繁瑣,Jsp是以html程式碼為主,在頁面中適當的嵌入Java程式碼來處理業務上的邏輯,顯然jsp比servlet較易編寫而且美觀,所以
如果業務中主要以頁面為主,選擇Jsp技術; 反之,則選擇Servlet技術,適合伺服器端開發;
(2)Servlet的執行速度快過Jsp
因為Servlet本身就是一個Java類,編譯時直接轉化為.class類檔案,而jsp需要先編譯為Java類,而後在執行,Servlet的執行速度較快;
jsp與servlet的區別與聯絡#
jsp和servlet的區別和聯絡:
1.jsp經編譯後就變成了Servlet.
(JSP的本質就是Servlet,JVM只能識別java的類,不能識別JSP的程式碼,Web容器將JSP的程式碼編譯成JVM能夠識別的java類)
2.jsp更擅長表現於頁面顯示,servlet更擅長於邏輯控制.
3.Servlet中沒有內建物件,Jsp中的內建物件都是必須通過HttpServletRequest物件,HttpServletResponse物件以及HttpServlet物件得到.
Jsp是Servlet的一種簡化,使用Jsp只需要完成程式設計師需要輸出到客戶端的內容,Jsp中的Java指令碼如何鑲嵌到一個類中,由Jsp容器完成。
而Servlet則是個完整的Java類,這個類的Service方法用於生成對客戶端的響應。
聯絡:
JSP是Servlet技術的擴充套件,本質上就是Servlet的簡易方式。JSP編譯後是“類servlet”。
Servlet和JSP最主要的不同點在於:
Servlet的應用邏輯是在Java檔案中,並且完全從表示層中的HTML裡分離開來。
而JSP的情況是Java和HTML可以組合成一個副檔名為.jsp的檔案。
JSP側重於檢視,Servlet主要用於控制邏輯
Servlet更多的是類似於一個Controller,用來做控制。
理解以下三點即可:
1、不同之處在哪?
-
- Servlet在Java程式碼中通過HttpServletResponse物件動態輸出HTML內容
- JSP在靜態HTML內容中嵌入Java程式碼,Java程式碼被動態執行後生成HTML內容
2、各自的特點
-
- Servlet能夠很好地組織業務邏輯程式碼,但是在Java原始檔中通過字串拼接的方式生成動態HTML內容會導致程式碼維護困難、可讀性差
- JSP雖然規避了Servlet在生成HTML內容方面的劣勢,但是在HTML中混入大量、複雜的業務邏輯同樣也是不可取的
既然JSP和Servlet都有自身的適用環境,那麼能否揚長避短,讓它們發揮各自的優勢呢?答案是肯定的——MVC(Model-View-Controller)模式非常適合解決這一問題。
MVC模式(Model-View-Controller)是軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:模型(Model)、檢視(View)和控制器(Controller):
-
- Controller——負責轉發請求,對請求進行處理
- View——負責介面顯示
- Model——業務功能編寫(例如演算法實現)、資料庫設計以及資料存取操作實現
在JSP/Servlet開發的軟體系統中,這三個部分的描述如下所示:
- Web瀏覽器傳送HTTP請求到服務端,被Controller(Servlet)獲取並進行處理(例如引數解析、請求轉發)
- Controller(Servlet)呼叫核心業務邏輯——Model部分,獲得結果
- Controller(Servlet)將邏輯處理結果交給View(JSP),動態輸出HTML內容
- 動態生成的HTML內容返回到瀏覽器顯示
MVC模式在Web開發中的好處是非常明顯,它規避了JSP與Servlet各自的短板,Servlet只負責業務邏輯而不會通過out.append()動態生成HTML程式碼;
JSP中也不會充斥著大量的業務程式碼。這大大提高了程式碼的可讀性和可維護性。