程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 我的Java之旅 第八課 Servlet 進階API、過濾器與監聽器

我的Java之旅 第八課 Servlet 進階API、過濾器與監聽器

編輯:關於JAVA

我的Java之旅 第八課 Servlet 進階API、過濾器與監聽器。本站提示廣大學習愛好者:(我的Java之旅 第八課 Servlet 進階API、過濾器與監聽器)文章只能為提供參考,不一定能成為您想要的結果。以下是我的Java之旅 第八課 Servlet 進階API、過濾器與監聽器正文


1、Servlet、ServletConfig與GenericServlet     首次請求的順序      => 生成HttpServletRequest與HttpServletResponse      =>調用service()方法,以前邊兩個對象作為參數       =>Web容器啟動,        =>讀取Servlet設置信息,實例化Servlet類          =>為每個Servlet設置信息產生一個ServletConfig對象。            =>調用Servlet接口的init()方法,以產生的ServletConfig對象作為參數。        完成初始化。       說明:容器會為每個Servlet設置信息產生一個Servlet及ServletConfig實例,GenericServlet同時實現了Servlet及Servlet-Config。           GenericServlet主要的目的,就是將初始Servlet調用init()方法傳入的ServletConfig封裝起來。           GenericServlet在實現Servlet的init()方法時,也調用了另一個無參數的init()方法,在編寫Servlet()時,如果有一些初始時所要運行的動作,可以重新定義這個無參數的init()方法,而不是直接重新定義有ServletConfig參數的init()方法。          GenericServlet也包括了Servlet和ServletConfig所定義方法的簡單實現,實現內容主要是通過ServletConfig來取得一些相關信息。所以在繼承HttpServlet實現Servlet時,就可以通過這些方法來取得所要的相關信息,而不是直接意識到ServletConfig的存在。 2、使用ServletConfig      可以從ServletConfig中取得Servlet設置信息。      getinitparameter()、getInitParameterNames() 可以取得Servlet時的初始參數。      若要設置個別Servlet的初始參數,可以在@WebServlet中使用@WebInitParam設置initParams屬性。在web.xml中設置參數使用<init-param>等標簽進行設置。web.xml中設置會覆蓋標注的設置 。 3、使用ServletContext     ServletContext接口定義了運行Servlet的應用程序環境的一些行為與觀點,可以使用ServletContext實現對象取得所請求資源的URL、設置與儲存屬性、應用程序初始參數,甚至動態設置Servlet實例。    通過ServletConfig的getServletContext()方法取得ServletContext對象。    1)getRequestDispatcher()        取得RequestDispatcher實例,使用時路徑的指定必須以“/”開頭,這個斜槓代表應用程序環境根目錄(Context Root)。    2)getResourcePaths()     取得Web應用程序的某個目錄中有哪些文件,使用時路徑的指定必須以“/”開頭。    3)getResourceAsStream()        取得Web應用程序的某個目錄中文件的內容,運行結果返回InputStream實例,使用時路徑的指定必須以“/”開頭。   每個Web應用程序都會有一個相對應的ServletContext,針對“應用程序”初始化時用到的參數,可以在Web.xml設置,通常這會結合ServletContextListener來做。 4、監聽器     ServletContext監聽器    1)ServletContextListener      生命周期監聽器。在Web應用程序初始化後或即將結束銷毀前分別調用contextInitialized()和contextDestroyed()方法。    2)ServletContextAttributeListener     監聽屬性改變的監聽器。如果想要對象被設置、移除或替換ServletContext屬性時,可以收到通知以進行一些操作,則可以實現ServletContextAttributeListener。對應方法有attributeAdded()、attributeRemoved()與attributeReplaced()。通過傳入的參數可以調用一些方法,如getName(),getValue()等得到屬性名稱和值等。    HttpSession監聽器   3)HttpSessionListener      生命周期監聽器。在HttpSession對象創建或結束時,調用sessionCreated()與sessionDestroyed()。     可以使用傳入的參數HttpSessionEvent實例的getSession()方法取得HttpSession實例,以針對Session對象作出創建或者結束等操作。   4)HttpSessionAttributeListener    屬性改變監聽器。具體同2)        5 )HttpSessionBindingListener   對象綁定監聽器。當實現此接口的類對象被加入HttpSession或者從中移除時,調用對應的valueBound()和valueUnbound()方法,以HttpSessionBindingEvent 對象作為參數。   6)HttpSessionActivationListener  對象遷移監聽器。一般情況不會用到該監聽器,在分布式環境時,應用程序對象可能分散在多個JVM中。當HttpSession從一個JVM遷移至別一個JVM時,涉及到序列化操作,這時就會調用sessionWillPassivate()和sessionDidActivate()。   HttpServletReques監聽器
  7)ServletRequestListener   生命周期監聽器。在HttpServletRequest對象創建或結束時,調用requestInitialized()與requestDestroyed()。以ServletRequestEvent對象為參數,通過參數可取得ServletRequest,以針對請求對象做出相應初始化和結束操作。   8)ServletRequestAttributeListener   屬性改變監聽器。具體同2)      5、過濾器    過濾器介於Servlet的service()之前,可攔截過濾浏覽器對Servlet的請求,過濾器介於Servlet的service()之後,可以改變Servlet對浏覽器的響應。    在Servlet/JSP中要實現過濾器,必須實現Filter接口,並使用@WebFilter標注或web.xml中定義過濾器,讓容器知道該加載哪些過濾器。web.xml中的設置會覆蓋標的設置。    Filter接口有三個要實現的方法:init(FilterConifg filterConfig)、doFilter(ServletRequest request)、destroy()。    FilterConifg類似於Servlet接口init()方法參數上的ServletConfig    doFilter方法則類似於Servlet接口的service()方法。可以在doFilter方法中進行service()方法的前置處理。然後決定是否調用FilterChain的doFilter()方法。調用 了FilterChain的doFilter()方法後,運行下一個過濾器,如果沒有了,就調用Servlet的service()方法。   如果因為某種情況沒有調用FilterChain的doFilter(),則請求就不會繼續交給接下來的過濾器或目標Servlet,這時就是所謂的攔截了請求。   默認是浏覽器發出請求觸發過濾器,如果是通過RequestDispatcher的forward()或include()的請求,可設置@WebFilter的dispatcherTypes。 6、封裝器    HttpServletRequestWrapper   請求封裝器  應用場景,如:實現留言板字符替換的功能;實現編碼統一設置的功能  HttpServletResponseWrapper 響應封裝器  應用場景,如:對響應的內容進行壓縮再發送; 7、異步處理    Web容器會為每一個請求分配一個線程,並且默認情況下,響應完成前,該線程占用的資源不會被釋放。    在Servlet3.0中,在ServletRequest上提供了startAsync()方法。分無參和有參兩個重載,這兩個方法都會返回AsyncContext接口的實現對象;無參的會直接利用原有的請求與響應對象來創建AsyncContext,有參的可以傳入自行創建的請求、響應封裝對象。    在調用了startAsync()方法取得AsyncContext對象之後,此次請求的響應會被延後,並釋放容器分配的線程。    可以通過AsyncContext的getRequest()、getResponse()方法取得請求、響應對象,此次對客戶端的響應將暫緩至調用AsyncContext的complete()或dispatch()方法為止。    對於延後響應的請求,創建一個實現Runnable接口的AsyncRequest對象,並將其調度一個線程池(Thread pool),線程池的線程數是固定的,讓這些必須長時間處理的請求,在這些有限數量的線程中完成,而不是每次請求都占用容器分配的線程。    若要能調用ServletRequest的startAsync()以取得AsyncContext,必須告知容器此Servlet支持異步處理,可以通過@WebServlet標注或web.xml設置。    如果Servlet要進行異步處理,而前端有過濾器,則過濾器也需要標識為支持異步處理。同樣可通過@WebServlet標注或web.xml設置。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved