詳細瞭解java監聽器和過濾器

1、介紹:

1)一組來自於Servlet規范下的接口,共有8個接口。在Tomcat中存在於Servlet-api.jar

2)監聽器接口需要由開發人員親自實現,Http服務器提供的jar中並沒有對應的實現類

3)監聽器接口用於監控【作用域對象生命周期的變化時刻】以及【作用域對象共享數據的變化時刻】

2、作用域對象:

1)在Servlet規范中,認為在服務端內存中可以在某些條件下為兩個Servlet之間提供數據共享方案的對象,被稱為【作用域對象】

2)在Servlet規范下的作用域對象:

ServletContext:全局作用域對象

HttpSession:會話作用域對象

HttpServletRequest:請求作用域對象

3、監聽器接口實現類開發規范:三步

1)根據監聽的實際情況,選擇對應的監聽器接口進行實現

2)重寫監聽器接口中聲明的【監聽事件處理方法】

3)在web.xml文件中將監聽器接口實現類註冊到Http服務器中

4、ServletContextListener

1)作用:通過這個接口合法的檢測全局作用域對象的兩個時刻

被初始化時刻 被銷毀時刻

2)監聽事件處理方法

public void contextInitialized():在全局作用域對象被Http服務器初始化是調用

public void contextDestroyed():在全局作用域對象被Http服務器銷毀時調用

5、ServletContextAttributeListener接口:

1)作用:通過這個接口合法的檢測全局作用域對象共享數據變化的時刻

2)監聽事件處理方法:

public void contextAdded():在全局作用域對象添加共享數據時調用

public void contextReplaced():在全局作用域對象更新共享數據時調用

public void contextRemoved():在全局作用域對象刪除共享數據時調用

6、全局作用域對象共享數據變化時刻

ServletContext application=request.getServletContext();

application.setAttribute("key1",100); //新增共享數據

application.setAttribute("key1",200); //更新共享數據

application.removeAttribute("key1"); //刪除共享數據

代碼實現

以下就以ServletContextListener接口和ServletContextAttributeListener接口

第一步:選擇ServletContextListener接口進行實現

第二步:重寫監聽器接口聲明的【監聽事件處理方法】

public class OneListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("Initialized............");
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("Destroyed.............");
    }
}

第三步:在web.xml中將監聽器接口實現類註冊到Http服務器中

<listener>
    <listener-class>school.xauat.listener.OneListener</listener-class>
</listener>

由於ServletContext【全局作用對象的生命周期】貫穿網站的整個運行期間

Servlet之間數據共享中有具體的ServletContext生命周期

因此在Tomcat服務器啟動過程時,執行contextInitialize()方法

Initialized…………

在Tomcat服務器準備關閉時,執行contextDestroyed()方法

Destroyed………….

第一步:選擇ServletContextAttributeListener接口進行實現

第二步:重寫監聽器接口聲明的【監聽事件處理方法】

public class OneListener implements ServletContextAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        System.out.println("ServletContextAttribute is added......");
    }
    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae){
        System.out.println("ServletContextAttribute is removed......");
    }
    @Override
    public void attributeReplaced(ServletContextAttributeEvent scae){
        System.out.println("ServletContextAttribute is replaced......");
    }
}

第三步:在web.xml文件中將監聽器接口實現類註冊到Tomcat服務器中

<servlet>
    <servlet-name>OneServlet</servlet-name>
    <servlet-class>school.xauat.controller.OneServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>OneServlet</servlet-name>
    <url-pattern>/one</url-pattern>
</servlet-mapping>
<listener>
    <listener-class>school.xauat.listener.OneListener</listener-class>
</listener>

監聽事件

public class OneServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //通過請求對象獲取全局作用域對象
        ServletContext application=request.getServletContext();
        //向全局作用域對象中添加共享數據
        application.setAttribute("key",100);
        //更改全局作用域對象中的共享數據
        application.setAttribute("key",500);
        //刪除全局作用域對象中的共享數據
        application.removeAttribute("key");
    }
}

運行結果

Servt規范擴展———–過濾器接口

1、介紹:

1)來自於Servlet規范下的接口,在Tomcat中存在於servlet-api.jar包中

2)Filter接口實現類由開發人員負責提供的,Http服務器不負責提供

3)Filter接口會在Http服務器調用資源文件之前,對Http服務器進行攔截

2、具體作用:

1)攔截Http服務器,幫助Http服務器去檢測當前請求的合法性

2)攔截Http服務器,對當前請求進行增強操作

3、Filter接口實現類的開發步驟:三步

1)創建一個java類實現Filter接口

2)重寫Filter接口中的doFilter方法

3)在web.xml文件中將過濾器接口實現類註冊到Http服務器

過濾器檢測請求合法性

第一步:創建一個java類實現Filter接口

第二步:重寫doFilter接口中的doFilter()方法

/**
 * http://localhost:8080/myWeb/mm.jpg?age=89
 */
public class OneFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //通過攔截的請求對象來得到請求包中的參數信息,從而得到來訪用戶的真實年齡
        String age=servletRequest.getParameter("age");
        //根據這個年齡幫助我們的Http服務器判斷本次請求的合法性
        if(Integer.valueOf(age)<70){
            //將攔截請求對象和相應對象交換給Tomcat,由Tomcat繼續調用資源文件
            filterChain.doFilter(servletRequest,servletResponse);
        }else{
            //過濾器代替Http服務器拒絕本次請求
            servletResponse.setContentType("text/html;charset=utf-8");
            PrintWriter out=servletResponse.getWriter();
            out.print("<center><font style='color:red;font-size:40px'>不合適!!!!</font></center>");
        }
    }
}

第三步:在web.xml文件中將過濾器接口實現類註冊到Http服務器

<!--將過濾器類文件交給Tomcat-->
<filter>
    <filter-name>OneFilter</filter-name>
    <filter-class>school.xauat.filter.OneFilter</filter-class>
</filter>
<!--通知Tomcat在調用何種資源文件是需要被當前過濾器攔截-->
<filter-mapping>
    <filter-name>OneFilter</filter-name>
    <url-pattern>/mm.jpg</url-pattern>
</filter-mapping>

過濾器對請求對象進行增強服務

當有多個以post的請求訪問服務器時,需要對每個Servlet接口實現類中doPost()方法進行以下操作,增加的開發的難度。

response. setCharacterEncoding(“utf-8”)

以下展示過濾器的作用:

第一步:創建java實現Filter接口

第二步:重寫Filter接口下的doFilter()方法

public class OneFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

第三步:在web.xml文件中將過濾器接口實現類註冊到Http服務器

<servlet>
        <servlet-name>OneServlet</servlet-name>
        <servlet-class>school.xauat.controller.OneServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>OneServlet</servlet-name>
        <url-pattern>/one</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>TwoServlet</servlet-name>
        <servlet-class>school.xauat.controller.TwoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TwoServlet</servlet-name>
        <url-pattern>/two</url-pattern>
    </servlet-mapping>
    <!--註冊Filter類-->
    <filter>
        <filter-name>OneFilter</filter-name>
        <filter-class>school.xauat.filter.OneFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>OneFilter</filter-name>
        <!--通知Tomcat在調用所有資源文件之前都需要調用OneFilter進行攔截-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

OneServlet

public class OneServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //通過請求對象獲取請求體中的請求參數
        String userName=request.getParameter("userName");
        System.out.println("OneServlet----->"+userName);
    }
}

TwoServlet

public class TwoServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //通過請求對象獲取請求體中的請求參數
        String userName=request.getParameter("userName");
        System.out.println("TwoServlet---->"+userName);
    }
}

4、Filter攔截地址的格式

1)命令格式:

<filter-mapping>

<filter-name><OneFilter/filter-name>

<url-pattern>攔截地址</url-pattern>

</filter-mapping>

2)命令作用:

攔截地址通知Tomcat在調用和何種資源文件之前需要調用OneFilter過濾進行攔截

3)要求Tomcat在調用某一個具體文件之前,來調用OneFilter進行攔截

<url-pattern>/目錄/文件名</url-pattern>

4)要求Tomcat在調用某一個文件夾下所有的資源文件之前,來調用OneFilter進行攔截

<url-pattern>/目錄/*</url-pattern>

5)要求Tomcat在調用任意文件夾下的某種類型文件之前,來調用OneFilter攔截

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

6)要求Tomcat在調用網站中任意文件時,來調用OneFilter攔截

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

總結

本篇文章就到這裡瞭,希望能給你帶來幫助,也希望你能夠多多關註WalkonNet的更多內容!

推薦閱讀: