Javaweb-监听器详解
一.先上思维导图
二.有关于SevletContext的监听器
(1)对servletContext生命周期的监听
//context初始化的时候设置Attribute,此处实现了ServletContextListener接口
public void contextInitialized (ServletContextEvent sce) {
ServletContext context = sce.getServletContext();
String avatars = context.getInitParameter ("AVATAR");//获得初始化参数
context. setAttribute ("avatars", avatars);//给设置属性
}
(2)作用
例如,可以实现ServletContextListener,在应用程序初始过程中,准备好数据库连
线对象、读取应用程序设置等动作,如放置使用头像的目录信息,就不宜将目录名称
写死以免日后目录变动名称或位置时,所有相关的Servlet都需要进行源代码的修改。
这时可以这么做:
(3)关于ServletContext要注意的东西
ServletContext由web项目一开始就创建了,生命贯穿整个web项目,因此在ServletContext中的attribute将会在整个web应用运行时都存在,除非手动来销毁。
三.有关于HTTPSession的监听器
(1)其实和SevletContext的大同小异,都具有关于自身的生命周期的监听,以及对attribute更改的监听。但是这里多了两个listener,第一个是HttpSessionBindingListener,第二个是HttpSessionActivationListener。
(2)有关于HttpSession的生命周期
1.当客户端第一次访问服务器的时候,此时客户端的请求中不携带任何标识给服务器,所以此时服务器无法找到与之对应的session,所以会新建session对象。
2.当服务器进行响应的时候,服务器会将session标识放到响应头的Set-Cookie中,会以key-value的形式返回给客户端,例:JSESSIONID=7F149950097E7B5B41B390436497CD21;其中JSESSIONID是固定的,而后面的value值对应的则是给该客户端新创建的session的ID。
3.之后浏览器再次进行服务器访问的时候,客户端会将此key-value放到cookie中一并请求服务器,服务器就会根据此ID寻找对应的session对象了;
4.当浏览器关闭后,会话结束,由于cookie消失所以对应的session对象标识消失,而对应的session依然存在,但已经成为报废数据等待GC回收了对应session的ID可以利用此方法得到:session.getId();
总结一下,session由用户第一次访问服务器的时候产生,并且当浏览器关闭的时候,由于cookie的消失,会让session找不到识别的东西,因为长期没被调用,就会等待被gc回收。
浏览器打开->浏览器关闭
想看更加详细的可以看这个大佬的帖子。
(3)HttpSessionBindingListener
可以用来给pojo类使用,当把这个类继承了这个接口以后,当这个类的对象被放入HttpSession的属性的时候,就会调用valuebound方法,这个时候就把他补全
pojo类->User
package 欢迎关注一下我嘻嘻嘻;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class User implements HttpSess ionBindingListener {
private String name;
private String data;
public User (String name) {
this. name = name;
}
public void valueBound(BttpS D88 sionBindingEvent eV nt) {
this.data = name + "来自数据库的数据...";
}
public void value Unbound (EttpSessionBindingEvent event) {}
public String getData() {
return data;
}
public String getName () {
return name ;
}
}
public class Login extends HttpServlet {
@Override
protected void doPost (HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String page = " form. html";
if (users. containsKey (name) && users . get (name) . equals (passwd) ) {
User user = new User(name) ;
request.getSession() .setattribute("user", user);//可以把一个不完整的user补全
page="welcome.view" ;
}
response . sendRedirect (page) ;
}
}
(4)HttpSessionActivationListen
HttpSessionActivationListener是“对象迁移监听器”,其定义了两个方法session-
WillPassivate()与sessionDidActivate ()。很多情况下,几乎不会使用到HttpSessionActivation-
Listener在使用到分布式环境时,应用程序的对象可能分散在多个JVM中。当HttpSession
要从一个JVM迁移至另-一个JVM时,必须先在原本的JVM.上序列化(Serialize)所有 的属
性对象,在这之前若属性对象有实现HttpSession- ActivationListener 。
四.有关于ServletRequest的Listener
=2=这个和上面就是一模一样啦,这里就不赘述了,下一篇,我们过滤器见。