



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、java servlet i *作原理問答-編程開發(fā)技術(shù)java servlet工作原理問答木文由importnewhonoka翻譯自stackoverflowo歡迎加入翻譯小組。轉(zhuǎn)載請見文末耍求。導(dǎo)讀本文來自stackoverflow的問答,討論了 java servlet的工作機制,如何進行 實例化、共享變量和多線程處理。問題:servlet是如何工作的? servlet如何實例化、共享變量、并進行多線程處理?假設(shè)我有一個運行了大量servlet的web服務(wù)器。通過servlet之間傳輸信 息得到servlet上下文,并設(shè)置session變量。現(xiàn)在,如果有兩名或更多使用者向這個服務(wù)發(fā)送請求
2、,接下來session變量會 發(fā)生什么變化?究竟是所有用戶都是用共同的變量?述是不同的用戶使用的變 量都不一樣?如果是后者,服務(wù)器如何區(qū)分不同用戶?另一個相似的問題,如果有*n*名用戶訪問一個特定的servlet,那么該 servlet是僅在第一個用戶首次訪問的吋候?qū)嵗?,還是分別為每個用戶實例 化?回答(balusc):servletcontext當servlet容器(比如apache tomcat)啟動后,會部署和加載所有web應(yīng)用。 當web應(yīng)用被加載,servlet容器會創(chuàng)建一次servletcontext,然后將其保存 在服務(wù)器的內(nèi)存中。web應(yīng)用的web. xml被解析,找到其中所
3、有servlet、 filter 和 listener 或 webservlet>webfilter 和 weblistener 注解的內(nèi) 容,創(chuàng)建一次并保存到服務(wù)器的內(nèi)存中。對于所有過濾器會立即調(diào)用initoo 當servlet容器停止,將卸載所有web應(yīng)用,調(diào)用所有初始化的servlet和 過濾器的destroy ()方法,最后回收servletcontext和所有servlet>fi iter 與listener實例。當問題中的servlet配置的load-on-startup或者qwebservlet(loadonstartup)設(shè)置了一個大于0的值,則同樣會在啟動的時候
4、立即調(diào)用init()方法。"load-on-startup”中的值表示那些servlet會以相 同順序初始化。如果配置的值相同,會遵循web. xml中指定的順序或 webservlet類加載的順序。另外,如果不設(shè)置“ load-on-startup”值,init () 方法只在第一次http請求命中問題中的servlet時才被調(diào)用。httpservletrequest 與 httpservletresponseservlet容器附加在一個web服務(wù)上,這個web服務(wù)會在某個端口號上監(jiān)聽 http請求,在開發(fā)環(huán)境中這個端口通常為8080,生產(chǎn)環(huán)境中通常為80o當客 戶端(web瀏覽器
5、)發(fā)送了一個http請求,servlet容器會創(chuàng)建新的 httpservl etrequest 和 httpservl etresponse 對象,傳遞給已創(chuàng)建好并j_l請求 的url匹配url-pattcrn的filter和servlet實例中的方法,所有工作都 在同一個線程屮處理。request對象可以訪問所有該http請求中的信息,例如request header和 request body。response對象為你提供需要的控制和發(fā)送http響應(yīng)方法,例 如設(shè)置header和body (通常會帶有jsp文件中的html內(nèi)容)。提交并完成 http響應(yīng)后,將回收request和respo
6、nse對象。httpsession當用戶笫一次訪問該web應(yīng)用時,會通過request. getsession()笫一次獲得 httpsessiorio之后servlet容器將會創(chuàng)建httpsession,生成一個唯一的id (可以通過session. gettd()獲取)并儲存在服務(wù)器內(nèi)存中。然后servlet容 器在該次iittp響應(yīng)的set-cookie頭部設(shè)置一個cookie,以jsessionid作 為cookie名字,那個唯一的session id作為cookie的值。按照http cookie規(guī)則(正常web瀏覽器和web服務(wù)端必須遵循的標準), 當cookie有效吋,要求客戶端
7、(瀏覽器)在后續(xù)請求的cookie頭屮返冋這個 cookie。使用瀏覽器內(nèi)置的http流量監(jiān)控器,你可以查看它們(在chrome、 fircfox23+、ie9+ 中按 f12,然后杳看 net/network 標簽)。servlet 容器將 會確定每個進入的http請求的cookie頭屮是否存在名為jsessionid的 cookie,然后用它的值(session id)從服務(wù)端內(nèi)存中找到關(guān)聯(lián)的httpsession。你可以在web. xml中設(shè)置session-timeout ,默認值為30分鐘。超時到達z 前httpsession會一宜存活。所以當客戶端不再訪問該web應(yīng)用超過30分鐘
8、后,servlet容器就會冋收這個session。后續(xù)每個請求,即使指定cookie名 稱也不能再訪問到相同的session。servlet容器會創(chuàng)建一個新的cookico 另一方而,客戶端上的session cookie冇一個默認存活時間,該事件和該瀏覽 器實例運行時間一樣長。所以,當客戶端關(guān)閉該瀏覽器實例(所有標簽和窗口) 后,這個session就會被客戶端冋收。新瀏覽器實例不再發(fā)送與該session關(guān) 聯(lián)的 cookieo 一個新的 request. getsessiono 將會返回新的 httpsession 并 設(shè)置一個擁有新session id的cookico概述 servletc
9、ontext打web應(yīng)用存活吋間一樣長。它被所有session中的所有請求 共享。 只要客八端一總與相同瀏覽器實例的web應(yīng)用交互并且沒有超吋,hupsession就會 存在。 httpservletrequest和httpservletresponse的存活時間為客戶端發(fā)送完 成到完整的響應(yīng)(web頁面)到達的這段時間。不會被英他地方共享。 所有servlet、fi 1 ter和listener對象在web應(yīng)用運行時都是活躍的。它 們被所有session中的請求共享。 你設(shè)置在 httpscrvlctrequest httpscrvlctrcsponsc 和 httpscssion 中 的所
10、有屬性在問題中的對象存活時都會一宜保持存活。線程安全即便如此,你最關(guān)心的可能是線程安全。你現(xiàn)在應(yīng)該學(xué)習(xí)到servlet和filter 被所有請求共享。那是 九眩的一個優(yōu)點,使得多個不同線程(讀取http請求) 可以使用同一個實例。否則為每個請求重新創(chuàng)建線程的開銷實在過于昂貴。但你應(yīng)該也意識到永遠不要將任何request或session域屮的數(shù)據(jù)賦值給 servlet或citer的實例變量。它將會被所有其他session中的所有請求共 享。那是非線程安全的!下面的示例對這種情況進行了展示:public class exampl eservlet extends httpservlet priva
11、te object this1snotthreadsafe;protected void doget(httpservletrequest request,httpservletresponse response) throws servletexception, toexception object thisisthrcadsafe;thisisnotthreadsafe = request. getparameter(foo); / bad!shared among all requests!thiststhreadsafe = request. getpa/rameter(foo); / ok, this is thread safe請參考: jsf、servlet和jsp之間有什么不同? java屮管理ses
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)學(xué)課題 申報書
- 專項課題申報書
- 產(chǎn)科科研課題申報書
- 口腔教改課題申報書范文
- 益智課題申報書范文
- 和老外合同范例
- 課題申報書范例范文
- 代替舊合同新合同范例
- 教育范式 課題申報書
- 原液供貨合同范本
- 營銷部安全生產(chǎn)責任制
- 【講座】高三英語高效二輪備考講座課件
- 2022-2023學(xué)年遼寧省鞍山市普通高中高一年級下冊學(xué)期第一次月考數(shù)學(xué)(A卷)試題【含答案】
- 2022年安徽醫(yī)科大學(xué)第一附屬醫(yī)院臨床醫(yī)技、護理、管理崗位招聘187人筆試備考題庫及答案解析
- 弟子規(guī)42+用人物須明求+教案
- 微電網(wǎng)-儲能電池catl pet80ah電芯規(guī)格書
- GB/T 4209-2022工業(yè)硅酸鈉
- 2023年江蘇農(nóng)林職業(yè)技術(shù)學(xué)院高職單招(數(shù)學(xué))試題庫含答案解析
- GB/T 39242-2020無損檢測超聲檢測靈敏度和范圍設(shè)定
- GB/T 32271-2015電梯能量回饋裝置
- GB/T 18775-2009電梯、自動扶梯和自動人行道維修規(guī)范
評論
0/150
提交評論