Servlet的生命周期 与CGI的区别
2019獨角獸企業重金招聘Python工程師標準>>>
對于Servlet,服務器只創建每個servlet的單一實例,每個用戶請求都會引發新的線程-----將用戶請求將會給相應的doGet/doPost進行處理。那么,servlet是如何進行創建和銷毀的?
當首次創建servlet時,它的init方法會得到調用,在這之前首先是服務器加載相應的servlet。init是放置一次性代碼 的地方,在這之后,針對每個用戶請求,都會創建一個線程,該線程調用前面創建的實例的service方法。多個并發請求一般會導致多個線程的同時調用 service(盡管可以實現特殊的接口,如 SingleThreadModel,規定任何時間只允許單個線程運行)。在調用service方法后,根據service方法收到的HTTP請求的類型,調用doGet,doPost,若其他doXxx方法,最后,如果服務決定缷載某個service,它會首先調用servlet的destroy方法。
service方法?
服務器每次接收到對servlet的請求,都會產生一個新的線程,調用service方法,service方法檢查HTTP請求的類型(GET,POST,PUT,DELETE等)并相應地調用doGet,doPost,doPut,doDelete等方法,GET請求起因于正常的URL請求,或沒有指定method="post"的表單請求。POST請求起因于特別將POST列為method的HTML表單,其他HTTP請求都由定制客戶生成。
如果我們需要在servlet中等同地處理POST和GET請求,我們有可能會不去實現doPost doGet方法,而是直接配覆寫service方法。但是這樣做不是一個好的思想,我們應該在doPost方法中調用doGet或相反。
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
??
? ?doGet(request,response);
}
public void doGet()throws ServletException,IOException{ ? // 相應的業務處理方法代碼?
}
這樣做有幾處優點:首先,我們還可以添加doPut,doTrace等方法,支持HTTP請求方法;其次,可以通過添加getLastModified方法加入對修改日期的支持。
destroy方法
服務器可以會決定移除之前載入的servlet實例,這時候它會調用servlet的destroy方法,從而使得servlet有機會關閉數據庫連接、停止后臺運行的線程、將cookie列表和點擊計數寫入到磁盤,并執行其他清理活動。在這里,要注意的是 web服務器可能會崩潰;所以我們不應該將destory機制作為向磁盤上保存狀態的惟一機制。如果服務器執行諸如點擊計數,或對cookie值(表示特殊的訪問 )的列表進行累加等活動,應該主動地定期將數據寫到磁盤上。
Servlet 與CGI的區別:
與CGI的區別在于servlet處于服務器進程中,它通過多線程方式運行其service方法,一個實例可以服務于多個請求,并且其實例一般不會銷毀,而CGI對每個請求都產生新的進程,服務完成后就銷毀,所以效率上低于servlet。
轉載于:https://my.oschina.net/u/938966/blog/107654
總結
以上是生活随笔為你收集整理的Servlet的生命周期 与CGI的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ecshop 标签使用 非常好的例子
- 下一篇: 优秀技术人才需具备能力