1
5
• Servlet 進階 API、過濾器
與傾聽器
學習目標
• 了解 Servlet 生命週期
• 使用 ServletConfig 與
ServletContext
• 使用 PushBuilder
• 各種傾聽器的使用
• 繼承 HttpFilter 實作過濾器
2
Servlet 介面
• init()
• service()
• destroy()
3
ServletConfig 介面
4
Servlet 類別架構圖
5
GenericServlet 類別
• 將初始 Servlet 呼叫 init()方法傳入的
ServletConfig 封裝起來
• 有一些初始時所要執行的動作,可以重新定
義這個無參數的 init()方法
6
GenericServlet 類別
• 包括了 Servlet 與 ServletConfig 定義
方法的簡單實作
7
使用 ServletConfig
• 使用標註設定個別 Servlet 的初始參數
8
使用 ServletConfig
• 在 web.xml 設定個別 Servlet 的初始參數
9
使用 ServletConfig
• GenericServlet 定義了一些方法,將
ServletConfig 封裝起來,便於取得設定
資訊
10
11
使用 ServletConfig
• 如果 web.xml 的設定要覆蓋標註設定,
<servlet-name> 的設定必須與
@WebServlet 的 name 屬性相同
• 不設定 name 屬性,預設是類別完整名稱
12
使用 ServletConfig
13
ServletContext 介面
• 定義了運行 Servlet 的應用程式環境的一些行
為與觀點
• 整個 Web 應用程式載入 Web 容器之後,容
器會生成一個 ServletContext 物件作為
整個應用程式的代表
• 透過 ServletConfig 的
getServletContext()方法就可以取得
14
使用 ServletContext
• getRequestDispatcher()
• getResourcePaths()
15
使用 ServletContext
• getResourceAsStream()
– 在 3.3.3 節中有個讀取 PDF 的範例
16
使用 PushBuilder
• Servlet 4.0 規範中制訂了對 HTTP/2 的支援,
在伺服器推送上,提供了PushBuilder
17
使用 PushBuilder
18
ServletContextListener
• 想得知何時 Web 應用程式已經初始化或即將
結束銷毀
19
ServletContextListener
20
ServletContextListener
• 在Servlet 3.0 之前,
ServletContextListener 實作類別,必
須在 web.xml 設定
21
ServletContextListener
• 有些應用程式的設定,必須在 Web 應用程式
初始時進行
22
ServletContextListener
• 在應用程式初始化時,也可以實作
ServletContextListener 進行 Servlet、
過濾器等的建立、設定與註冊
• 好處是給予 Servlet、過濾器等更多設定上的
彈性
23
ServletContextListener
24
ServletContextAttributeListener
25
HttpSessionListener
26
HttpSessionListener
27
HttpSessionListener
28
HttpSessionAttributeListener
29
HttpSessionBindingListener
• 讓即將加入 HttpSession 的屬性物件實作,
不需註釋或在 web.xml 設定
30
HttpSessionAttributeListener
31
HttpSessionIdListener
• Servlet 3.1 新增
• HttpSession 的 Session ID 發生變化時,
就會呼叫 sessionIdChanged()方法
32
請求相關的傾聽器
• ServletRequestListener
• ServletRequestAttributeListener
• AsyncListener
• ReadListener
33
過濾器的概念
• 針對所有的 Servlet,產品經理想要了解從請求到回
應之間的時間差。
• 針對某些特定的頁面,客戶希望只有特定幾個使用
者才可以瀏覽。
• 基於安全性的考量,使用者輸入的特定字元必須過
濾並替換為無害的
• 字元。
• 請求與回應的編碼從 Big5 改用 UTF-8。
• …
34
過濾器的概念
• 執行 Servlet 的 service()方法「前」,記錄超始
時間,Servlet 的 service()方法執行「後」,記
錄結束時間並計算時間差。
• 執行 Servlet 的 service()方法「前」,驗證是否
為允許的使用者。
• 執行 Servlet 的 service()方法「前」,對請求參
數進行字元過濾與替換。
• 執行 Servlet 的 service()方法「前」,對請求與
回應物件設定編碼。
• …
35
過濾器的概念
36
過濾器的概念
37
過濾器的概念
38
實作與設定過濾器
39
實作與設定過濾器
• FilterChain 的 doFilter() 實作概念
40
GenericFilter 與 HttpFilter
• Servlet 4.0 新增
41
42
43
44
實作與設定過濾器
45
實作與設定過濾器
• 在過濾器的請求套用上,除了指定 URL 模式
之外,也可以指定 Servlet 名稱,這可以透過
@WebServlet 的 servletNames 設定
46
初始參數設定
47
48
觸發過濾器的時機
• 預設是瀏覽器直接發出請求
49
50
請求包裹器
• 實作字元替換過濾器
<a href="http://openhome.cc">OpenHome.cc</a>
51
請求包裹器
52
53
&lt;a href=&#34;http://openhome.cc&#34;&gt;Openhome.cc&lt;/a&gt;
54
55
56
57
回應包裹器
58
實作壓縮過濾器
59
60
61
62
簡介 AsyncContext
• 在 Servlet 3.0 中,ServletRequest 提供了
startAsync()方法
• 呼叫了 startAsync()方法取得
AsyncContext 物件之後,此次請求的回應
會被延後,並釋放容器分配的執行緒
63
簡介 AsyncContext
• getRequest()
• getResponse()
• complete()
• dispatch()
64
簡介 AsyncContext
• 必須告知容器此 Servlet 支援非同步處理
65
簡介 AsyncContext
• 若其前端有過濾器,則過濾器亦需標示其支
援非同步處理
66
67
68
綜合練習/微網誌
• 先停下來檢討目前的應用程式,有哪些維護
上的問題
• 在不改變目前應用程式的功能下,程式碼必
須作出哪些調整
• 讓每個程式碼職責上變得更為清晰,對於將
來的維護更有幫助
69

Ch05 Servlet 進階 API、過濾器與傾聽器