ServletContext 被 Servlet 程序用來與 Web 容器通訊。例如寫日誌,轉發請求。每個 Web 應用程序含有一個Context,被Web應用內的各個程序共享。由於Context能夠用來保存資源而且共享,因此我所知道的 ServletContext 的最大應用是Web緩存----把不常常更改的內容讀入內存,因此服務器響應請求的時候就不須要進行慢速的磁盤I/O了。html
ServletContextListener 是 ServletContext 的監聽者,若是 ServletContext 發生變化,如服務器啓動時 ServletContext 被建立,服務器關閉時 ServletContext 將要被銷燬。java
在JSP文件中,application 是 ServletContext 的實例,由JSP容器默認建立。Servlet 中調用 getServletContext()方法獲得 ServletContext 的實例。web
咱們使用緩存的思路大概是:數據庫
服務器啓動時,ServletContextListener 的 contextInitialized()方法被調用,因此在裏面建立好緩存。能夠從文件中或者從數據庫中讀取取緩存內容生成類,用 ervletContext.setAttribute()方法將緩存類保存在 ServletContext 的實例中。緩存
程序使用 ServletContext.getAttribute()讀取緩存。若是是 JSP,使用a pplication.getAttribute()。若是是 Servlet,使用 getServletContext().getAttribute()。若是緩存發生變化(如訪問計數),你能夠同時更改緩存和文件/數據庫。或者你等 變化積累到必定程序再保存,也能夠在下一步保存。服務器
服務器將要關閉時,ServletContextListener 的 contextDestroyed()方法被調用,因此在裏面保存緩存的更改。將更改後的緩存保存迴文件或者數據庫,更新原來的內容。app
import User; //my own class
import DatabaseManager; // my own class
import javax.servlet.ServletContext;
import javax.servlet.ServletContextListener;
public class MyContextListener
implements ServletContextListener {
private ServletContext context = null;
public void contextInitialized(ServletContextEvent event) {
context = event.getServletContext();
User user = DatabaseManager.getUserById(1);
context.setAttribute("user1", user);
}
public void contextDestroyed(ServletContextEvent event) {
User user = (User)context.getAttribute("user1");
DatabaseManager.updateUserData(user);
this.context = null;
}
}
你實現(implements)了 ServletContextListener 編譯後,把它放在正確的WEB-INF/classes目錄下,更改WEB-INF目錄下的 web.xml文件,在web-app節點裏添加post
<listener> <listener-class>MyServletContextListener</listener-class></listener>