監聽器和過濾器

程式dunk發表於2020-09-25

Servt規範擴充套件-----------監聽器介面

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);
    }
}

 

 

 

 

 

 

 

相關文章