JavaWeb中web.xml初始化加載順序詳解
需求說明
做項(xiàng)目時(shí),為了省事,起初把初始化的配置都放在每個(gè)類中 static加載,初始化配置一多,就想把它給整理一下,這里使用servlet中的init方法初始化。
web.xml說明
首先了解下web.xml中元素的加載順序:
- 啟動(dòng)web項(xiàng)目后,web容器首先回去找web.xml文件,讀取這個(gè)文件
- 容器會(huì)創(chuàng)建一個(gè) ServletContext ( servlet 上下文),整個(gè) web 項(xiàng)目的所有部分都將共享這個(gè)上下文
- 容器將 轉(zhuǎn)換為鍵值對(duì),并交給 servletContext
- 容器加載filter,創(chuàng)建過濾器, 要注意對(duì)應(yīng)的filter-mapping一定要放在filter的后面
- 容器加載servlet,加載順序按照 Load-on-startup 來執(zhí)行
完整加載順序:ServletContext -> context-param -> listener-> filter -> servlet
配置實(shí)現(xiàn)
InitServlet.java:
web.xml:(部分配置)
<!-- 初始基礎(chǔ)化數(shù)據(jù)--> <servlet> <servlet-name>InitServlet</servlet-name> <servlet-class>com.acts.web.common.servlet.InitServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>InitServlet</servlet-name> <url-pattern>/InitServlet</url-pattern> </servlet-mapping>
servlet介紹
什么是servlet
servlet是sun公司為開發(fā)動(dòng)態(tài)web而提供的一門技術(shù),用戶若想用發(fā)一個(gè)動(dòng)態(tài)web資源(即開發(fā)一個(gè)Java程序向?yàn)g覽器輸出數(shù)據(jù)),需要完成以下2個(gè)步驟:
- 編寫一個(gè)Java類,實(shí)現(xiàn)servlet接口。
- 把開發(fā)好的Java類部署到web服務(wù)器中。
按照一種約定俗成的稱呼習(xí)慣,通常我們也把實(shí)現(xiàn)了servlet接口的java程序,稱之為Servlet。
servlet的運(yùn)行過程
- 瀏覽器發(fā)出請(qǐng)求,被web容器獲取到
- Web服務(wù)器首先檢查是否已經(jīng)裝載并創(chuàng)建了該Servlet的實(shí)例對(duì)象。如果是,則直接執(zhí)行第④步,否則,執(zhí)行第②步。
- 裝載并創(chuàng)建該Servlet的一個(gè)實(shí)例對(duì)象,調(diào)用Servlet實(shí)例對(duì)象的init()方法。
- 創(chuàng)建一個(gè)用于封裝HTTP請(qǐng)求消息的HttpServletRequest對(duì)象和一個(gè)代表HTTP響應(yīng)消息的HttpServletResponse對(duì)象,然后調(diào)用Servlet的service()方法并將請(qǐng)求和響應(yīng)對(duì)象作為參數(shù)傳遞進(jìn)去。
- WEB應(yīng)用程序被停止或重新啟動(dòng)之前,Servlet引擎將卸載Servlet,并在卸載之前調(diào)用Servlet的destroy()方法
servlet初始化
- load-on-startup >=0 時(shí),表示在web應(yīng)用啟動(dòng)后立即加載,其中l(wèi)oad-on-startup的值越小,表示加載的優(yōu)先級(jí)越高,如果兩個(gè)servlet的load-on-startup值相同,則其加載優(yōu)先級(jí)有容器決定;
- load-on-startup 未配置時(shí),則該servlet的加載由容器決定;
配置load-on-startup后,servlet在startup后立即加載,但只是調(diào)用servlet的init()方法,用以初始化該servlet相關(guān)的資源。初始化成功后,該servlet可響應(yīng)web請(qǐng)求;如未配置load-on-startup,容器一般在第一次響應(yīng)web請(qǐng)求時(shí),會(huì)先檢測(cè)該servlet是否初始化,如未初始化,則調(diào)用servlet的init()先初始化,初始化成功后,再響應(yīng)請(qǐng)求。
PS:一般我們?cè)陂_發(fā)web應(yīng)用時(shí),都會(huì)配置這個(gè)參數(shù),有兩個(gè)好處:
- 如果初始化過程失敗,則容器會(huì)提示啟動(dòng)失敗,此時(shí)我們能夠提前知道相關(guān)錯(cuò)誤;
- 配置該參數(shù)相當(dāng)于將初始化servlet的工作轉(zhuǎn)移到容器啟動(dòng)過程,使得容器只要啟動(dòng)成功后,就可立即響應(yīng)web請(qǐng)求。
關(guān)于load-on-startup一些官網(wǎng)說明:
If the value is a negative integer, or the element is not present, the container is free to load the servlet whenever it chooses. If the value is a positive integer or 0, the container must load and initialize the servlet as the application is deployed.
注意
使用servlet時(shí),一般都是繼承httpServlet,然后分別實(shí)現(xiàn)doGet或者doPost方法,但是在這里面要注意的是,這servlet并不是線程安全的,多線程單實(shí)例執(zhí)行的,當(dāng)并發(fā)訪問同一個(gè)資源的話(成員變量等等),就有可能引發(fā)線程安全問題。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于Java8并行流(parallelStream)的注意點(diǎn)
這篇文章主要介紹了Java8并行流(parallelStream)的注意點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Java數(shù)據(jù)結(jié)構(gòu)與算法之稀疏數(shù)組與隊(duì)列深入理解
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)與算法之稀疏數(shù)組與隊(duì)列深入理解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09關(guān)于Maven混合配置私有倉(cāng)庫(kù)和公共倉(cāng)庫(kù)的問題
這篇文章主要介紹了Maven混合配置私有倉(cāng)庫(kù)和公共倉(cāng)庫(kù),通過實(shí)例代碼詳細(xì)介紹了私有和公共倉(cāng)庫(kù)混合配置的方法,需要的朋友可以參考下2022-06-06Java JDBC批量執(zhí)行executeBatch方法詳解
這篇文章主要介紹了Java JDBC批量執(zhí)行executeBatch方法詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08java從控制臺(tái)接收一個(gè)數(shù)字的實(shí)例詳解
這篇文章主要介紹了java從控制臺(tái)接收一個(gè)數(shù)字的實(shí)例詳解的相關(guān)資料,這里提供實(shí)例代碼,注釋說明清晰,需要的朋友可以參考下2017-07-07SpringBoot整合logback日志的詳細(xì)步驟
這篇文章主要介紹了SpringBoot整合logback日志的詳細(xì)步驟,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05java實(shí)現(xiàn)后臺(tái)處理base64圖片還原為文件
這篇文章主要介紹了java實(shí)現(xiàn)后臺(tái)處理base64圖片還原為文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02SpringBoot自定義MessageConverter與內(nèi)容協(xié)商管理器contentNegotiationManag
這篇文章主要介紹了SpringBoot自定義MessageConverter與內(nèi)容協(xié)商管理器contentNegotiationManager的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-10-10