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接口并提供上面兩個方法的實作。
我們使用緩存的思路大概是:
- 伺服器啟動時,ServletContextListener 的 contextInitialized()方法被調用,是以在裡面建立好緩存。可以從檔案中或者從資料庫中讀取取緩存内容生成類,用 ervletContext.setAttribute()方法将緩存類儲存在 ServletContext 的執行個體中。
- 程式使用 ServletContext.getAttribute()讀取緩存。如果是 JSP,使用application.getAttribute()。如果是 Servlet,使用 getServletContext().getAttribute()。如果緩存發生變化(如通路計數),你可以同時更改緩存和檔案/資料庫。或者你等 變化積累到一定程式再儲存,也可以在下一步儲存。
- 伺服器将要關閉時,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