ServletContextListener做用

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

咱們使用緩存的思路大概是:數據庫

  1. 服務器啓動時,ServletContextListener 的 contextInitialized()方法被調用,因此在裏面建立好緩存。能夠從文件中或者從數據庫中讀取取緩存內容生成類,用 ervletContext.setAttribute()方法將緩存類保存在 ServletContext 的實例中。緩存

  2. 程序使用 ServletContext.getAttribute()讀取緩存。若是是 JSP,使用a pplication.getAttribute()。若是是 Servlet,使用 getServletContext().getAttribute()。若是緩存發生變化(如訪問計數),你能夠同時更改緩存和文件/數據庫。或者你等 變化積累到必定程序再保存,也能夠在下一步保存。服務器

  3. 服務器將要關閉時,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;
}
}

佈署 ServletContextListener

你實現(implements)了 ServletContextListener 編譯後,把它放在正確的WEB-INF/classes目錄下,更改WEB-INF目錄下的 web.xml文件,在web-app節點裏添加post

<listener>	<listener-class>MyServletContextListener</listener-class></listener>
相關文章
相關標籤/搜索