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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Servlet/Tomcat/ Spring 之间的关系

發(fā)布時(shí)間:2024/9/20 javascript 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Servlet/Tomcat/ Spring 之间的关系 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

0.基礎(chǔ)知識(shí)

在idea中打開(kāi)servlet的源碼:

?

?

可以看見(jiàn)servlet就是一個(gè)接口;接口就是規(guī)定了一些規(guī)范,使得一些具有某些共性的類都能實(shí)現(xiàn)這個(gè)接口,從而都遵循某些規(guī)范。

有的人往往以為就是servlet直接處理客戶端的http請(qǐng)求,其實(shí)并不是這樣,servlet并不會(huì)去監(jiān)聽(tīng)8080端口;直接與客戶端打交道是“容器”,比如常用的tomcat。

客戶端的請(qǐng)求直接打到tomcat,它監(jiān)聽(tīng)端口,請(qǐng)求過(guò)來(lái)后,根據(jù)url等信息,確定要將請(qǐng)求交給哪個(gè)servlet去處理,然后調(diào)用那個(gè)servlet的service方法,service方法返回一個(gè)response對(duì)象,tomcat再把這個(gè)response返回給客戶端。

?

?

1. Servlet的生命周期

?

從創(chuàng)建到毀滅:

?

  • 調(diào)用?init()?方法初始化
  • 調(diào)用?service()?方法來(lái)處理客戶端的請(qǐng)求
  • 調(diào)用?destroy()?方法釋放資源,標(biāo)記自身為可回收
  • 被垃圾回收器回收
  • ?

    由上面可以看見(jiàn),servlet的init方法和destroy方法,一般容器調(diào)用這兩個(gè)方法之間的過(guò)程,就叫做servlet的生命周期。

    調(diào)用的整個(gè)過(guò)程就如上圖所示。

    當(dāng)請(qǐng)求來(lái)容器第一次調(diào)用某個(gè)servlet時(shí),需要先初始化init(),

    但當(dāng)某個(gè)請(qǐng)求再次打到給servlet時(shí),容器會(huì)起多個(gè)線程同時(shí)訪問(wèn)一個(gè)servlet的service()方法。

    ?

    ?

    由此可以看出,多個(gè)客戶訪問(wèn)同一service()方法,會(huì)涉及線程安全的問(wèn)題。

    ?

    如果service()方法沒(méi)有訪問(wèn)Servlet的成員變量也沒(méi)有訪問(wèn)全局的資源比如靜態(tài)變量、文件、數(shù)據(jù)庫(kù)連接等,而是只使用了當(dāng)前線程自己的資源,比如非指向全局資源的臨時(shí)變量、request和response對(duì)象等。該方法本身就是線程安全的,不必進(jìn)行任何的同步控制。

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

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

    如果service()方法訪問(wèn)了全局的靜態(tài)變量,如果同一時(shí)刻系統(tǒng)中也可能有其它線程訪問(wèn)該靜態(tài)變量,如果既有讀也有寫的操作,通常需要加上同步控制語(yǔ)句。

    如果service()方法訪問(wèn)了全局的資源,比如文件、數(shù)據(jù)庫(kù)連接等,通常需要加上同步控制語(yǔ)句。

    ?

    ?

    面試問(wèn)題:Servlet如何同時(shí)處理多個(gè)請(qǐng)求訪問(wèn)??

    單實(shí)例多線程:?主要是請(qǐng)求來(lái)時(shí),會(huì)由線程調(diào)度者從線程池李取出來(lái)一個(gè)線程,來(lái)作為響應(yīng)線程。這個(gè)線程可能是已經(jīng)實(shí)例化的,也可能是新創(chuàng)建的。


    Servlet容器默認(rèn)是采用單實(shí)例多線程的方式處理多個(gè)請(qǐng)求的:?
    1.當(dāng)web服務(wù)器啟動(dòng)的時(shí)候(或客戶端發(fā)送請(qǐng)求到服務(wù)器時(shí)),Servlet就被加載并實(shí)例化(只存在一個(gè)Servlet實(shí)例);?
    2.容器初始化化Servlet主要就是讀取配置文件(例如tomcat,可以通過(guò)servlet.xml的設(shè)置線程池中線程數(shù)目,初始化線程池通過(guò)web.xml,初始化每個(gè)參數(shù)值等等。?
    3.當(dāng)請(qǐng)求到達(dá)時(shí),Servlet容器通過(guò)調(diào)度線程(Dispatchaer Thread) 調(diào)度它管理下線程池中等待執(zhí)行的線程(Worker Thread)給請(qǐng)求者;?
    4.線程執(zhí)行Servlet的service方法;?
    5.請(qǐng)求結(jié)束,放回線程池,等待被調(diào)用;?
    (注意:避免使用實(shí)例變量(成員變量),因?yàn)槿绻嬖诔蓡T變量,可能發(fā)生多線程同時(shí)訪問(wèn)該資源時(shí),都來(lái)操作它,照成數(shù)據(jù)的不一致,因此產(chǎn)生線程安全問(wèn)題)

    ?

    從上面可以看出:?
    第一:Servlet單實(shí)例,減少了產(chǎn)生servlet的開(kāi)銷;?
    第二:通過(guò)線程池來(lái)響應(yīng)多個(gè)請(qǐng)求,提高了請(qǐng)求的響應(yīng)時(shí)間;?
    第三:Servlet容器并不關(guān)心到達(dá)的Servlet請(qǐng)求訪問(wèn)的是否是同一個(gè)Servlet還是另一個(gè)Servlet,直接分配給它一個(gè)新的線程;如果是同一個(gè)Servlet的多個(gè)請(qǐng)求,那么Servlet的service方法將在多線程中并發(fā)的執(zhí)行;?
    第四:每一個(gè)請(qǐng)求由ServletRequest對(duì)象來(lái)接受請(qǐng)求,由ServletResponse對(duì)象來(lái)響應(yīng)該請(qǐng)求;

    ?

    ?

    ?

    ?

    ?2. Spring?

    ?

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

    ?

    大名頂頂?shù)膕pring框架已經(jīng)風(fēng)靡多時(shí),一個(gè)事物的出現(xiàn)和流行都是會(huì)有原因的,那么為什么spring 框架會(huì)出現(xiàn)呢?原因就是為了簡(jiǎn)化java開(kāi)發(fā)

    spring的核心就是通過(guò)依賴注入、面向切面編程aop、和模版技術(shù),解耦業(yè)務(wù)與系統(tǒng)服務(wù),消除重復(fù)代碼。借助aop,可以將遍布應(yīng)用的關(guān)注點(diǎn)(如事物和安全)從它們的應(yīng)用對(duì)象中解耦出來(lái)。

    ?

    ?

    ?Spring 中的Bean

    ?1)?POJO和JavaBean的區(qū)別 :?

    "Plain Ordinary Java Object",簡(jiǎn)單普通的java對(duì)象。主要用來(lái)指代那些沒(méi)有遵循特定的java對(duì)象模型,約定或者框架的對(duì)象。

    POJO的內(nèi)在含義是指那些:
    有一些private的參數(shù)作為對(duì)象的屬性,然后針對(duì)每一個(gè)參數(shù)定義get和set方法訪問(wèn)的接口。
    沒(méi)有從任何類繼承、也沒(méi)有實(shí)現(xiàn)任何接口,更沒(méi)有被其它框架侵入的java對(duì)象。

    JavaBean 是一種JAVA語(yǔ)言寫成的可重用組件。JavaBean符合一定規(guī)范編寫的Java類,不是一種技術(shù),而是一種規(guī)范。大家針對(duì)這種規(guī)范,總結(jié)了很多開(kāi)發(fā)技巧、工具函數(shù)。符合這種規(guī)范的類,可以被其它的程序員或者框架使用。它的方法命名,構(gòu)造及行為必須符合特定的約定:

  • 所有屬性為private。

  • 這個(gè)類必須有一個(gè)公共的缺省構(gòu)造函數(shù)。即是提供無(wú)參數(shù)的構(gòu)造器。

  • 這個(gè)類的屬性使用getter和setter來(lái)訪問(wèn),其他方法遵從標(biāo)準(zhǔn)命名規(guī)范。

  • 這個(gè)類應(yīng)是可序列化的。實(shí)現(xiàn)serializable接口。

  • 因?yàn)檫@些要求主要是靠約定而不是靠實(shí)現(xiàn)接口,所以許多開(kāi)發(fā)者把JavaBean看作遵從特定命名約定的POJO。

    ?

    spring中,應(yīng)用對(duì)西那個(gè)生存于spring容器中,spring 容器創(chuàng)建對(duì)象,裝配它們,管理它們的整個(gè)生命周期。spring容器通過(guò)依賴注入,管理構(gòu)成應(yīng)用的組件,它會(huì)創(chuàng)建相互協(xié)作的組件之間的關(guān)聯(lián)。

    2) Bean的生命周期

    ?

    ?

    ?Spring MVC

    ?

    ?

    ?

    ?

    ?Spring MVC的運(yùn)行流程:

    ?

    ?

    ?

    來(lái)源:https://www.cnblogs.com/shawshawwan/p/9002126.html

    總結(jié)

    以上是生活随笔為你收集整理的Servlet/Tomcat/ Spring 之间的关系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。