JavaWeb監聽器

三大組件:

  Servletjava

  Listenerweb

  Filterapache

Listener:監聽器服務器

  * 它是一個接口,內容由咱們來實現;session

  * 它須要註冊,例如註冊在按鈕上!app

  * 監聽器中的方法,會在特殊事件發生時被調用!jsp

觀察者:ide

  * 事件源網站

    >小偷spa

  * 事件

    >偷東西

  * 監聽器

    >警察

    >監聽器中的方法:抓捕


 

JavaWeb中的監聽器

  * 事件源:三大域!

    >ServletContext

      <生命週期監聽:ServletContextListener,它有兩個方法,一個在出生時調用,一個在死亡時調用;

        <>void contextInitialized(ServletContextEvent sce):建立ServletContext時

        <>void contextDestroyed(ServletContextEvent sce):銷燬ServletContext時

      <屬性監聽:ServletContextAttributeListener,它有三個方法,一個在添加屬性時調用,一個在替換屬性時調用,最後一個是在移除屬性時調用;

        <> void  attributeAdded(ServletContextAttributeEvent event):添加屬性時

        <> void  attributeReplaced(ServletContextAttributeEvent event):替換屬性時

        <> void  attributeRemoved(ServletContextAttributeEvent event):移除屬性時

    >HttpSession

      <生命週期監聽:HttpSessionListener,它有兩個方法,一個在出生時調用,一個在死亡時調用;    

        <>void sessionCreated(HttpSessionEvent se):建立session時

        <>void sessionDestroyed(HttpSessionEvent se):銷燬session時

      <屬性監聽:HttpSessionAttributeListener,它有三個方法,一個在添加屬性時調用,一個在替換屬性時調用,最後一個是在移除屬性時調用;

        <> void attributeAdded(HttpSessionBindingEvent event):添加屬性時

         <> void attributeReplaced(HttpSessionBindingEvent event):替換屬性時

        <> void attributeRemoved(HttpSessionBindingEvent event):移除屬性時

    >ServletRequest

      <生命週期監聽:ServletRequestListener,它有兩個方法,一個在出生時調用,一個在死亡時調用;

        <>void requestInitialized(ServletRequestEvent sre):建立request時

        <>void requesDestroyed(ServletRequestEvent sre):銷燬request時

      <屬性監聽:ServletRequestAttributeListener,它有三個方法,一個在添加屬性時調用,一個在替換屬性時調用,最後一個是在移除屬性時調用;

        <> void attributeAdded(ServletRequestAttributeEvent srae):添加屬性時

        <> void attributeReplaced(ServletRequestAttributeEvent srae):替換屬性時

        <> void attributeRemoved(ServletRequestAttributeEvent srae):移除屬性時

JavaWeb中完成編寫監聽器:

  * 寫一個監聽器類:要求必須實現某個監聽器接口;

package com.xjs.web.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * ServletContext生死監聽
 * @author hp
 *
 *能夠在這個監聽器存放一些在Tomcat啓動時就要完成的代碼!
 */
public class AListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        System.out.println("哇,我要掛也!");
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        System.out.println("哇,我來也!");
    }
}

  * 註冊,是在web.xml中配置來完成註冊!

  <listener>
      <listener-class>com.xjs.web.listener.AListener</listener-class>
  </listener>

事件對象:

  * ServletContextEvent:其方法ServletContext  getServletContext()

  *  HttpSessionEvent:其方法HttpSession  getSession()

  *  ServletRequestEvent:兩個方法1.ServletRequest  getServletRequest()  2.ServletContext  getServletContext()

 

 監聽器之屬性監聽器示例:

寫一個BListener實現ServletContextAttributeListener接口:

package com.xjs.web.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;

public class BListener implements ServletContextAttributeListener {

    public void attributeAdded(ServletContextAttributeEvent scab) {
        System.out.println("您向application中添加了一個名爲"+scab.getName()+",值爲:"+scab.getValue()+"的屬性" );
    }

    public void attributeReplaced(ServletContextAttributeEvent scab) {
        //返回的是舊值
        System.out.println(scab.getName()+"="+scab.getValue());
        //返回的新值
        System.out.println(scab.getServletContext().getAttribute("金泰妍"));
    }

    public void attributeRemoved(ServletContextAttributeEvent scab) {
        //最後一次相見
        System.out.println(scab.getName()+"="+scab.getValue());
    }
}

 

 index.jsp:向application域中保存----能夠在BListener這個屬性監聽器中獲取其鍵值。

    <%
        application.setAttribute("金泰妍", "taeyeon");
     %>

 

 replace.jsp:替換原有屬性

    <%
        application.setAttribute("金泰妍", "抽抽");
     %>

 

remove.jsp:移除原有屬性

    <%
        application.removeAttribute("金泰妍");
     %>

 感知監聽(都與HttpSession相關)

  * 它是用來添加到Javabean上,而不是添加到三大域上! 

  HttpSessionBindingListener:添加到JavaBean上,JavaBean就知道本身是否添加到session中了。

  

session的序列化(關閉服務器後,再次開啓,還有獲取到session中的值)

若是在程序中向session中保存了東西,在stop了Tomcat後,會在Tomcat的目錄下的work目錄下對應的項目中會生成一個SESSIONS.ser文件(是保存的session)。當再次run服務器時,會加載此文件,而後該項目下的SESSIONS.ser文件消失。-------這樣就會產生了session的死而復生。

    好比:某些用戶在某網站上正在瀏覽信息,忽然該網站的服務器關閉,重啓。用戶短暫掉線,服務器端會把用戶的信息保存到session中,而後保存在該項目下的文件中,服務器正常工做後,加載這些文件,不至於登陸的用戶信息丟失。

注:在Tomcat的目錄下的conf目錄的context.xml文件中

加上這句話能夠廢掉session序列化

    <!--
    廢掉session序列化的
    <Manager pathname="" />
    -->

 

 session的鈍化和活化

   鈍化session:Tomcat會把長時間不被使用的session,鈍化session對象。就是把session經過序列化的方式保存到硬盤文件中。

  活化session:當用戶在使用session時,Tomcat會把鈍化的對象在活化session。就是把硬盤文件中的session在反序列化回內存。

 當session被Tomcat鈍化時,session中存儲的對象也被鈍化,當session被活化時,也會把session中存儲的對象活化。

     好比:在網上,用戶過於太多,致使session個數猛增,客戶沒有下線,session增多,從而致使內存壓力,服務器會把長時間沒人訪問的session放在硬盤上,當你在訪問該session時,在從硬盤上讀取到內存中,而後使用。

配置:

1. 把這個寫到Tomcat的web.xml中,全部的項目都生效。2.把它寫到具體的項目中,只對該項目生效。

<!-- PersistentManager:持久的管理
maxIdleSwap:最大的空閒時間(分鐘)
-->

<Context>    

  <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
     <Store className="org.apache.catalina.session.FileStore" directory="mysession"/>
  </Manager>

</Context>

 已鈍化的session

訪問該session時,該session活化,加載到內存,該文件也不會消失,它會一直保存在硬盤上。

 

 HttpSessionActivationListener(監聽器)和Serializable接口

已經設置了session的最大不活動時間爲1分鐘。

建立User類實現這兩個接口:

package com.xjs;

import java.io.Serializable;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;

public class User implements HttpSessionActivationListener,Serializable{
    /**
     * 鈍化時調用
     */
    @Override
    public void sessionWillPassivate(HttpSessionEvent arg0) {
        System.out.println("我同session鈍化了,從內存到硬盤");
    }
    
    /**
     * 活化時調用
     */
    @Override
    public void sessionDidActivate(HttpSessionEvent arg0) {
        System.out.println("我同session活化了,從硬盤到內存");
    }
}

 

 a.jsp:向session中保存一個User對象

  <body>
    <%
        session.setAttribute("xxx", new User());
     %>
  </body>

 

b.jsp:從session中取出User對象

  <body>
    <%
        out.print(session.getAttribute("xxx"));
     %>
  </body>

 

 先訪問a.jsp後,向session保存User;等一分鐘,User對象同session一同鈍化。再訪問b.jsp,能夠獲得User對象。

 


 

網頁的國際化

相關文章
相關標籤/搜索