天天看點

Servlet上下文監聽

ServletContext : 每一個web應用都有一個 ServletContext與之相關聯。 ServletContext對象在應用啟動的被建立,在應用關閉的時候被銷毀。 ServletContext在全局範圍内有效,類似于應用中的一個全局變量。

ServletContextListener: 是ServletContext的listener接口,監聽ServletContext發生的變化,開發者能夠在為用戶端請求提供服務之前向ServletContext中添加任意的對象。這個對象在ServletContext啟動的時候被初始化,然後在ServletContext整個運作期間都是可見的。

當Servlet 容器啟動或終止Web 應用時,會觸發ServletContextEvent 事件,該事件由ServletContextListener 來處理。在 ServletContextListener 接口中定義了處理ServletContextEvent 事件的兩個方法。

void contextDestoryd(ServletContextEvent sce);

void contextInitialized(ServletContextEvent sce);

使用者需要建立一個java類實作 javax.servlet.ServletContextListener接口并提供上面兩個方法的實作。

我們使用緩存的思路大概是:

  1. 伺服器啟動時,ServletContextListener 的 contextInitialized()方法被調用,是以在裡面建立好緩存。可以從檔案中或者從資料庫中讀取取緩存内容生成類,用 ervletContext.setAttribute()方法将緩存類儲存在 ServletContext 的執行個體中。
  2. 程式使用 ServletContext.getAttribute()讀取緩存。如果是 JSP,使用application.getAttribute()。如果是 Servlet,使用 getServletContext().getAttribute()。如果緩存發生變化(如通路計數),你可以同時更改緩存和檔案/資料庫。或者你等 變化積累到一定程式再儲存,也可以在下一步儲存。
  3. 伺服器将要關閉時,ServletContextListener 的 contextDestroyed()方法被調用,是以在裡面儲存緩存的更改。将更改後的緩存儲存回檔案或者資料庫,更新原來的内容。

示例: 當你需要在處理任何用戶端請求之前建立一個資料庫連接配接,并且希望在整個應用過程中該連接配接都是可用的,這個時候ServletContextListener接口就會十分有用了。

package com.database;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributesListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.database.DbConnection;

public class DatabaseContextListener implements ServletContextListener {

  private ServletContext context = null;
  private Connection conn = null;

  public DatabaseContextListener() {

  }


  //該方法在ServletContext啟動之後被調用,并準備好處理用戶端請求
  public void contextInitialized(ServletContextEvent event)  {
    this.context = event.getServletContext();
    conn = DbConnection.getConnection;
    // 這裡DbConnection是一個定制好的類用以建立一個資料庫連接配接
    context = setAttribute(”dbConn”,conn);
  }

  //這個方法在ServletContext 将要關閉的時候調用
  public void contextDestroyed(ServletContextEvent event){
    this.context = null;
    this.conn = null; 
  }
}      

然後部署該類,并在web.xml檔案中添加

<listener>
com.database.DatabaseContextListener
</listener>      

一旦web應用啟動的時候,我們就能在任意的servlet或者jsp中通過下面的方式擷取資料庫連接配接:

Connection conn = (Connection) getServletContext().getAttribute(”dbConn”);      

轉載于:https://www.cnblogs.com/zhangchunxi/archive/2013/04/17/3025562.html