亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

JavaServlet工作原理問答

2019-11-14 15:03:53
字體:
來源:轉載
供稿:網友

導讀

本文來自stackoverflow的問答,討論了java Servlet的工作機制,如何進行實例化、共享變量和多線程處理。

問題:Servlet是如何工作的?Servlet 如何實例化、共享變量、并進行多線程處理?

假設我有一個運行了大量 Servlet 的 web 服務器。通過 Servlet 之間傳輸信息得到 Servlet 上下文,并設置 session 變量。

現在,如果有兩名或更多使用者向這個服務發送請求,接下來 session 變量會發生什么變化?究竟是所有用戶都是用共同的變量?還是不同的用戶使用的變量都不一樣?如果是后者,服務器如何區分不同用戶?

另一個相似的問題,如果有 *n* 名用戶訪問一個特定的 Servlet,那么該 Servlet 是僅在第一個用戶首次訪問的時候實例化,還是分別為每個用戶實例化?

回答(BalusC):

ServletContext

當 Servlet 容器(比如 Apache Tomcat)啟動后,會部署和加載所有 web 應用。當web 應用被加載,Servlet 容器會創建一次 ServletContext,然后將其保存在服務器的內存中。web 應用的web.xml 被解析,找到其中所有 servlet、filter 和 Listener 或 @WebServlet@WebFilter和 @WebListener 注解的內容,創建一次并保存到服務器的內存中。對于所有過濾器會立即調用init()。當 Servlet 容器停止,將卸載所有 web 應用,調用所有初始化的 Servlet 和過濾器的destroy() 方法,最后回收 ServletContext 和所有 Servlet、Filter 與 Listener 實例。

當問題中的 Servlet 配置的 load-on-startup 或者 @WebServlet(loadOnStartup) 設置了一個大于 0 的值,則同樣會在啟動的時候立即調用 init() 方法。“load-on-startup”中的值表示那些 Servlet 會以相同順序初始化。如果配置的值相同,會遵循 web.xml 中指定的順序或 @WebServlet類加載的順序。另外,如果不設置 “load-on-startup” 值,init() 方法只在第一次 HTTP 請求命中問題中的 Servlet 時才被調用。

HttpServletRequest 與 HttpServletResponse

Servlet 容器附加在一個 web 服務上,這個 web 服務會在某個端口號上監聽 HTTP 請求,在開發環境中這個端口通常為 8080,生產環境中通常為 80。當客戶端(web 瀏覽器)發送了一個 HTTP 請求,Servlet 容器會創建新的 HttpServletRequest 和 HttpServletResponse 對象,傳遞給已創建好并且請求的 URL 匹配 url-pattern 的 Filter 和 Servlet 實例中的方法,所有工作都在同一個線程中處理。

request 對象可以訪問所有該 HTTP 請求中的信息,例如 request header 和 request body。response 對象為你提供需要的控制和發送 HTTP 響應方法,例如設置 header 和 body(通常會帶有 jsp 文件中的 HTML 內容)。提交并完成HTTP 響應后,將回收 request 和 response 對象。

HttpSession

當用戶第一次訪問該 web 應用時,會通過 request.getSession() 第一次獲得 HttpSession。之后 Servlet 容器將會創建 HttpSession,生成一個唯一的 ID(可以通過 session.getId() 獲?。┎Υ嬖诜掌鲀却嬷?。然后 Servlet 容器在該次 HTTP 響應的 Set-Cookie 頭部設置一個Cookie,以 JSESSIONID 作為 Cookie 名字,那個唯一的 session ID 作為 Cookie 的值。

按照 HTTP cookie 規則(正常 web 瀏覽器和 web 服務端必須遵循的標準),當 cookie 有效時,要求客戶端(瀏覽器)在后續請求的 Cookie 頭中返回這個 cookie。使用瀏覽器內置的 HTTP 流量監控器,你可以查看它們(在 ChromeFirefox23+、IE9+ 中按 F12,然后查看 Net/Network 標簽)。Servlet 容器將會確定每個進入的 HTTP 請求的 Cookie 頭中是否存在名為JSESSIONID 的 cookie,然后用它的值(session ID)從服務端內存中找到關聯的 HttpSession。

你可以在 web.xml 中設置 session-timeout ,默認值為 30 分鐘。超時到達之前 HttpSession 會一直存活。所以當客戶端不再訪問該 web 應用超過 30 分鐘后,Servlet 容器就會回收這個 session。后續每個請求,即使指定 cookie 名稱也不能再訪問到相同的 session。Servlet 容器會創建一個新的 Cookie。

另一方面,客戶端上的 session cookie 有一個默認存活時間,該事件和該瀏覽器實例運行時間一樣長。所以,當客戶端關閉該瀏覽器實例(所有標簽和窗口)后,這個 session 就會被客戶端回收。新瀏覽器實例不再發送與該 session 關聯的 cookie。一個新的 request.getSession() 將會返回新的 HttpSession 并設置一個擁有新 session ID 的 cookie。

概述

  • ServletContext 與 web 應用存活時間一樣長。它被所有 session 中的所有請求共享。
  • 只要客戶端一直與相同瀏覽器實例的web應用交互并且沒有超時,HttpSession就會存在。
  • HttpServletRequest 和 HttpServletResponse 的存活時間為客戶端發送完成到完整的響應(web 頁面)到達的這段時間。不會被其他地方共享。
  • 所有 Servlet、Filter 和 Listener 對象在 web 應用運行時都是活躍的。它們被所有 session 中的請求共享。
  • 你設置在 HttpServletRequestHttpServletResponse 和 HttpSession 中的所有屬性在問題中的對象存活時都會一直保持存活。

線程安全

即便如此,你最關心的可能是線程安全。你現在應該學習到 Servlet 和 filter 被所有請求共享。那是 Java 的一個優點,使得多個不同線程(讀取 HTTP 請求)可以使用同一個實例。否則為每個請求重新創建線程的開銷實在過于昂貴。

但你應該也意識到永遠不要將任何 request 或 session 域中的數據賦值給 servlet 或 filter 的實例變量。它將會被所有其他 session 中的所有請求共享。那是非線程安全的!下面的示例對這種情況進行了展示:

1
2
3
4
5
6
7
8
9
10
11
public class ExampleServlet extends HttpServlet {
 
    PRivate Object thisIsNOTThreadSafe;
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Object thisIsThreadSafe;
 
        thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
        thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
    }
}

 

全能程序員交流QQ群290551701,聚集很多互聯網精英,技術總監,架構師,項目經理!開源技術研究,歡迎業內人士,大牛及新手有志于從事IT行業人員進入!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品av在线播放| 亚洲一区二区三区香蕉| 亚洲精品视频在线播放| 色综合视频一区中文字幕| 欧美日本啪啪无遮挡网站| 国产精品中文字幕在线| 性色av一区二区三区红粉影视| 欧美日韩免费看| 亚洲激情在线观看| 俺去啦;欧美日韩| 在线视频国产日韩| 国产日韩中文字幕在线| 亚洲自拍小视频免费观看| 日韩在线视频播放| 欧美体内谢she精2性欧美| 26uuu亚洲伊人春色| 一区二区三区亚洲| 欧美裸身视频免费观看| 亚洲精品国产拍免费91在线| 成人黄色中文字幕| 久久久亚洲精品视频| 欧美在线激情网| 亚洲激情在线观看视频免费| 国产精品久久久久久婷婷天堂| 欧美日韩一区二区三区在线免费观看| 91国偷自产一区二区三区的观看方式| 欧美国产第二页| 最新69国产成人精品视频免费| 国产性猛交xxxx免费看久久| 成人国产精品色哟哟| 久久精品视频在线观看| 在线观看免费高清视频97| 精品国产欧美一区二区三区成人| 热久久视久久精品18亚洲精品| 亚洲乱码一区av黑人高潮| 青青草原成人在线视频| 精品视频一区在线视频| 欧美午夜影院在线视频| 久久久久北条麻妃免费看| 色综合色综合网色综合| 在线观看精品国产视频| 精品国产乱码久久久久久虫虫漫画| 亚洲字幕在线观看| 国产成人精品一区二区在线| 亚洲天堂开心观看| 亚洲男女性事视频| 亚洲乱码国产乱码精品精天堂| 欧美猛交ⅹxxx乱大交视频| 成人h视频在线观看播放| 亚洲综合在线做性| 亚洲精品91美女久久久久久久| 亚洲va欧美va国产综合久久| 国产婷婷97碰碰久久人人蜜臀| 成人乱色短篇合集| 欧美www视频在线观看| www.国产一区| 中文国产成人精品| 国产欧美日韩专区发布| 色婷婷综合成人av| 国产精品美女无圣光视频| 日韩中文字幕视频在线观看| 4438全国亚洲精品在线观看视频| 91视频九色网站| 国语自产精品视频在线看| 国产精品嫩草影院久久久| 亚洲免费成人av电影| 国产日韩在线看片| 欧美交受高潮1| 亚洲国产精久久久久久久| 亚洲精品国产综合区久久久久久久| 亚洲国产古装精品网站| 91精品国产乱码久久久久久蜜臀| 国产精品一区二区av影院萌芽| 久久久视频在线| 亚洲精品ady| 日韩精品黄色网| 97视频在线观看免费| 性色av一区二区三区在线观看| 日韩一二三在线视频播| 91精品啪aⅴ在线观看国产| 国产精品美乳一区二区免费| 久久国产精品免费视频| 亚洲国产欧美一区二区三区同亚洲| 国产美女91呻吟求| 日韩av免费在线看| 97在线精品视频| 欧美激情影音先锋| www.日韩不卡电影av| 亚洲精品有码在线| 欧美成人三级视频网站| 久久久欧美一区二区| 日韩在线观看免费| 91青草视频久久| 国产午夜精品一区理论片飘花| 久久久精品国产网站| 日韩男女性生活视频| 成人性生交大片免费观看嘿嘿视频| 国产精彩精品视频| 亚洲九九九在线观看| 成人a在线视频| 日韩av中文字幕在线播放| 久久久久久久影视| 91精品国产色综合| 视频直播国产精品| 亚洲精品美女在线观看播放| 少妇高潮 亚洲精品| 久久久999国产精品| 亚洲精品小视频在线观看| 亚洲a级在线播放观看| 亚洲精品电影在线| 久久亚洲精品网站| 亚洲欧洲美洲在线综合| 久久久久久久久久av| 日产精品99久久久久久| 国产精品老牛影院在线观看| 日韩av成人在线观看| 亚洲区bt下载| 久久91亚洲人成电影网站| 国产乱人伦真实精品视频| 成人欧美一区二区三区黑人孕妇| 国产精品久久久av| 视频直播国产精品| 成人免费激情视频| 亚洲天堂av图片| 日韩高清中文字幕| 精品国产乱码久久久久久虫虫漫画| 亚洲欧美国产高清va在线播| 欧美性生交xxxxxdddd| 亚洲qvod图片区电影| 精品高清一区二区三区| 色综合91久久精品中文字幕| 日本国产精品视频| 亚洲一区www| 日韩国产在线看| 久久精品视频导航| 久久99精品视频一区97| 一区二区欧美日韩视频| 大胆人体色综合| 日韩小视频在线观看| 日韩中文字幕免费视频| 超薄丝袜一区二区| 久久久久久久久久久久av| 国产精品视频专区| 91久久久久久久久久久久久| 91极品视频在线| 中文字幕一区二区三区电影| 91在线视频导航| 中文字幕9999| 91久久在线播放| 久久视频在线免费观看| 91精品国产高清久久久久久| 中文字幕在线视频日韩| 久久久99久久精品女同性| 97在线视频免费播放| 欧美天堂在线观看| 国产精品老女人精品视频| 色偷偷88888欧美精品久久久| 日韩精品在线免费| 久久综合伊人77777尤物| 国模精品视频一区二区三区| 久久香蕉精品香蕉| 国产精品免费在线免费| 久久精品99久久香蕉国产色戒| 国产欧美在线视频|