Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

64

description

Servlet & JSP 教學手冊第二版

Transcript of Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

Page 1: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Page 2: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

CHAPTER 5

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

學習目標

• 了解Servlet生命週期

• 使用ServletConfig

與ServletContext

• 各種傾聽器的使用

• 實作Filter介面來開發過濾器

Page 3: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

Servlet介面

• init()

• service()

• destroy()

Page 4: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

ServletConfig介面

Page 5: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

Servlet類別架構圖

Page 6: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

GenericServlet類別

• 將初始Servlet呼叫init()方法傳入的ServletConfig封裝起來

• 有一些初始時所要執行的動作,可以重新定義這個無參數的init()方法

Page 7: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

GenericServlet類別

•包括了Servlet與ServletConfig定義方

法的簡單實作

Page 8: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

使用ServletConfig

• 使用標註設定個別Servlet的初始參數

Page 9: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

使用ServletConfig

• 在web.xml中設定個別Servlet的初始參數

Page 10: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

使用ServletConfig

• GenericServlet定義了一些方法,將ServletConfig封裝起來,便於取得設定資訊

Page 11: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Page 12: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

使用ServletConfig

• 如果web.xml中的設定要覆蓋標註設定,<servlet-name>的設定必須與@WebServlet的name屬性相同

• 如果不設定name屬性,預設是類別完整名稱

Page 13: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

使用ServletConfig

Page 14: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

ServletContext介面

• 定義了運行Servlet的應用程式環境的一些行為與觀點

• 整個Web應用程式載入Web容器之後,容器會生成一個ServletContext物件作為整個

應用程式的代表

• 透過ServletConfig的getServletContext()方法就可以取得

Page 15: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

使用ServletContext

• getRequestDispatcher()

• getResourcePaths()

Page 16: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

使用ServletContext

• getResourceAsStream()

– 在3.3.3節中有個讀取PDF的範例

Page 17: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

ServletContextListener

• 想得知何時Web應用程式已經初始化或即將結束銷毀

Page 18: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

ServletContextListener

Page 19: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

ServletContextListener

• 在Servlet 3.0之前,ServletContextListener實作類別,必

須在web.xml中設定

Page 20: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

ServletContextListener

• 有些應用程式的設定,必須在Web應用程式初始時進行

Page 21: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

ServletContextAttributeListener

Page 22: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

HttpSessionListener

Page 23: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

HttpSessionListener

Page 24: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

HttpSessionListener

Page 25: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

HttpSessionAttributeListener

Page 26: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

HttpSessionAttributeListener

• 讓即將加入HttpSession的屬性物件實作,

不需註釋或在web.xml中設定

Page 27: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

HttpSessionAttributeListener

Page 28: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

請求相關的傾聽器

• ServletRequestListener

• ServletRequestAttributeListener

• AsyncListener

Page 29: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

過濾器的概念

• 針對所有的Servlet,產品經理想要了解從請求到回應之間的時間差。

• 針對某些特定的頁面,客戶希望只有特定幾個使用者才可以瀏覽。

• 基於安全性的考量,使用者輸入的特定字元必須過濾並替換為無害的

• 字元。

• 請求與回應的編碼從Big5改用UTF-8。

• …

Page 30: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

過濾器的概念 • 執行Servlet的service()方法「前」,記錄超始時間,Servlet的service()方法執行「後」,記錄結束時間並計算時間差。

• 執行Servlet的service()方法「前」,驗證是否為允許的使用者。

• 執行Servlet的service()方法「前」,對請求參數進行字元過濾與替換。

• 執行Servlet的service()方法「前」,對請求與回應物件設定編碼。

• …

Page 31: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

過濾器的概念

Page 32: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

過濾器的概念

Page 33: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

過濾器的概念

Page 34: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

實作與設定過濾器

Page 35: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

實作與設定過濾器

• FilterChain的doFilter()實作概念

Page 36: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Page 37: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

實作與設定過濾器

Page 38: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

實作與設定過濾器

• 在過濾器的請求套用上,除了指定URL模式之外,也可以指定Servlet名稱,這可以透過@WebServlet的servletNames來設定

Page 39: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

初始參數設定

Page 40: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Page 41: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

觸發過濾器的時機

• 預設是瀏覽器直接發出請求

Page 42: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Page 43: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

請求包裹器

• 實作字元替換過濾器

<a href="http://openhome.cc">OpenHome.cc</a>

Page 44: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

請求包裹器

Page 45: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Page 46: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

&lt;a href=&quot;http://openhome.cc&quot;&gt;OpenHome.cc&lt;/a&gt;

Page 47: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

實作編碼設定過濾器

Page 48: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Page 49: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

回應包裹器

Page 50: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

實作壓縮過濾器

Page 51: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Page 52: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Page 53: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Page 54: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Page 55: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Page 56: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

簡介AsyncContext

• 在Servlet 3.0中,在ServletRequest上提供了startAsync()方法

•呼叫了startAsync()方法取得AsyncContext物件之後,此次請求的回應

會被延後,並釋放容器分配的執行緒

Page 57: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

簡介AsyncContext

• getRequest()

• getResponse()

• complete()

• dispatch()

Page 58: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

簡介AsyncContext

• 必須告知容器此Servlet支援非同步處理

Page 59: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

簡介AsyncContext

• 若其前端有過濾器,則過濾器亦需標示其支援非同步處理

Page 60: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

簡介AsyncContext

Page 61: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

簡介AsyncContext

Page 62: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

模擬伺服器推播

Page 63: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Page 64: Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器

綜合練習/微網誌

• 先停下來檢討目前的應用程式,有哪些維護上的問題

• 在不改變目前應用程式的功能下,程式碼必須作出哪些調整

• 讓每個程式碼職責上變得更為清晰,對於將來的維護更有幫助