一、對於servlet3.0特性的總結:
Servlet 3.0 作為 Java EE 6 規範體系中一員,隨著 Java EE 6 規範一起釋出。該版本在前一版本(Servlet 2.5)的基礎上提供了若干新特性用於簡化 Web 應用的開發和部署。
- 非同步處理支援: 有了該特性,Servlet 執行緒不再需要一直阻塞,直到業務處理完畢才能再輸出響應,最後才結束該 Servlet 執行緒。在接收到請求之後,Servlet 執行緒可以將耗時的操作委派給另一個執行緒來完成,自己在不生成響應的情況下返回至容器。針對業務處理較耗時的情況,這將大大減少伺服器資源的佔用,並且提高併發處理速度。
- 新增的註解支援:該版本新增了若干註解,用於簡化 Servlet、過濾器(Filter)和監聽器(Listener)的宣告,這使得 web.xml 部署描述檔案從該版本開始不再是必選的了。
- 可插性支援:熟悉 Struts2 的開發者一定會對其通過外掛的方式與包括 Spring 在內的各種常用框架的整合特性記憶猶新。將相應的外掛封裝成 JAR 包並放在類路徑下,Struts2 執行時便能自動載入這些外掛。現在 Servlet 3.0 提供了類似的特性,開發者可以通過外掛的方式很方便的擴充已有 Web 應用的功能,而不需要修改原有的應用。
下面主要探討一下servlet3.0用註解的方式,配置servlet、listener、filter
1.配置servlet:
首先,我們用eclipse建立servlet:如下圖
在Servlet3.0中,可以使用@WebServlet註解將一個繼承於javax.servlet.http.HttpServlet的類標註為可以處理使用者請求的Servlet。
@WebServlet註解的相關屬性 | ||
NO. | 屬性名 | 描述 |
1 | asyncSupported | 宣告Servlet是否支援非同步操作模式 |
2 | description | Servlet的描述資訊 |
3 | displayName | Servlet的顯示名稱 |
3 | initParams | Servlet的初始化引數 |
5 | name | Servlet的名稱 |
6 | urlPatterns | Servlet的訪問URL |
7 | value | Servlet的訪問URL |
Servlet的訪問URL是Servlet的必選屬性,可以選擇使用urlPatterns或者value定義。
像上面的Servlet3Demo可以描述成@WebServlet(name="Servlet3Demo",value="/Servlet3Demo")。
也定義多個URL訪問:
如@WebServlet(name="Servlet3Demo",urlPatterns={"/Servlet3Demo","/Servlet3Demo2"})
或者@WebServlet(name="AnnotationServlet",value={"/Servlet3Demo","/Servlet3Demo2"})
2.如何配置listener:
3.配置filter
但是當我們使用@WebFilter註解的時候發現註解裡面沒有提供可以控制執行順序的引數
@WebFilter 的屬性
屬性名 | 型別 | 描述 |
---|---|---|
filterName | String | 指定過濾器的 name 屬性,等價於 <filter-name> |
value | String[] | 該屬性等價於 urlPatterns 屬性。但是兩者不應該同時使用。 |
urlPatterns | String[] | 指定一組過濾器的 URL 匹配模式。等價於 <url-pattern> 標籤。 |
servletNames | String[] | 指定過濾器將應用於哪些 Servlet。取值是 @WebServlet 中的 name 屬性的取值,或者是 web.xml 中 <servlet-name> 的取值。 |
dispatcherTypes | DispatcherType | 指定過濾器的轉發模式。具體取值包括: ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。 |
initParams | WebInitParam[] | 指定一組過濾器初始化引數,等價於 <init-param> 標籤。 |
asyncSupported | boolean | 宣告過濾器是否支援非同步操作模式,等價於 <async-supported> 標籤。 |
description | String | 該過濾器的描述資訊,等價於 <description> 標籤。 |
displayName | String | 該過濾器的顯示名,通常配合工具使用,等價於 <display-name> 標籤。 |
通過實踐發現如果想要控制filer的執行順序可以通過控制filter的檔名來控制
比如:
UserLoginFilter.java 和 ApiLog.java 這兩個檔案裡面分別是“使用者登入檢查過濾器”和“介面日誌過濾器”,因為這兩個檔案的首字母A排U之前,導致每次執行的時候都是先執行“介面日誌過濾器”再執行“使用者登入檢查過濾器”,所以我們現在修改兩個檔案的名稱分別為
Filter0_UserLogin.java
Filter1_ApiLog.java
這樣就能先執行“使用者登入檢查過濾器”再執行“介面日誌過濾器”
參考部落格: