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ì)其初始化
- 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
- Listener
<listener>
<listener-class>listener.CustomServletContextListener</listener-class>
</listener>
注解注冊(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)化成注解的形式沛慢。
如上述代碼:
若想獲取文件上傳的配置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的時(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í)注意:
在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è)配置:
這三者配置的原理是一樣的幽七,動(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屬性決定降淮。
該方法有三個(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