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中也不會充斥著大量的業務代碼。這大大提高了代碼的可讀性和可維護性。
Tomcat 學習總結(1) --Servlet技術