Servlet知識點

1.須要掌握Servlet,Filter以及Listener各自的用途及最佳使用場合java

2.Servlet的生命週期 *補充圖
服務器加載servlet——servlet構造函數——@PostConstruct修飾的方法——init()方法——service()方法——destroy()方法——@PreDestroy修飾的方法——服務器卸載servlet完畢。web

3.Servlet之間的跳轉
Servlet的跳轉能夠實現程序模塊化。MVC框架中都使用了servlet跳轉。其中有轉向、重定向和自動刷新瀏覽器

     ...3.1轉向(Forward):
      轉向(Forward)是經過RequestDispatcher對象的forward()方法實現的。
          ...3.1.1 RequestDispatcher的得到方法
          1)HttpServletRequest.getRequestDispatcher()
          2)ServletContext.getRequestDispatcher()
          ...3.1.2 RequestDispatcher的參數說明
         其中的參數必須以/開始,/表示本webApp的根目錄。能夠Forward到servlet、jsp頁面,甚至能夠跳轉到另一個文件或WEB-INF文件夾下的文件。
  
    ...3.2重定向(Redirect):
      重定向(Redirect)是利用服務器返回的狀態碼實現的。客戶端瀏覽器請求服務器時,服務器端會返回一個狀態碼。服務器端經過response的setStatus()方法設置狀態碼
          ...3.2.1 狀態碼:
          200表示一切正確; 30一、302表示該資源已不存在或換了地址,客戶端需重定向到一個新的資源,服務器響應中會附帶這個新資源地址;401表示沒有權限訪問;404表示資源不存在;
          ...3.2.2 獲取方法
          1)HttpServletResponse.setStatus() + HttpServletResponse.setHeader()
              其中,setStatus用來設置狀態碼,而setHeader用來設置新資源的地址
          2)HttpServletResponse.sendRedirect(),其實 HttpServletResponse.sendRedirect()=             HttpServletResponse.setStatus() + HttpServletResponse.setHeader()
  
     ...3.3 自動刷新(Refresh):
      不只能夠實現一段時間後自動跳轉到另外一個頁面,還能夠實現一段時間後自動刷新本頁面,如:安全

      response.setHeader("Refresh", "1000; URL=http://www.baidu.com" );服務器

      URL指定的網址是1s後跳轉的頁面。當URL設置的路徑爲servlet本身的路徑時,就會每隔1s自動刷新本頁面一次。自動實現和重定向原理同樣,當爲時間設爲0,URL設爲一個網址,效果就是重定向。session


4.Servlet的線程安全問題
servlet是線程不安全的。要謹慎使用類的變量。一個servlet類只會有一個實例,而當多個用戶同時請求同一個servlet時,Tomcat會派生出多條線程執行servlet的代碼。所以servlet是線程不安全的。
     ...4.1多線程併發的讀寫會致使數據不一樣步的問題
     ...4.2多線程併發的讀寫servlet類屬性會致使數據不一樣步,但若只是併發地讀取屬性而不寫入,則不存在數據不一樣步問題
     ...4.3對於併發性的讀寫,最好的方法是synchronized這個屬性,這樣帶來的開銷將是最小的多線程

5.Fileter
Filter、Listener是servlet規範裏德兩個高級特性。不一樣於servlet,它們不用於處理客戶端請求,只用於對request、response進行修改或者對context、session、request事件進行監聽。
    ...5.1多個Filter就組成了一個FilterChain。併發


    ...5.2一個Filter必須實現javax.servlet.Filter接口。Filter須要配置在web.xml中才能生效。其中<dispatcher>配置到達servlet的方式。默認爲request。app


     ...5.2.1 request:表示僅當直接請求servlet時才生效。
     ...5.2.2 forward:表示僅當某servlet經過forward到該servlet時才生效。框架


    ...5.3多個Filter的執行有前後順序,規則是<filter-mapping>配置在前面的Filter執行要早於配置在後面的Filter


    ...5.4頁面編碼方式與Filter編碼方式必須一致。此外,若表單是get方式提交的,須要修改Tomcat的/conf/server.xml文件,指定URIEncoding,默認爲ISO-8859-1,不然依然會亂碼。


    ...5.5Filter中,若在chain.doFilter()上加一個try....catch語句,就能捕捉servlet中拋出的異常,而後根據不一樣的異常進行不一樣的異常處理。


    ...5.6Filter和特定的URL關聯,只有當客戶請求訪問此URL時,纔會觸發過濾器調用doFilter方法!


    ...5.7過濾器的初始化,即被調用init()方法是webApp應用被Tomcat加載就執行


    ...5.8Filter配置多個url-pattern


     方法一:(Servlet規範 2.5+)

 <filter>

          <filter-name>authority</filter-name>

          <filter-class>com.util.AuthorityFilter</filter-class>

     </filter>

     <filter-mapping>

          <filter-name>authority</filter-name>

           <url-pattern>/pages/cmm/*</url-pattern>

           <url-pattern>/pages/genbill/*</url-pattern>

     </filter-mapping>

    
 
 方法二:

<filter>

      <filter-name>authority</filter-name>

      <filter-class>com.util.AuthorityFilter</filter-class>

 </filter>

 <filter-mapping>

      <filter-name>authority</filter-name>

      <url-pattern>/pages/genbill/*</url-pattern>

 </filter-mapping>

 <filter-mapping>

      <filter-name>authority</filter-name>

      <url-pattern>/pages/cmm/*</url-pattern>

 </filter-mapping>

 


6.Listener
Listener用於監聽Java Web程序中的事件,如建立、屬性修改、刪除session、request、context等,並觸發相應的事件。Java web程序只要記住該類事件觸發時必定會調用相應的Listener相應方法,並傳回一個Event對象。觸發時,服務器會順次執行各個Listener的相應方法。
    ...6.1HttpSessionListener接口、ServletContextListener、ServletRequestListener分別用於監控session、context、request的建立和銷燬。
         1)HttpSessionListener:監聽session的建立和銷燬。建立session時執行sessionCreated()方法。超時或執行session.invalidate()時執行sessionDestroyed()方法。
         2)ServletContextListener:監聽context的建立和銷燬。context表明當前的web應用程序。服務器啓動或熱部署war包時執行contextInitialized()方法。服務器關閉或只關閉該web時會執行contextDestroyed()方法。該listener可用於啓動時獲取web.xml裏配置的初始化參數。
         3)ServletRequestListener:監聽request的建立和銷燬。用戶每次請求request都會執行requestInitialized()方法。request處理完畢自動銷燬前執行requestDestroyed()方法。


    ...6.2HttpSessionAttributeListener、ServletContextAttributeListener、ServletRequestAttributeListener用於監聽session、context、request的屬性變化。當向被監聽對象中添加、修改、刪除屬性時,會分別執行對應的方法。


    ...6.3HttpSessionBindingListener和HttpSessionActivationListener用於監控session內的對象。此兩個Listener不須要在web.xml中聲明。
         1)HttpSessionBindingListener:當對象被放到session裏時,執行valueBound()方法。當對象被從session裏移除時,執行valueUnbound()方法。對象必須實現該Listener接口。
         2)HttpSessionActivationListener:服務器關閉時,會將session裏的內容保存到硬盤上。服務器從新啓動時,會將session內容從硬盤上從新加載。當session裏的對象被鈍化時,執行sessionWillPassivate()方法。當對象被從新加載時,執行sessionDidActtivate()。對象必須實現該Listener接口。


    ...6.4HttpSessionIdListener


    ...6.5AsyncListener


    ...6.6<listener>標籤通常配置在<servlet>標籤的前面。

7.ServletContext
servlet容器在啓動時會加載web應用,併爲每一個web應用建立惟一的ServletContext對象,被同一個web應用中全部組件共享.在web運行期間,ServletContext設置的屬性一直存在。當web應用被關閉時(如關閉Tomcat),servlet容器銷燬ServletContext對象。

8.filter、listener、servlet啓動順序    1).啓動一個WEB項目的時候,容器(如:Tomcat)會去讀它的配置文件web.xml.讀兩個節點: <listener></listener> 和 <context-param></context-param>     2).緊接着,容器建立一個ServletContext(上下文),這個WEB項目全部部分都將共享這個上下文.     3).容器將<context-param></context-param>轉化爲鍵值對,並交給ServletContext.     4).容器建立<listener></listener>中的類實例,即建立監聽(經過contextInitialized(ServletContextEvent args)這個方法). listener的類實例須要實現 javax.servlet.ServletContextListener接口。    5).容器初始化<filter></filter>。filter的類實例須要實現 javax.servlet.Filter接口    6).容器加載<load-on-startup>的<serlvet/>。 servlet實現javax.servlet.Servlet接口    7).容器銷燬時,按照servlet-->filter-->listener的順序銷燬servlet、filter和listener

相關文章
相關標籤/搜索