Javaweb-监听器详解

一.先上思维导图

java 控制器请求文件_User

二.有关于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=这个和上面就是一模一样啦,这里就不赘述了,下一篇,我们过滤器见。