首頁技術(shù)文章正文

servlet的生命周期及servlet常用方法

更新時間:2021-07-12 來源:黑馬程序員 瀏覽量:

(1)問題分析:

考官主要想考核Java基本功的掌握和應(yīng)用。一方面,是servlet的生命周期;另一方面,則是其單例非線程安全對于安全這塊的一個處理。

(2)核心答案講解:

1)init()方法

在Servlet的生命周期中,僅執(zhí)行一次init()方法,它是在服務(wù)器裝入Servlet 時執(zhí)行的,可以配置服務(wù)器,以在啟動服務(wù)器或客戶機首次訪問Servlet時裝入 Servlet。無論有多少客戶機訪問Servlet,都不會重復執(zhí)行init();

2)service()方法

它是Servlet的核心,每當一個客戶請求一個HttpServlet對象,該對象的 Service()方法就要調(diào)用,而且傳遞給這個方法一個“請求”(ServletRequest) 對象和一個“響應(yīng)”(ServletResponse)對象作為參數(shù)。在HttpServlet中已存 在Service()方法。默認的服務(wù)功能是調(diào)用與HTTP請求的方法相應(yīng)的do功能。

3)destroy()方法

僅執(zhí)行一次,在服務(wù)器端停止且卸載Servlet時執(zhí)行該方法,有點類似于C++的 delete方法。一個Servlet在運行service()方法時可能會產(chǎn)生其他的線程,因 此需要確認在調(diào)用destroy()方法時,這些線程已經(jīng)終止或完成。

(3)問題擴展

如何解決servlet線程安全:

第一種,繼承SingleThreadModel但是這樣每次都會創(chuàng)建一個新的servlet實例, 但這樣消耗服務(wù)器的內(nèi)存,降低了性能,并且這個接口現(xiàn)在已經(jīng)過時了,不推薦使 用。

第二種:我們盡量避免使用全局變量,就我個人而言,我比較喜歡使用這種方法。

第三種,我們可以通過使用ThreadLocal, 內(nèi)部結(jié)構(gòu)是一個Map結(jié)構(gòu),用當前線 程作為key,他會創(chuàng)建多個副本。get,set方法

第四種,我們當然還可以來加鎖,進行解決線程問題。

而且我還知道,向我們這種常用的MVC框架,struts1,spring這些MVC框架,都 是基于servlet發(fā)展而來的,就比如struts1 的核心總控制器是ActionServlet, 而springMVC的前端總控制器是dispatchServlet,在項目我們曾經(jīng)用serlet來 生成 圖片驗證碼的,防止用戶進行暴力破解。

(4)結(jié)合項目中使用

servlet的配置文件 web.xml

ImageCodeServlet   org.leopard.code.ImageCodeServlet
   ImageCodeServlet
   /d


描述:

在web.xml中,首先需要寫一個servlet標簽,servlet標簽中有兩個子標簽,一個叫servlet-name,這個name可以隨便起,但是要保證唯一性,除此之外,在這個servlet-name下有一個servlet-class,這個servlet-class對應(yīng)的就是我后臺提高服務(wù)的servlet,除此之外還有一個servlet-mapping,這個里邊首先有一個servl-name。,這個servl-name首先要保證和上邊的servlet-name保持一致,除此之外還有一個url-pattern,這是一個虛擬路徑,是用來發(fā)送請求的url地址。

Servlet的生命周期是由Servlet容器來控制的,它始于裝入Web服務(wù)器的內(nèi)存時,并在終止或重新裝入Servlet時結(jié)束。

在代碼中,Servlet生命周期由接口javax.servlet.Servlet定義。所有的Java Servlet 必須直接或間接地實現(xiàn)javax.servlet.Servlet接口,這樣才能在Servlet Engine上運行。






猜你喜歡:

Java培訓之ServletContext的介紹與獲取

使用Spring Boot注冊整合方式整合Servlet三大組件

servlet事件監(jiān)聽器工作步驟介紹

黑馬程序員java高級軟件工程師培訓

分享到:
在線咨詢 我要報名
和我們在線交談!