5 回答

TA貢獻1780條經驗 獲得超1個贊
Java servlet中的會話與其他語言(如PHP)中的會話相同。它對用戶來說是獨一無二的。服務器可以用不同的方式跟蹤它,例如cookie,url重寫等。這篇Java doc文章在Java servlet的上下文中解釋它,并指出會話的確切維護是服務器設計者留下的實現細節。規范僅規定必須通過與服務器的多個連接將其維護為對用戶唯一。有關這兩個問題的詳細信息,請查看Oracle的這篇文章。

TA貢獻1817條經驗 獲得超6個贊
當servlet容器(如Apache Tomcat)啟動時,如果出現任何問題或者在容器側控制臺出現錯使用web.xml的應用程序(將其命名為部署描述符)。
在servlet的實例化階段,servlet實例已準備就緒,但它無法為客戶端請求提供服務,因為它缺少兩條信息:
1:上下文信息
2:初始配置信息
Servlet引擎創建servletConfig接口對象,將上面缺少的信息封裝到servlet引擎中,通過提供servletConfig對象引用作為參數來調用servlet的init()。一旦init()完全執行,servlet就可以為客戶端請求提供服務。
Q)在servlet的生命周期中實例化和初始化發生了多少次?
A)只有一次(對于每個客戶端請求創建一個新線程),只有一個servlet實例服務于任意數量的客戶端請求,即在服務一個客戶端請求服務器之后不會死亡。它等待其他客戶端請求,即使用servlet(內部servlet引擎創建線程)克服了CGI(為每個客戶端請求創建新進程)的限制。
問)會話概念如何運作?
A)每當在HttpServletRequest對象上調用getSession()時
步驟1:評估請求對象的傳入會話ID。
步驟2:如果ID不可用,則創建全新的HttpSession對象并生成其對應的會話ID(即HashTable)會話ID存儲到httpservlet響應對象中,并將HttpSession對象的引用返回給servlet(doGet / doPost) 。
步驟3:如果未創建ID可用的全新會話對象,則從請求對象中拾取會話ID,通過使用會話ID作為密鑰在會話集合中進行搜索。
搜索成功后,會話ID將存儲到HttpServletResponse中,現有的會話對象引用將返回給UserDefineservlet的doGet()或doPost()。
注意:
1)當控制從servlet代碼離開到客戶端時,不要忘記servlet容器正在保存會話對象,即servlet引擎
2)多線程留給servlet開發人員實現ie。,處理客戶端的多個請求無需擔心多線程代碼
簡短形式:
在應用程序啟動時(它部署在servlet容器上)或首次訪問時(取決于啟動時加載設置),在實例化servlet時創建servlet,調用servlet的init()方法然后servlet(它的唯一實例)處理所有請求(由多個線程調用其service()方法)。這就是為什么不建議在其中進行任何同步,并且在取消部署應用程序(servlet容器停止)時應該避免servlet的實例變量,調用destroy()方法。
添加回答
舉報