servlet(二)、監聽器 javax.servlet.Filter

servlet(二)、監聽器 javax.servlet.Filter

1、什麼是監聽器

    javaWeb規範包括三個技術點:servlet 、listener 、filter;監聽器就是監聽某個對象的的狀態變化的組件。監聽器是一個java類,用來監聽其餘javaBean的變化。在javaWeb中監聽器是用來監聽三個對象(request、session、servletConfig)的狀態。監聽器的相關概念事件源:
一、被監聽的對象(三個域對象 request,session,servletContext)
二、監聽器:監聽事件源對象, 事件源對象的狀態的變化都會觸發監聽器 。
三、註冊監聽器:將監聽器與事件源進行綁定。
四、響應行爲:監聽器監聽到事件源的狀態變化時,所涉及的功能代碼(程序員編寫代碼)html

2、javaWeb的監聽器

一、監聽的域對象

1) request
2) session
3) servletConfigjava

二、事件源和監聽器綁定的過程

經過配置web.xmlwancheng程序員

三、servlet提供的監聽器

    servlet提供了8個監聽器web

1) 第一類:監聽三個域對象的建立和銷燬的監聽器3個spring

對象類型 對應的監聽器
ServletContext ServletContextListener
HttpSession HttpSessionListener
HttpServletRequest ServletRequestListener

2) 第二類:監聽三個域對象變動的監聽器(屬性添加,屬性移除,屬性替換)3個數據庫

對象類型 對應的監聽器
ServletContext ServletContextAttributeListener
HttpSession ServletRequestAttributeListener
HttpServletRequest HttpSessionAttributeListener

3) 第三類:監聽HttpSession對象中的JavaBean的狀態的改變.(綁定,解除綁定,鈍化和活化)2個
瀏覽器

對象類型 對應的監聽器
HttpSession HttpSessionBindingListener(綁定,解除綁定)
HttpSession HttpSessionActivationListener(鈍化和活化)

3、監聽實例——三大域對象的建立與銷燬的監聽器

一、ServletContextListener

ServletContextListener監聽器的主要做用(至關於監聽tongcat啓動和關閉):服務器

1) 初始化的工做:初始化對象;初始化數據。好比加載數據庫驅動,對鏈接池的初始化。
2) 加載一些初始化的配置文件;好比spring的配置文件。
3) 任務調度(定時器Timer/TimerTask)session

監聽ServletContext域的建立與銷燬的監聽器,Servlet域的生命週期:在服務器啓動建立,服務器關閉時銷燬;監聽器的編寫步驟:app

1) 編寫一個監聽器類去實現監聽器接口
2) 覆蓋監聽器的方法
3) 須要在web.xml中進行配置(註冊)

例子:

二、HttpSessionListener

監聽Httpsession域的建立與銷燬的監聽器。HttpSession對象的生命週期:第一次調用request.getSession時建立;銷燬有如下幾種狀況(服務器關閉、session過時、 手動銷燬)

例子:統計在線人數,每個瀏覽器訪問都會記錄一次,當一個瀏覽器退出時就會讓在線人數減掉1.

在src/main/webapp下新建一個名爲web的包,並在web包下面新建兩個類,分別是:

CountLoginListen.java

package web;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class CountListener implements HttpSessionListener {
        private int count = 0;

        public void sessionCreated(HttpSessionEvent se) {
                count++;
                HttpSession session = se.getSession();
                ServletContext sct = session.getServletContext();
                sct.setAttribute("count", count);
        }

        public void sessionDestroyed(HttpSessionEvent se) {
                count--;
                HttpSession session = se.getSession();
                ServletContext sct = session.getServletContext();
                sct.setAttribute("count", count);
        }
}

LoginOutServlet.java

package web;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LogoutServlet extends HttpServlet {
        public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
                response.setContentType("text/html;charset=utf8");
                PrintWriter out = response.getWriter();
                HttpSession session = request.getSession();
                session.invalidate();
                out.close();
        }
}

2) 配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

    <listener>
        <listener-class>web.CountListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>h</servlet-name>
        <servlet-class>web.LogoutServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>h</servlet-name>
        <url-pattern>/logout</url-pattern>
    </servlet-mapping>

</web-app>

3) 在webapp下新建一個jsp文件,名爲:index.jsp

<%@ page language="java" contentType="text/html; charset=utf8"
        pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Insert title here</title>
    </head>
    <body>
        當前有<%=application.getAttribute("count").toString() %>
        <a href="logout">登出</a>
    </body>
</html>

三、ServletRequestListener

3、監聽實例——三大域對象的屬性的變化

一、ServletContextAttibuteListener

二、HttpSessionBindingListener

三、HttpSessionActivationListener

3、監聽實例——三大域對象的屬性的變化

一、

二、

三、

相關文章
相關標籤/搜索