JSP/Servlet中的Listener

來源:互聯網
上載者:User

JSP/Servlet 中的事件處理寫過AWT或Swing程式的人一定對傳統型程式的事件處理機制印象深刻:通過實現Listener介面的類可以在特定事件(Event)發生時,呼叫特定的方法來對事件進行響應。

其實我們在編寫JSP/Servle程式時,也有類似的事件處理機制,所不同的是在JSP/Servlet中是在web.xml中註冊Listener,由Container在特定事件發生時呼叫特定的實現Listener的類。

1. Servlet中的Listener和Event:

在JSP 2.0/Servlet 2.4中,共有八個Listener介面,六個Event類別。
ServletContextListener介面
[介面方法] contextInitialized()與 contextDestroyed()
[接收事件] ServletContextEvent
[觸發情境] 在Container載入Web應用程式時(例如啟動 Container之後),會呼叫contextInitialized(),而當容器移除Web應用程式時,會呼叫contextDestroyed ()方法。

ServletContextAttributeListener
[介面方法] attributeAdded()、 attributeReplaced()、attributeRemoved()
[接收事件] ServletContextAttributeEvent
[觸發情境] 若有對象加入為application(ServletContext)對象的屬性,則會呼叫attributeAdded(),同理在置換屬性與移除屬性時,會分別呼叫attributeReplaced()、attributeRemoved()。

HttpSessionListener
[介面方法] sessionCreated()與sessionDestroyed ()
[接收事件] HttpSessionEvent
[觸發情境] 在session (HttpSession)對象建立或被消滅時,會分別呼叫這兩個方法。

HttpSessionAttributeListener
[介面方法] attributeAdded()、 attributeReplaced()、attributeRemoved()
[接收事件] HttpSessionBindingEvent
[觸發情境] 若有對象加入為session(HttpSession)對象的屬性,則會呼叫attributeAdded(),同理在置換屬性與移除屬性時,會分別呼叫attributeReplaced()、 attributeRemoved()。

HttpSessionActivationListener
[介面方法] sessionDidActivate()與 sessionWillPassivate()
[接收事件] HttpSessionEvent
[觸 發情境] Activate與Passivate是用於置換對象的動作,當session對象為了資源利用或Server Load Balancer等原因而必須暫時儲存至硬碟或其它儲存器時(透 過對象序列化),所作的動作稱之為Passivate,而硬碟或儲存器上的session對象重新載入JVM時所採的動作稱之為Activate,所以容 易理解的,sessionDidActivate()與 sessionWillPassivate()分別於Activeate後與將Passivate前呼叫。

ServletRequestListener
[介面方法] requestInitialized()與 requestDestroyed()
[接收事件] RequestEvent
[觸發情境] 在request(HttpServletRequest)對象建立或被消滅時,會分別呼叫這兩個方法。

ServletRequestAttributeListener
[介面方法] attributeAdded()、 attributeReplaced()、attributeRemoved()
[接收事件] HttpSessionBindingEvent
[觸發情境] 若有對象加入為request(HttpServletRequest)對象的屬性,則會呼叫attributeAdded(),同理在置換屬性與移除屬性時,會分別呼叫attributeReplaced()、 attributeRemoved()。

HttpSessionBindingListener
[介面方法] valueBound()與valueUnbound()
[接收事件] HttpSessionBindingEvent
[觸 發情境] 實現HttpSessionBindingListener介面的類別,其執行個體如果被加入至session(HttpSession)對象的屬性中,則會 呼叫 valueBound(),如果被從session(HttpSession)對象的屬性中移除,則會呼叫valueUnbound(),實現 HttpSessionBindingListener介面的類別不需在web.xml中設定。

2. 如何註冊Servlet中的事件
實現上面這幾個介面的類別,除了HttpSessionBindingListener外,必須在web.xml中向容器註冊,容器才會在對應的事件發生時呼叫對應的類別,如:
 < listener > 
 < listener-class > demo.servlet.listener.CustomServletContextListener </ listener-class > 
 </ listener >

3.Java類執行個體
==========
//偵聽啟動和關閉
import javax.servlet.ServletContextListener;
import javax.servlet.*;

public class TigerListen implements ServletContextListener {
 public void contextInitialized(ServletContextEvent sce)
 {
  System.out.print("Init") ;
 }
 public void contextDestroyed(ServletContextEvent sce)
 {
  System.out.print("Destroved") ;
 }
}

對應的web.xml是
============
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
 xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 <listener>
  <listener-class>TigerListen</listener-class>
 </listener>
</web-app>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.