更新時間:2021-07-12 來源:黑馬程序員 瀏覽量:
(1)問題分析:
考官主要想考核Java基本功的掌握和應用。一方面,是servlet的生命周期;另一方面,則是其單例非線程安全對于安全這塊的一個處理。
(2)核心答案講解:
1)init()方法
在Servlet的生命周期中,僅執行一次init()方法,它是在服務器裝入Servlet 時執行的,可以配置服務器,以在啟動服務器或客戶機首次訪問Servlet時裝入 Servlet。無論有多少客戶機訪問Servlet,都不會重復執行init();
2)service()方法
它是Servlet的核心,每當一個客戶請求一個HttpServlet對象,該對象的 Service()方法就要調用,而且傳遞給這個方法一個“請求”(ServletRequest) 對象和一個“響應”(ServletResponse)對象作為參數。在HttpServlet中已存 在Service()方法。默認的服務功能是調用與HTTP請求的方法相應的do功能。
3)destroy()方法
僅執行一次,在服務器端停止且卸載Servlet時執行該方法,有點類似于C++的 delete方法。一個Servlet在運行service()方法時可能會產生其他的線程,因 此需要確認在調用destroy()方法時,這些線程已經終止或完成。
(3)問題擴展
如何解決servlet線程安全:
第一種,繼承SingleThreadModel但是這樣每次都會創建一個新的servlet實例, 但這樣消耗服務器的內存,降低了性能,并且這個接口現在已經過時了,不推薦使 用。
第二種:我們盡量避免使用全局變量,就我個人而言,我比較喜歡使用這種方法。
第三種,我們可以通過使用ThreadLocal, 內部結構是一個Map結構,用當前線 程作為key,他會創建多個副本。get,set方法
第四種,我們當然還可以來加鎖,進行解決線程問題。
而且我還知道,向我們這種常用的MVC框架,struts1,spring這些MVC框架,都 是基于servlet發展而來的,就比如struts1 的核心總控制器是ActionServlet, 而springMVC的前端總控制器是dispatchServlet,在項目我們曾經用serlet來 生成 圖片驗證碼的,防止用戶進行暴力破解。
(4)結合項目中使用
servlet的配置文件 web.xml
ImageCodeServlet org.leopard.code.ImageCodeServlet ImageCodeServlet /d
描述:
在web.xml中,首先需要寫一個servlet標簽,servlet標簽中有兩個子標簽,一個叫servlet-name,這個name可以隨便起,但是要保證唯一性,除此之外,在這個servlet-name下有一個servlet-class,這個servlet-class對應的就是我后臺提高服務的servlet,除此之外還有一個servlet-mapping,這個里邊首先有一個servl-name。,這個servl-name首先要保證和上邊的servlet-name保持一致,除此之外還有一個url-pattern,這是一個虛擬路徑,是用來發送請求的url地址。
Servlet的生命周期是由Servlet容器來控制的,它始于裝入Web服務器的內存時,并在終止或重新裝入Servlet時結束。
在代碼中,Servlet生命周期由接口javax.servlet.Servlet定義。所有的Java Servlet 必須直接或間接地實現javax.servlet.Servlet接口,這樣才能在Servlet Engine上運行。