ServletContextListener
在上下文初始化和撤销时得到通知(监听ServletContext的初始化和撤销)
容器会检查类,并注意监听者接口以此明确是监听的哪个事件。
public class MyServletContextListener implements ServletContextListener {
public MyServletContextListener() {
// TODO Auto-generated constructor stub
}
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
ServletContext sc = arg0.getServletContext(); //由event事件得到上下文
string dogBreed = sc.getInitParameter("breed");
Dog d = new Dog(dogBreed);
sc.setAttribute("dog",d); //在这里使用上下文设置属性的话,在几乎web应用开始时我们就可以全局的使用这个
//变量了
}
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
}
在Servlet里,我们可以使用Dog dog = (Dog) getServletContext().getAttribute("dog")来获得我们设置的dog
HttpSessionBindingListener与HttpSessionAttributeListener
HttpSessionAttributeListener是想知道会话中何时增删替换了某种类型的属性
HttpSessionBindingListener是属性本身知道它何时增删到一个对话中
public class Dog implements HttpSessionBindingListener{
}
public void valueBound(HttpSessionBindingListenerEvent event){
//如果我知道我在一个会话中,我就运行这个代码
}
public void valueUnBound(HttpSessionBindingListenerEvent event){
//如果我知道我不再在一个会话中,我就运行这个代码
}
线程安全
但是因为上下文属性是全局的,所以它可能会被其他的servlet或者同一个servlet的不同线程访问和修改,那么我们可能会得到不符合我们期望的上下文属性值,因此我们有可能需要对上下文属性加锁(对上下文对象本身同步)。
HttpSession也需要同步
doGet(){
synchronized(getServletContext()){
getServletContext.setAttribute("foo","22");
out.println(getServletContext.getAttribute("foo"));
}
}