java web(五):java web三大組件之另外兩個和八大監聽器

  java的三大組件指Servlet、Filter、Listener。八大監聽器指八個接口。前面介紹了Servlet,如今介紹一下Filter攔截器以及攔截地址的設置,css

Listener監聽那些事件。html

  java web的cookie和session機制有篇博客講的很好,有興趣的博友能夠去看看。地址:http://www.javashuo.com/article/p-xmkmwfcp-bg.html
java

 


 一:Filterweb

  1.基本概念spring

    Filter稱之爲過濾器,是用來作一些攔截的任務, 在Servlet接受請求以前,作一些事情,若是不知足限定,能夠拒絕進入Servlet。瀏覽器

    

    一個web項目中能夠配置多個filter過濾器,瀏覽器訪問靜態資源如html、jsp、css或者訪問動態資源servlet都會通過filter過濾器,知足條件,過濾器放行,不然直接返回。服務器

  2.使用cookie

    filter有不少用處,網上一搜,在filter層,來獲取用戶的身份,能夠考慮在filter層作一些常規的校驗(如參數校驗,referer校驗等),能夠在filter層作session

  穩定性相關的工做(如全鏈路打點,能夠在filter層分配一個traceId;也能夠在這一層作限流等)。我最多見的是spring中的編碼過濾器。咱們經過編碼過濾器認識filter。app

    代碼:

package com.briup.servlet.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * Servlet Filter implementation class EncodingFilter * 編碼過濾器 */ public class EncodingFilter implements Filter { private String encoding; public EncodingFilter() {} public void destroy() {} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //設置編碼格式【只對post方式有效】;  request.setCharacterEncoding(encoding); response.setCharacterEncoding(encoding); //放行;  chain.doFilter(request, response); System.out.println("servlet執行完畢,返回到filter"); } public void init(FilterConfig fConfig) throws ServletException { //咱們把編碼設置在web.xml中,若是須要改編碼在配置文件中更改而不須要更改代碼 encoding = fConfig.getInitParameter("encoding"); } }

 

 

  web.xml:

<filter>
    <display-name>EncodingFilter</display-name>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>com.briup.servlet.filter.EncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <!-- /* 表明攔截全部請求 -->
    <url-pattern>/*</url-pattern>
  </filter-mapping>

 訪問:http://127.0.0.1:7778/StudyServlet/HelloWorld或者http://127.0.0.1:7778/StudyServlet/success.html,控制檯都會輸出一句:"servlet執行完畢,返回到filter"。

  

3.攔截地址的配置

    filter我主要想說的就是攔截地址如何配置了。    

第一種 【匹配任意】

    <url-pattern>/*</url-pattern> 

 

第二種 【精確匹配】

    <url-pattern>/test_servlet</url-pattern>

    表示此攔截器只會攔截/test_servlet這一個路徑

 

第三種 【擴展名匹配】

          <url-pattern>*.html</url-pattern>

          表示此攔截器只會攔截後綴名是.html的路徑

 

第四種 【路徑匹配】

          <url-pattern>/test/*</url-pattern>

           表示此攔截器攔截/test路徑下的全部資源

 

注意:服務器內部跳轉不會攔截,只會攔截瀏覽器發送的地址。

 

二:監聽器

  Servlet監聽器的做用是監聽Web容器的有效期事件,能夠監聽因爲Web應用中狀態改變而引發的Servlet容器產生的相應事件,而後接受並處理這些事件。

  下面簡單介紹這8個接口和其中的方法。

 

  監聽ServletContent(應用上下文)

     1.ServletContentListener接口  

      Servlet的上下文監聽,它主要實現監聽ServletContext的建立和刪除

        (1)contextInitialized(ServletContextEvent event); //通知正在收聽的對象,應用程序已經被加載和初始化。

        (2)contextDestroyed(ServletCotextEvent event);  // 通知正在收聽的對象,應用程序已經被載出,即關閉。

    2.ServletContextAttributeListener接口

      應用上下文存、移除、更改數據進行監聽。

        (1)attributeAdded(ServletContextAttributeEvent event); //應用上下文存數據的時候觸發【調用setAttribute方法】

        (2)attributeRemoved(ServletContextAttributeEvent event); //ServletContent對象調用removeAttribute方法觸發。

        (3)attributeReplaced(ServletContextAttributeEvent event);  //當存數據的時候,key值已經存在,value值被替換的時候觸發。

  

  監聽session接口

    3.HttpSessionListener接口

      (1)sessionCreated(HttpSessionEvent even); //session被建立的時候觸發。

      (2)sessionDestroyed(HttpSessionEvent event); //session過時失效觸發

    4.HttpSessionAttributeListener

      用法和ServletContextAttributeListener接口相似。

  

  監聽request接口

    5.ServletRequestListener

    6.ServletRequestAttributeListener

  用法和上面相似。

 

  7.HttpSessionActivationListener;        
     該接口實現監聽HTTP會話active和passivate。
                     (1)attributeAdded(HttpSessionBindingEvent event); // 當有對象加入session的範圍時,通知正在收聽的對象
                     (2)attributeReplaced(HttpSessionBindingEvent event); //當在session的範圍有對象取代另外一個對象時,通知正在收聽的對象。
                     (3)attributeRemoved(HttpSessionBindingEvent event);  //當有對象從session的範圍有對象取代另外一個對象時,通知正在收聽的對象 。

    其中HttpSessionBindingEvent類主要有三個方法:getName()、getSession()和getValue()

  8.HttpBindingListener;                     
    接口實現監聽HTTP會話中對象的綁定信息。
                  (1)alueBound(HttpSessionBindingEvent event);   //當有對象加入session的範圍時會被自動調用
                  (2)valueUnBound(HttpSessionBindingEvent event);  //當有對象從session的範圍內移除時會被自動調用

 

注:本文一部分是參考網上資料的。

相關文章
相關標籤/搜索