Advertisement

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

Technology / Community Evangelist at Free lancer
Jun. 1, 2021
Advertisement

More Related Content

Advertisement

Recently uploaded(20)

Advertisement

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

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