pe框架簡(jiǎn)介2--web.xml

當(dāng)我們啟動(dòng)一個(gè)WEB項(xiàng)目容器時(shí),容器包括(JBoss,Tomcat等)。首先會(huì)去讀取web.xml配置文件里的配置,當(dāng)這一步驟沒有出錯(cuò)并且完成之后,項(xiàng)目才能正常的被啟動(dòng)起來。

web.xml 配置文件 超詳細(xì)說明?。?!

web.xml的加載過程配置詳解

1、web.xml?

加載順序?yàn)椋篶ontext-param -> listener -> filter -> servlet

其中,如果web.xml中出現(xiàn)了相同的元素,則按照在配置文件中出現(xiàn)的先后順序來加載。

(1) context-param

配置的是整個(gè)web應(yīng)用的上下文初始化參數(shù),詳見?SpringMVC配置文件(傳統(tǒng)xml配置)詳解

如果想要獲得參數(shù)值,可以在servlet中調(diào)用: getServletConfig().getServletContext().getInitParameter(); 在web應(yīng)用部署完成以后,值沒法改變。

(2) listener

監(jiān)聽器就是在application,session,request三個(gè)對(duì)象創(chuàng)建,銷毀,或者往其中添加修改刪除屬性時(shí)自動(dòng)執(zhí)行代碼的功能組件。Listener是Servlet的監(jiān)聽器,可以監(jiān)聽客戶端的請(qǐng)求,服務(wù)端的操作等。詳見Listener監(jiān)聽器

監(jiān)聽器 - session 銷毀

Listener的分類

1)ServletContextListener接口:用于對(duì)Servlet整個(gè)上下文進(jìn)行監(jiān)聽(創(chuàng)建,銷毀)。

Spring提供ServletContextListener接口的一個(gè)實(shí)現(xiàn)類ContextLoaderListener監(jiān)聽器,該類可以作為L(zhǎng)istener使用,在啟動(dòng)Tomcat容器的時(shí)候,該類的作用就是自動(dòng)裝載ApplicationContext的配置信息,如果沒有設(shè)置contextConfigLocation的初始參數(shù)則會(huì)使用默認(rèn)參數(shù)WEB-INF路徑下的application.xml文件。如果需要自定義讀取多個(gè)配置文件或者修改默認(rèn)路徑,則可以在web.xml中設(shè)置。

ContextLoaderListener會(huì)讀取這些XML文件并產(chǎn)生WebApplicationContext對(duì)象,然后將這個(gè)對(duì)象放置在ServletContext的屬性里,這樣只要我們得到Servlet就可以得到WebApplicationContext對(duì)象,并利用這個(gè)對(duì)象訪問spring容器管理的bean。詳見?SpringMVC配置文件(傳統(tǒng)xml配置)詳解

2)HttpSessionListener接口:對(duì)session的整體狀態(tài)的監(jiān)聽。

以下兩種情況下就會(huì)發(fā)生sessionDestoryed(會(huì)話銷毀)事件:?

? 1.執(zhí)行session.invalidate()方法時(shí)。 ---不會(huì)調(diào)用sessionDestoryed??只清除session對(duì)象中的所有信息,清除指定屬性信息用removeAttribute()。例如:session.setAttribute("name", "iverson");session.removeAttribute("name");

? 2.如果用戶長(zhǎng)時(shí)間沒有訪問服務(wù)器,超過了會(huì)話最大超時(shí)時(shí)間,服務(wù)器就會(huì)自動(dòng)銷毀超時(shí)的session。

? 設(shè)置Session有效時(shí)間的三種方式

session-config?用于設(shè)置容器的session參數(shù),比如:<session-timeout>用于指定http session的失效時(shí)間。默認(rèn)時(shí)間設(shè)置(30minutes)。用來指定默認(rèn)的會(huì)話超時(shí)時(shí)間間隔,以分鐘為單位。該元素值為整數(shù)。如果session-timeout元素的值為零或負(fù)數(shù),則表示會(huì)話將永遠(yuǎn)不會(huì)超時(shí)。也可通過使用HttpSession的setMaxInactiveInterval方法明確設(shè)置單個(gè)會(huì)話對(duì)象的超時(shí)值(此時(shí)單位是秒)。

(3)直接在應(yīng)用服務(wù)器中設(shè)置,如果是tomcat,可以在tomcat目錄下conf/web.xml中找到元素,tomcat默認(rèn)設(shè)置是30分鐘,只要修改這個(gè)值就可以了。

Ps:優(yōu)先級(jí):(1)>(2)>(3)。

3)ServletRequestListener:用于對(duì)Request請(qǐng)求進(jìn)行監(jiān)聽(創(chuàng)建,銷毀)。?

(3) filter

Filter可認(rèn)為是Servlet的一種“變種”,它主要用于對(duì)用戶請(qǐng)求(HttpServletRequest)進(jìn)行預(yù)處理,也可以對(duì)服務(wù)器響應(yīng)(HttpServletResponse)進(jìn)行后處理,是個(gè)典型的處理鏈。它與Servlet的區(qū)別在于:它不能直接向用戶生成響應(yīng)。完整的流程是:Filter對(duì)用戶請(qǐng)求進(jìn)行預(yù)處理,接著將請(qǐng)求交給Servlet進(jìn)行處理并生成響應(yīng),最后Filter再對(duì)服務(wù)器響應(yīng)進(jìn)行后處理。詳見JavaWeb中filter的詳解及應(yīng)用案例

WEB開發(fā)人員通過Filter技術(shù),對(duì)web服務(wù)器管理的所有web資源:例如Jsp, Servlet, 靜態(tài)圖片文件或靜態(tài) html 文件等進(jìn)行攔截,從而實(shí)現(xiàn)一些特殊的功能。例如實(shí)現(xiàn)URL級(jí)別的權(quán)限訪問控制、過濾敏感詞匯、壓縮響應(yīng)信息等一些高級(jí)功能。

filter-mapping即過濾器映射。過濾器可被映射到一個(gè)servlet或一個(gè)URL模式。將過濾器映射到一個(gè)servlet中會(huì)造成過濾器作用于servlet上。將過濾器映射到一個(gè)URL模式中則可以將過濾器應(yīng)用于任何資源,只要該資源的URL與URL模式匹配。

< filter-name>Filter的名稱< /filter-name>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?------定義Filter的名稱

< url-pattern>URL< /url-pattern>? ? ? ? ? ? ---Filter所對(duì)應(yīng)的URL.例如:< url-pattern>/Filter/Hello< /url-pattern>

< servlet-name>Servlet的名稱< servlet-name>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -----定義servlet的名稱

< dispatcher>REQUEST|INCLUDE|FORWARD|ERROR< /dispatcher>

設(shè)定Filter對(duì)應(yīng)的請(qǐng)求方式,有RQUEST,INCLUDE,FORWAR,ERROR四種,默認(rèn)為REQUEST

Filter接口中有一個(gè)doFilter方法,當(dāng)開發(fā)人員編寫好Filter類實(shí)現(xiàn)doFilter方法,并配置對(duì)哪個(gè)web資源進(jìn)行攔截后,WEB服務(wù)器每次在調(diào)用web資源的service方法之前(服務(wù)器內(nèi)部對(duì)資源的訪問機(jī)制決定的),都會(huì)先調(diào)用一下filter的doFilter方法。

Filter的生命周期和Servlet一樣,F(xiàn)ilter的創(chuàng)建和銷毀也是由WEB服務(wù)器負(fù)責(zé)。不過與Servlet區(qū)別的是,它是1>在應(yīng)用啟動(dòng)的時(shí)候就進(jìn)行裝載Filter類(與Servlet的load-on-startup配置效果相同)。2>容器創(chuàng)建好Filter對(duì)象實(shí)例后,調(diào)用init()方法。接著被Web容器保存進(jìn)應(yīng)用級(jí)的集合容器中去了等待著,用戶訪問資源。3>當(dāng)用戶訪問的資源正好被Filter的url-pattern攔截時(shí),容器會(huì)取出Filter類調(diào)用doFilter方法,下次或多次訪問被攔截的資源時(shí),Web容器會(huì)直接取出指定Filter對(duì)象實(shí)例調(diào)用doFilter方法(Filter對(duì)象常駐留Web容器了)。4>當(dāng)應(yīng)用服務(wù)被停止或重新裝載了,則會(huì)執(zhí)行Filter的destroy方法,F(xiàn)ilter對(duì)象銷毀。注意:init方法與destroy方法只會(huì)直接一次。

(4) servlet

Servlet通常稱為服務(wù)端小程序,是服務(wù)端的程序,用于處理及響應(yīng)客戶的請(qǐng)求。Servlet是一個(gè)特殊的Java類,創(chuàng)建Servlet類自動(dòng)繼承HttpServlet??蛻舳送ǔV挥蠫ET和POST兩種請(qǐng)求方式,Servlet為了響應(yīng)這兩種請(qǐng)求,必須重寫doGet()和doPost()方法。大部分時(shí)候,Servlet對(duì)于所有的請(qǐng)求響應(yīng)都是完全一樣的,此時(shí)只需要重寫service()方法即可響應(yīng)客戶端的所有請(qǐng)求。

創(chuàng)建Servlet實(shí)例有兩個(gè)時(shí)機(jī):

  客戶端第一次請(qǐng)求某個(gè)Servlet時(shí),系統(tǒng)創(chuàng)建該Servlet的實(shí)例,大部分Servlet都是這種Servlet;

  web應(yīng)用啟動(dòng)時(shí)立即創(chuàng)建Servlet實(shí)例,即<load-on-start>1</laod-on-start>(實(shí)例化并調(diào)用其init()方法)。

? ? ? (一般不會(huì)被容器銷毀,它可以服務(wù)于多個(gè)用戶的請(qǐng)求)

每個(gè)Servlet的運(yùn)行都遵循如下生命周期:

(1)創(chuàng)建Servlet實(shí)例。

(2)Web容器調(diào)用Servlet的init()方法,對(duì)Servlet進(jìn)行初始化。

(3)Servlet初始化之后,將一直存在與容器之中,用于響應(yīng)客戶端請(qǐng)求,如果客戶端發(fā)送GET請(qǐng)求,容器調(diào)用? ? ? Servlet的doGet()方法處理并響應(yīng)請(qǐng)求;如果客戶端發(fā)送POST請(qǐng)求,容器調(diào)用Servlet的doPost()方法處理并響應(yīng)請(qǐng)? 求?;蛘呓y(tǒng)一使用service()方法處理來響應(yīng)用戶請(qǐng)求。

(4)Web容器決定銷毀Servlet時(shí),先調(diào)用Servlet的destory()方法,通常在關(guān)閉Web應(yīng)用時(shí)銷毀Servlet實(shí)例。

Servlet的配置:

  為了讓Servlet能響應(yīng)用戶請(qǐng)求,還必須將Servlet配置在web應(yīng)用中,配置Servlet需要修改web.xml文件。從Servlet3.0開始,配置Servlet有兩種方式:

 ?。?)在Servlet類中使用基于注解的方式進(jìn)行配置:@WebServlet

 ?。?)在web.xml文件中進(jìn)行配置。


?????init-param:配置的key/value會(huì)被設(shè)置到該servlet對(duì)應(yīng)的servletConfig對(duì)象。ServletConfig提供方法:java.lang.String.getInitParameter(java.lang.String name):用于獲取初始化參數(shù)。

注意:不同于ServletContxt,每個(gè)servlet 都會(huì)有自己的servletConfig。部署完成后,參數(shù)值不能變。 ServletConfig獲取配置參數(shù)的方法和ServletContext獲取配置參數(shù)的方法完全一樣,只是ServletConfig是取得當(dāng)前Servlet的配置參數(shù),而ServletContext是獲取整個(gè)web應(yīng)用的配置參數(shù)。

? ? ? ?load-on-startup:用來確定servlet的加載時(shí)間。如果未設(shè)置或者為負(fù)數(shù),則在該servlet對(duì)應(yīng)的第一個(gè)用戶請(qǐng)求到來時(shí),才加載servlet類,并調(diào)用init()。如果為正數(shù)或者0,則在web應(yīng)用部署后就加載servlet。其數(shù)字的大小又標(biāo)識(shí)了加載的順序,值越小越早被加載,如果值相等,就先在web.xml聲明的先加載。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容