1. 程式人生 > 實用技巧 >[轉]Tomcat 學習總結(1) --Servlet技術

[轉]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中混入大量、複雜的業務邏輯同樣也是不可取的
  3、通過MVC雙劍合璧

  既然JSP和Servlet都有自身的適用環境,那麼能否揚長避短,讓它們發揮各自的優勢呢?答案是肯定的——MVC(Model-View-Controller)模式非常適合解決這一問題。

   MVC模式(Model-View-Controller)是軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:模型(Model)、檢視(View)和控制器(Controller):

    • Controller——負責轉發請求,對請求進行處理
    • View——負責介面顯示
    • Model——業務功能編寫(例如演算法實現)、資料庫設計以及資料存取操作實現

在JSP/Servlet開發的軟體系統中,這三個部分的描述如下所示:


  1. Web瀏覽器傳送HTTP請求到服務端,被Controller(Servlet)獲取並進行處理(例如引數解析、請求轉發)
  2. Controller(Servlet)呼叫核心業務邏輯——Model部分,獲得結果
  3. Controller(Servlet)將邏輯處理結果交給View(JSP),動態輸出HTML內容
  4. 動態生成的HTML內容返回到瀏覽器顯示

MVC模式在Web開發中的好處是非常明顯,它規避了JSP與Servlet各自的短板,Servlet只負責業務邏輯而不會通過out.append()動態生成HTML程式碼;

    JSP中也不會充斥著大量的業務程式碼。這大大提高了程式碼的可讀性和可維護性。