動(dòng)態(tài)注冊(cè)之Servlet+Filter+Listener

Java Web中的Servlet+Filter+Listener注冊(cè)方式


  • xml文件注冊(cè)

  • 注解注冊(cè)(Servlet 3.0 +)

  • ServletContext 動(dòng)態(tài)注冊(cè)


Xml文件注冊(cè)

  • Servlet
  <servlet>
        <servlet-name>partServlet</servlet-name>
        <servlet-class>servlet.asyn.PartServlet</servlet-class>
        <async-supported>false</async-supported>
        <multipart-config>
            <location>D:\\project\\servlet-asyn\\target\\servlet-asyn\\upload</location>
        </multipart-config>
        <load-on-startup>0</load-on-startup>
        <init-param>
            <param-name>db</param-name>
            <param-value>mysql</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>partServlet</servlet-name>
        <url-pattern>/ps</url-pattern>
    </servlet-mapping>

async-supported 表示用戶對(duì)Servlet的請(qǐng)求是否為異步處理
multipart-config 表示servlet接收文件上傳時(shí)的配置友酱,location子元素表示文件上傳的位置
load-on-startUp 表示servlet在何時(shí)初始化,Web容器啟動(dòng)時(shí)初始化须揣,還是用戶請(qǐng)求某個(gè)Servlet時(shí)對(duì)其初始化

Servlet_xml.png
  • Filter
<filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>filter.EncodingFilter</filter-class>
        <async-supported>false</async-supported>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

filter 攔截資源是按照 filter-mapping 配置節(jié)出現(xiàn)的順序來(lái)依次調(diào)用 doFilter() 方法的
async-supported 表示用戶對(duì)Filter的請(qǐng)求是否為異步
dispatcher 表示在過(guò)濾用戶的請(qǐng)求時(shí)饱岸,過(guò)濾什么類(lèi)型的請(qǐng)求县昂?Forward,Request,Include培慌,Error凰狞,Async

Filter_xml.png
  • Listener
<listener>
        <listener-class>listener.CustomServletContextListener</listener-class>
    </listener>
Listener_xml.png

注解注冊(cè)(Servlet3.0+)

  • Servlet
@MultipartConfig(location = "D:\\project\\servlet-asyn\\target\\servlet-asyn\\upload")
@WebServlet(asyncSupported = false,
        urlPatterns = {"/ps"},
        loadOnStartup = 0,
        name = "PartServlet",
        initParams = {@WebInitParam(name="db",value="mysql")}
)

對(duì)比上述的注解配置篇裁,便可將xml配置的所有鍵值轉(zhuǎn)化成注解的形式沛慢。

Servlet_annotation.png

如上述代碼:
若想獲取文件上傳的配置MultipartConfig注解的location屬性,即上傳文件的存放位置达布。則在程序中团甲,應(yīng)該使用反射獲取注解的location屬性值。

String locationFile = this.getClass().getAnnotation(MultipartConfig.class).location()
  • Filter
@WebFilter(urlPatterns = {"/*"},
        dispatcherTypes = {DispatcherType.REQUEST},
        asyncSupported = false,
        initParams = {@WebInitParam(name="encoding",value="utf-8")}
)

對(duì)比上述的注解配置往枣,便可將xml配置的所有鍵值轉(zhuǎn)化成注解的形式伐庭。

Filter_annotation.png

在使用Filter的時(shí)候,一定要注意Filter的順序分冈,在注解中圾另,F(xiàn)ilter的過(guò)濾順序是按照過(guò)濾器的Class名稱(chēng)的首字母進(jìn)行排序,而進(jìn)行過(guò)濾

  • Listener
    Listener_annotation.png

ServletContext 動(dòng)態(tài)注冊(cè)

Servlet雕沉,Listener集乔,F(xiàn)ilter由ServletContext去加載,無(wú)論是使用xml配置還是使用Annotation注解配置坡椒,均由Web容器進(jìn)行初始化扰路,讀取其中的配置屬性,然后向Web容器中進(jìn)行注冊(cè)倔叼。Servlet 3.0 可以由ServletContext動(dòng)態(tài)進(jìn)行注冊(cè)汗唱,因此需在Web容器初始化的時(shí)候(即建立ServletContext對(duì)象的時(shí)候)進(jìn)行動(dòng)態(tài)注冊(cè)。

  • 自定義ServletContextListener
  • 改寫(xiě)其方法contextInitialized丈攒,在該方法中動(dòng)態(tài)注冊(cè)Servlet哩罪,F(xiàn)ilter,Listener

  • Servlet
    需要配置Servlet的參數(shù)為:loadOnStartup巡验,urlMapping际插,initParameter,asyncSupport显设,MultipartConfig等框弛。

    Servlet_Dynamic.png

在配置文件上傳的屬性時(shí)注意:

Multipart_Dynamic.png

在Servlet或者其他的業(yè)務(wù)組件中,要想獲取文件的上傳路徑location屬性捕捂,則可以在其動(dòng)態(tài)注冊(cè)的時(shí)候瑟枫,將其放在ServletContext對(duì)象中。因此在接下的Web容器響應(yīng)和請(qǐng)求中指攒,只有容器開(kāi)啟力奋,就可以從ServletContext中獲取到改屬性值。
xml中配置:

<multipart-config>
            <location>/tmp</location>
            <file-size-threshold>10</file-size-threshold>
            <max-file-size>10</max-file-size>
            <max-request-size>10</max-request-size>
</multipart-config>

注解配置:

@MultipartConfig(location = "/tmp",maxFileSize = 10,maxRequestSize = 10,fileSizeThreshold = 1024)

動(dòng)態(tài)注冊(cè)配置:


Multipart_config.png

這三者配置的原理是一樣的幽七,動(dòng)態(tài)注冊(cè)配置中景殷,要想讀取上傳文件的location屬性值,則在動(dòng)態(tài)注冊(cè)時(shí)候?qū)⒃搇ocation值寫(xiě)入ServletContext上下文對(duì)象中,然后在Servlet再次進(jìn)行讀取猿挚。

location 將上傳文件寫(xiě)入服務(wù)器的絕對(duì)路徑
maxFileSize 允許上傳單個(gè)文件的最大值咐旧,默認(rèn)為-1,則表示沒(méi)有限制
maxRequestFileSize 當(dāng)有多個(gè)文件進(jìn)行上傳時(shí)绩蜻,該值表示所有上傳文件總的最大值铣墨。

  • Filter
    Filter_dynamic.png

對(duì)Filter過(guò)濾順序需要注意的是:
1、xml中Filter過(guò)濾順序由Filter配置的節(jié)點(diǎn)順序決定办绝。
2伊约、Annotation中Filter過(guò)濾順序由Filter的類(lèi)名決定的,根據(jù)類(lèi)名進(jìn)行排序孕蝉。
3屡律、動(dòng)態(tài)注冊(cè)Filter中,過(guò)濾順序由isMatchAfter屬性決定降淮。

Filter_Sort.png

該方法有三個(gè)參數(shù):
1超埋、EnumSet<DispatcherType> dispatcherTypes 表示過(guò)濾器攔截的類(lèi)型 Forward,Include佳鳖,Request霍殴,Error,Async
2系吩、boolean isMatchAfter 表示該過(guò)濾器是夠放在當(dāng)前web應(yīng)用中已經(jīng)存在的過(guò)濾器之后来庭,true表示放在當(dāng)前應(yīng)用所有的過(guò)濾器之后,false表示將該過(guò)濾器放在當(dāng)前應(yīng)用所有的過(guò)濾器之前
3穿挨、String... urlPatterns 表示攔截的url

  • Listener
    Listener_dynamic.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末月弛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子絮蒿,更是在濱河造成了極大的恐慌,老刑警劉巖叁鉴,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件土涝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡幌墓,警方通過(guò)查閱死者的電腦和手機(jī)但壮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)常侣,“玉大人蜡饵,你說(shuō)我怎么就攤上這事「焓” “怎么了溯祸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我焦辅,道長(zhǎng)博杖,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任筷登,我火速辦了婚禮剃根,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘前方。我一直安慰自己狈醉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布惠险。 她就那樣靜靜地躺著苗傅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪莺匠。 梳的紋絲不亂的頭發(fā)上金吗,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音趣竣,去河邊找鬼摇庙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛遥缕,可吹牛的內(nèi)容都是我干的卫袒。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼单匣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼夕凝!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起户秤,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤码秉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后鸡号,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體转砖,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年鲸伴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了府蔗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡汞窗,死狀恐怖姓赤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仲吏,我是刑警寧澤不铆,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布蝌焚,位于F島的核電站,受9級(jí)特大地震影響狂男,放射性物質(zhì)發(fā)生泄漏综看。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一岖食、第九天 我趴在偏房一處隱蔽的房頂上張望红碑。 院中可真熱鬧,春花似錦泡垃、人聲如沸析珊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)忠寻。三九已至,卻和暖如春存和,著一層夾襖步出監(jiān)牢的瞬間奕剃,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工捐腿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纵朋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓茄袖,卻偏偏與公主長(zhǎng)得像操软,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宪祥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,859評(píng)論 6 342
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理聂薪,服務(wù)發(fā)現(xiàn),斷路器蝗羊,智...
    卡卡羅2017閱讀 134,711評(píng)論 18 139
  • 本文包括:1藏澳、Filter簡(jiǎn)介2、Filter是如何實(shí)現(xiàn)攔截的耀找?3翔悠、Filter開(kāi)發(fā)入門(mén)4、Filter的生命周期...
    廖少少閱讀 7,282評(píng)論 3 56
  • Servlet 3.0 新特性概述 Servlet 3.0 作為 Java EE 6 規(guī)范體系中一員涯呻,隨著 Jav...
    lovePython閱讀 554評(píng)論 0 5
  • 本章聊一聊ServletContext 3.0規(guī)范中定義的注解以及在web應(yīng)用中使用的框架和庫(kù)的可插拔性的提升凉驻。 ...
    Lucky_Micky閱讀 6,037評(píng)論 0 3