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

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

JavaServlet工作原理問答

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

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

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

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

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

回答(BalusC):

ServletContext

當 Servlet 容器(比如 Apache Tomcat)啟動后,會部署和加載所有 web 應用。當web 應用被加載,Servlet 容器會創建一次 ServletContext,然后將其保存在服務器的內存中。web 應用的web.xml 被解析,找到其中所有 servletfilter 和 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 流量監控器,你可以查看它們(在 Chrome、Firefox23+、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 中的請求共享。
  • 你設置在 HttpServletRequest、HttpServletResponse 和 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.
    }
}

請參考:

  • JSF、Servlet 和 JSP 之間有什么不同?
  • Java 中管理 Session 的最佳選擇
  • Servlet 中的 doGet 與 doPost
  • Servlet 似乎會同步處理多并發請求

原文鏈接: stackoverflow 翻譯: ImportNew.com - honoka
譯文鏈接: http://www.importnew.com/17025.html

全能程序員交流QQ群290551701,群內程序員都是來自,百度、阿里、京東、小米、去哪兒、餓了嗎、藍港等高級程序員 ,擁有豐富的經驗。加入我們,直線溝通技術大牛,最佳的學習環境,了解業內的一手的資訊。如果你想結實大牛,那 就加入進來,讓大牛帶你超神!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人女保姆的销魂服务| 中文字幕日韩精品在线观看| 国产香蕉精品视频一区二区三区| 欧美日韩日本国产| 久久好看免费视频| 欧美xxxx综合视频| 国产97在线|亚洲| 国产一区二区三区久久精品| 欧美精品一区三区| 日韩在线中文字幕| 亚洲自拍欧美另类| 亚洲福利在线视频| 久久久999国产精品| 日本欧美中文字幕| 欧美日韩福利视频| 久久精品国产69国产精品亚洲| 国产精品美女视频网站| www.日韩.com| 亚洲欧美日韩国产成人| 成人久久一区二区| 亚洲аv电影天堂网| 亚洲一区二区三区sesese| 亚洲字幕在线观看| 亚洲国产精彩中文乱码av| 亚洲最新av在线网站| 97视频在线免费观看| 亚洲嫩模很污视频| y97精品国产97久久久久久| 日韩免费观看av| 精品久久久久久中文字幕一区奶水| 最新69国产成人精品视频免费| 最近2019年日本中文免费字幕| 亚洲色图17p| 国产精品网址在线| 欧美日韩在线视频观看| 91在线精品视频| 97人人做人人爱| 神马久久桃色视频| 欧美一区二粉嫩精品国产一线天| 国产视频综合在线| 狠狠做深爱婷婷久久综合一区| 一本一道久久a久久精品逆3p| 成人黄色大片在线免费观看| 国产一区二区三区免费视频| 性欧美激情精品| 丝袜美腿亚洲一区二区| 亚洲欧洲av一区二区| 亚洲成人在线视频播放| 国产精品在线看| 亚洲午夜女主播在线直播| 97精品在线观看| 欧美激情国产精品| 国产精品成人一区二区| 国产精品久久久久久久久久久久久| 俺去啦;欧美日韩| 日韩国产高清污视频在线观看| 久久人人爽亚洲精品天堂| 国产99视频在线观看| 日韩精品在线第一页| 成人a在线观看| 亚洲国模精品一区| 欧美激情综合亚洲一二区| 国产精品入口日韩视频大尺度| 亚洲一区中文字幕在线观看| 亚洲精品视频播放| 亚洲aⅴ男人的天堂在线观看| 亚洲国产精品久久久久| 精品偷拍各种wc美女嘘嘘| 国产剧情日韩欧美| 欧洲美女免费图片一区| 免费99精品国产自在在线| 日韩av在线电影网| 国产69精品久久久久99| 欧美激情一级精品国产| 久久久精品在线| 97超碰蝌蚪网人人做人人爽| 97视频在线播放| 日韩久久精品成人| 久久久久女教师免费一区| 国产在线精品一区免费香蕉| 亚洲影院在线看| 久久久久久久电影一区| 国产成人综合久久| 国产日韩欧美一二三区| 国产成人精品国内自产拍免费看| 91久久在线播放| 国产精品日韩在线播放| 欧美大片免费看| 人人爽久久涩噜噜噜网站| 91欧美精品午夜性色福利在线| 97国产精品久久| 欧美激情精品久久久久久久变态| 国产精品视频成人| 久久久国产精品免费| 亚洲精品97久久| 91午夜理伦私人影院| 欧美日韩成人黄色| 欧美日韩亚洲精品内裤| 亚洲第一视频在线观看| 日韩中文字幕免费看| 国产亚洲激情在线| 欧美激情精品久久久久久蜜臀| 欧美二区乱c黑人| 欧美日韩国产中文精品字幕自在自线| 91精品国产91久久久久久最新| 国产精品久久久久久久一区探花| 国产91成人在在线播放| 日韩在线高清视频| 欧美精品激情视频| 成人久久一区二区| 成人国产精品色哟哟| 亚洲欧洲国产一区| 91久久国产婷婷一区二区| 欧美成人精品xxx| 亚州成人av在线| 日韩av电影院| 成人444kkkk在线观看| 欧美在线一区二区视频| 欧美性猛交xxxx乱大交蜜桃| 成人h视频在线观看播放| 国产福利精品在线| 亚洲的天堂在线中文字幕| 成人网在线观看| 91av视频在线免费观看| 国产日韩欧美91| 2018国产精品视频| 日韩av一区在线观看| 亚洲男人天堂视频| 国产成人精品视频在线观看| 91精品视频在线| 久久影院在线观看| 国产精品一区专区欧美日韩| 国产精品白嫩美女在线观看| 亚洲精品一区中文字幕乱码| 日韩精品视频免费在线观看| 成人欧美一区二区三区黑人孕妇| 国产精品高潮粉嫩av| 51ⅴ精品国产91久久久久久| 国产主播欧美精品| 欧美精品videossex性护士| 亚洲第一区在线| 日韩av在线影院| 亚洲天堂色网站| 欧美网站在线观看| 亚洲成av人影院在线观看| 欧美精品午夜视频| 久久久久成人精品| 欧美视频在线免费| 国产在线高清精品| 欧美又大又粗又长| 亚洲精品美女在线| 欧美一区二区.| 亚洲精品美女久久| 亚洲精品一区在线观看香蕉| 亚洲va码欧洲m码| 亚洲图中文字幕| 国产一区二区激情| 国产www精品| 亚洲欧美国内爽妇网| 91久久精品美女| 久久久亚洲精选| 精品福利一区二区| 日韩欧美在线免费观看| 国产精品视频久久久|