日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Servlet、Tomcat、 SpringMVC 之间的关系

發布時間:2025/3/15 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Servlet、Tomcat、 SpringMVC 之间的关系 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、基礎知識(什么是servlet)

在idea中打開servlet的源碼:

可以看見servlet就是一個接口;接口就是規定了一些規范,使得一些具有某些共性的類都能實現這個接口,從而都遵循某些規范。有的人往往以為就是servlet直接處理客戶端的http請求,其實并不是這樣,servlet并不會去監聽8080端口;直接與客戶端打交道是“容器”,比如常用的tomcat。客戶端的請求直接打到tomcat,它監聽端口,請求過來后,根據url等信息,確定要將請求交給哪個servlet去處理,然后調用那個servlet的service方法,service方法返回一個response對象,tomcat再把這個response返回給客戶端。


簡而言之,就是說Servlet是一個小型的JAVA程序,運行在Web 服務器中來處理用戶的請求,我們實際上使用的各路Servlet都需要通過各種方式實現這個接口。

  • Servlet的生命周期
  • 從創建到毀滅:

  • 調用 init() 方法初始化
  • 調用 service() 方法來處理客戶端的請求
  • 調用 destroy() 方法釋放資源,標記自身為可回收
  • 被垃圾回收器回收
  • 由上面可以看見,servlet的init方法和destroy方法,一般容器調用這兩個方法之間的過程,就叫做servlet的生命周期。調用的整個過程就如上圖所示。當請求來容器第一次調用某個servlet時,需要先初始化init(),但當某個請求再次打到給servlet時,容器會起多個線程同時訪問一個servlet的service()方法。
    由此可以看出,多個客戶訪問同一service()方法,會涉及線程安全的問題。

    • 如果service()方法沒有訪問Servlet的成員變量也沒有訪問全局的資源比如靜態變量、文件、數據庫連接等,而是只使用了當前線程自己的資源,比如非指向全局資源的臨時變量、request和response對象等。該方法本身就是線程安全的,不必進行任何的同步控制。

    • 如果service()方法訪問了Servlet的成員變量,但是對該變量的操作是只讀操作,該方法本身就是線程安全的,不必進行任何的同步控制。

    • 如果service()方法訪問了Servlet的成員變量,并且對該變量的操作既有讀又有寫,通常需要加上同步控制語句。

    • 如果service()方法訪問了全局的靜態變量,如果同一時刻系統中也可能有其它線程訪問該靜態變量,如果既有讀也有寫的操作,通常需要加上同步控制語句。

    • 如果service()方法訪問了全局的資源,比如文件、數據庫連接等,通常需要加上同步控制語句。

  • 面試問題:
    • Servlet如何同時處理多個請求訪問?

    單實例多線程: 主要是請求來時,會由線程調度者從線程池李取出來一個線程,來作為響應線程。這個線程可能是已經實例化的,也可能是新創建的。

    • Servlet容器默認是采用單實例多線程的方式處理多個請求的:
  • 當web服務器啟動的時候(或客戶端發送請求到服務器時),Servlet就被加載并實例化(只存在一個Servlet實例);

  • 容器初始化化Servlet主要就是讀取配置文件(例如tomcat,可以通過servlet.xml的設置線程池中線程數目,初始化線程池通過web.xml,初始化每個參數值等等。

  • 當請求到達時,Servlet容器通過調度線程(Dispatchaer Thread) 調度它管理下線程池中等待執行的線程(Worker Thread)給請求者;

  • 線程執行Servlet的service方法;

  • 請求結束,放回線程池,等待被調用; (注意:避免使用實例變量(成員變量),因為如果存在成員變量,可能發生多線程同時訪問該資源時,都來操作它,照成數據的不一致,因此產生線程安全問題)

  • 從上面可以看出:

    • 第一:Servlet單實例,減少了產生servlet的開銷;
    • 第二:通過線程池來響應多個請求,提高了請求的響應時間;
    • 第三:Servlet容器并不關心到達的Servlet請求訪問的是否是同一個Servlet還是另一個Servlet,直接分配給它一個新的線程;如果是同一個Servlet的多個請求,那么Servlet的service方法將在多線程中并發的執行;
    • 第四:每一個請求由ServletRequest對象來接受請求,由ServletResponse對象來響應該請求;

    二、tomcat

    盡管tomcat非常靈活而強大,可以作為web應用服務器,但是tomcat首先是一個Servlet容器,Servlet容器可以對Servlet進行管理,控制其生命周期。使其可以專注于自己應該做的事情,不需要考慮端口啊多線程啊socket之類的東西,也使得Servlet在各種環境下具有適應性。一個基本的流程:tomcat接收請求,找到合適的Servlet來處理請求,如果該Servlet沒加載,就順便編譯加載到JVM,如果加載了,就調init方法初始化,調Service方法處理request并返回responser,觀測Servlet狀態變化,在結束時調用destory方法。

    三、Spring MVC

    任何Spring Web的entry point,都是servlet。

    大名頂頂的spring框架已經風靡多時,一個事物的出現和流行都是會有原因的,那么為什么spring 框架會出現呢?原因就是為了簡化java開發。spring的核心就是通過依賴注入、面向切面編程aop、和模版技術,解耦業務與系統服務,消除重復代碼。借助aop,可以將遍布應用的關注點(如事物和安全)從它們的應用對象中解耦出來。

  • Spring 中的Bean
    • POJO和JavaBean的區別 :

    “Plain Ordinary Java Object”,簡單普通的java對象。主要用來指代那些沒有遵循特定的java對象模型,約定或者框架的對象。

    POJO的內在含義是指那些:
    有一些private的參數作為對象的屬性,然后針對每一個參數定義get和set方法訪問的接口。沒有從任何類繼承、也沒有實現任何接口,更沒有被其它框架侵入的java對象。JavaBean 是一種JAVA語言寫成的可重用組件。JavaBean符合一定規范編寫的Java類,不是一種技術,而是一種規范。大家針對這種規范,總結了很多開發技巧、工具函數。符合這種規范的類,可以被其它的程序員或者框架使用。它的方法命名,構造及行為必須符合特定的約定:

  • 所有屬性為private。
  • 這個類必須有一個公共的缺省構造函數。即是提供無參數的構造器。
  • 這個類的屬性使用getter和setter來訪問,其他方法遵從標準命名規范。
  • 這個類應是可序列化的。實現serializable接口。
  • 因為這些要求主要是靠約定而不是靠實現接口,所以許多開發者把JavaBean看作遵從特定命名約定的POJO。spring中,應用對西那個生存于spring容器中,spring 容器創建對象,裝配它們,管理它們的整個生命周期。spring容器通過依賴注入,管理構成應用的組件,它會創建相互協作的組件之間的關聯。

  • Bean的生命周期
  • Spring MVC Spring MVC的運行流程:

    四、總結

  • Tomcat和jettey類似,都是HTTP服務器和Servlet容器,負責給類似Spring這種servlet提供一個運行的環境,其中:Http服務器與Servlet容器的功能界限是:可以把HTTP服務器想象成前臺的接待,負責網絡通信和解析請求,Servlet容器是業務部門,負責處理業務請求。
  • Tomcat和Servlet作為Web服務器和Servlet容器的結合,可以接受網絡http請求解析為Servlet規范的請求對象和響應對象。比如,HttpServletRequest對象是Tomcat提供的,Servlet是規范,Tomcat是實現規范的Servlet容器,SpringMVC是處理Servlet請求的應用,其中DispatcherServlet實現了Servlet接口,Tomcat負責加載和調用DispatcherServlet。同時,DispatcherServlet有自己的容器(SpringMVC)容器,這個容器負責管理SpringMVC相關的bean,比如Controler和ViewResolver等。同時,Spring中還有其他的Bean比如Service和DAO等,這些由全局的Spring IOC容器管理,因此,Spring有兩個IOC容器。
  • 如果只是使用spring(不包含springmvc),那么是tomcat容器解析xml文件,通過反射實例化對應的類,根據這些servlet規范實現類,觸發對應的代碼處理邏輯,這個時候tomcat負責http報文的解析和servlet調度的工作。
  • 如果使用spring mvc,那么tomcat只是解析http報文,然后將其轉發給dispatchsetvlet,然后由springmvc根據其配置,實例對應的類,執行對應的邏輯,然后返回結果給dispatchservlet,最后由它轉發給tomcat,由tomcat負責構建http報文數據。
  • 參考文章
    參考文章
    參考文章

    總結

    以上是生活随笔為你收集整理的Servlet、Tomcat、 SpringMVC 之间的关系的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。