ServletContext同Web容器通信通过servlet容器;
例如写日志,转发请求。
每一个 Web 应用程序含有一个Context(保存资源Web 缓存并且共享) ,被Web 应用内的各个程序共享。
ServletContextListener是ServletContext 的监听者;
如果 ServletContext 发生变化,服务器启动时ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。
JSP 文件中,application是ServletContext 的实例,由JSP 容器默认创建。Servlet 中调用getServletContext() 方法得到 ServletContext 的实例。
缓存的思路
-
创建缓存
服务器启动时,ServletContextListener 的 contextInitialized() 方法被调用,所以在里面可以从文件中或者从数据库中读取取缓存内容生成类,用 ervletContext.setAttribute() 方法将缓存类保存在ServletContext 的实例中。
-
读取缓存
JSP,使用application.getAttribute() 。如果是Servlet ,使用 getServletContext().getAttribute() 。如果缓存发生变化( 如访问计数) ,你可以同时更改缓存和文件/ 数据库。或者你等 变化积累到一定程序再保存,也可以在下一步保存。
-
更改缓存保存回文件
ServletContextListener的contextDestroyed() 方法被调用,所以在里面保存缓存的更改。将或者数据库,更新原来的内容。
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;
}
}
import User; //my own
classimport 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;
}
}