servlet的生命週期就是從servlet出現到銷毀的全過程。主要分為以下幾個階段:
載入類—>例項化(為物件分配空間)—>初始化(為物件的屬性賦值)—>請求處理(服務階段)—>銷毀
伺服器啟動時(web.xml中配置load-on-startup=1,預設為0)或者第一次請求該servlet時,就會初始化乙個servlet物件,也就是會執行初始化方法init(servletconfig conf),該servlet物件去處理所有客戶端請求,service(servletrequest req,servletresponse res)方法中執行,最後伺服器關閉時,才會銷毀這個servlet物件,執行destroy()方法。其中載入階段無法觀察,但是初始化、服務、銷毀階段是可以觀察到的。
為什麼建立的servlet是繼承自httpservlet,而不是直接實現servlet介面?
解答:首先看下原始碼,httpservlet的繼承結構:
httpservlet繼承了genericservlet,genericservlet是乙個通用的servlet,那麼他的作用是什麼呢?大概的就是將實現servlet介面的方法,簡化編寫servlet的步驟
public abstract class genericservlet implements servlet,servletconfig,serializable{}
實現了servlet介面和servletconfig介面
servlet介面的內容:
public
inte***ce
servlet
從這裡可以看到,servlet生命週期的三個關鍵方法,init、service、destroy。還有另外兩個方法,乙個getservletconfig()方法來獲取servletconfig物件,servletconfig物件可以獲取到servlet的一些資訊,servletname、servletcontext、initparameter、initparameternames、通過檢視servletconfig這個介面就可以知道
public
inte***ce
servletconfig
其中servletcontext物件是servlet上下文物件,功能有很多,獲得了servletcontext物件,就能獲取大部分我們需要的資訊,比如獲取servlet的路徑等方法。到此,就知道了servlet介面中的內容和作用,總結起來就是,三個生命週期執行的方法,獲取servletconfig,而通過servletconfig又可以獲取到servletcontext。而genericservlet實現了servlet介面後,也就說明我們可以直接繼承genericservlet,就可以使用上面我們所介紹servlet介面中的那幾個方法了,能拿到servletconfig,也可以拿到servletcontext,不過那樣太麻煩,不能直接獲取servletcontext,所以genericservlet除了實現servlet介面外,還實現了servletconfig介面,那樣,就可以直接獲取servletcontext了。
init方法存在兩個,乙個帶參,乙個無參:
private transient servletconfig config;
public
void
init
(servletconfig config) throws servletexception
public
void
init
() throws servletexception
public servletconfig getservletconfig()
預設的servlet的作用為:凡是在web.xml檔案總找不到匹配的元素的url,他們的方位請求都將交給預設的servlet處理。也就是說,預設的servlet用於處理所有其他servlet不處理的訪問請求。當訪問tomcat服務中的某個靜態html檔案和時,實際上是在訪問這個預設的servlet
default
<
/servlet-name>
/<
/url-pattern>
<
servlet的對映路徑為乙個(/),稱之為預設的servlet。則這個servlet就成為了當前web應用程式的預設servlet。
設計執行緒安全的servlet:
public class
("使用者名稱:"
+username+"");
}}}
3、避免使用例項變數
只要在servlet裡面的任何方法裡面都不使用例項變數,那麼該servlet就是執行緒安全的。修正上面的servlet**,將例項變數改為區域性變數實現同樣的功能,**如下:
}servlet的執行緒安全問題只有在大量的併發訪問時才會顯現出來,並且很難發現,因此在編寫servlet程式時要特別注意。執行緒安全問題主要是由例項變數造成的,因此在servlet中應避免使用例項變數。如果應用程式設計無法避免使用例項變數,那麼使用同步來保護要使用的例項變數,但為保證系統的最佳效能,應該同步可用性最小的**路徑。
servletconfig的作用:
1.通過servletconfig獲取servlet的初始化引數
當servlet配置了初始化引數後,web容器在建立servlet例項物件時,會自動將這些初始化引數封裝到servletconfig物件中,並在呼叫servlet的init方法時,將servletconfig物件傳遞給servlet。進而,我們通過servletconfig物件就可以得到當前servlet的初始化引數資訊。
2.web容器在啟動時,它會為每個web應用程式都建立乙個對應的servletcontext物件,它代表當前web應用。servletconfig物件中維護了servletcontext物件的引用,開發人員在編寫servlet時,可以通過servletconfig.getservletcontext方法獲得servletcontext物件。由於乙個web應用中的所有servlet共享同乙個servletcontext物件,因此servlet物件之間可以通過servletcontext物件來實現通訊。servletcontext物件通常也被稱之為context域物件
關於Servlet中一些常見錯誤
1 關於頁面亂碼問題一般會有以下兩種解決方式 servlet輸出亂碼問題 response.setcharacterencoding utf 8 request.setcharacterencoding utf 8 2 servlet.中不像jsp頁面 有session的內建物件 一般要先宣告 如 ...
servlet的一些認識
客戶端傳送請求至伺服器端 伺服器將請求資訊傳送至 servlet servlet 生成響應內容並將其傳給伺服器。響應內容動態生成,通常取決於客戶端的請求 伺服器將響應返回給客戶端。當乙個請求傳送到servlet容器的時候,容器先會將請求的url減去當前應用上下文的路徑作為servlet的對映url,...
關於指標的一些知識
要說指標 位址 筆者認為必須從記憶體開始說起,也就是儲存單元的位址,他是一種編號,相當於一排的座位,位址 座位編號 但是要談起 指標 可不像平時書上說的那樣,指標 位址,這種說法已經被廣大的 語言愛好者給抨擊了,那指標相當於什麼?可能你要這麼問,形象的說指標就相當於乙個箱子,箱子裡面放了乙個椅子,椅...