@duyao
2015-05-30T05:36:54.000000Z
字数 4094
阅读 2064
java_web
监听器可以监听客户端发送的请求和服务器端发出的响应,满足servlet规范,是一种特殊的servlet类。
可以监听ServletContext
,HttpSeesion
和ServletRequest
,即jsp域对象中的application
,session
和request
可以在事件发生前后做一些必要的处理。
1. 统计在线人数和在线用户
2. 系统启动时加载初始化信息
3. 统计网站访问量
4. 与spring进行结合
若资源中有多个监听器,则按照其在web.xml的注册顺序进行启动
若资源中有监听器,过滤器和servlet多者,其优先级是:监听器>过滤器>servlet
ServletContext
)的事件监听器HttpSession
)的事件监听器ServletRequest
)的事件监听器ServletContext
--实现接口-->ServletContextListener
HttpSession
--实现接口-->HttpSessionListener
ServletRequest
--实现接口-->ServletRequestListener
ServletContext
--实现接口-->ServletContextAttributeEvent
HttpSession
--实现接口-->HttpSessionAttributeEvent
ServletRequest
--实现接口-->ServletRequestAttributeEvent
AttributeEvent
都有3个方法:attributeAdded
,attributeRemoved
,attributeReplaced
监听绑定到HttpSession
域中某个对象的状态的事件监听器
HttpSession
有四种状态对象:
绑定(setAttribute)->解除绑定(removeAttribute)
钝化(钝化将session对象持久化到设备上)->活化(而活化将一个对象从设备上进行恢复)
session的钝化机制
将不常用的session对象序列化到系统文件系统或者系统数据库中,当被使用时,就反序列化到内存中,整个过程由服务器完成。
由SessionManager
管理,有两种钝化管理器org.apache.catalina.session.StandardManager
和org.apache.catalina.session.PersistentManager
HttpSessionBindingListener
中两种方法是valueBound
和valueUNBound
HttpSessionActivationListener
中两种方法是sessionDidActivate
和sessionWillActivate
,该接口会在tomcat安装目录\work\Catalina\hostname\applicationnam\
形成SESSION.ser
文件,钝化是存储在该文件中,活化时从该文件中取内容后,删除该文件 Serializable
web.xml
注册
public class User implements HttpSessionBindingListener,HttpSessionActivationListener,Serializable {
private String username;
private String password;
//绑定
public void valueBound(HttpSessionBindingEvent arg0) {
System.out.println("valueBound :"+arg0.getName());
}
//解除绑定
public void valueUnbound(HttpSessionBindingEvent arg0) {
System.out.println("valueUnbound :"+arg0.getName());
}
//活化
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("sessionDidActivate:"+se.getSource());
}
//钝化
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("sessionWillPassivate:"+se.getSource());
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
ServletContextListener
ServletContext
只能有一个,但是其监听器ServletContextListener
可以有多个。主要用于定时器,全局对象属性 web.xml
文件中添加初始化参数,然后监听器中得到
<context-param>
<param-name>test</param-name>
<param-value>Amy</param-value>
</context-param>
主要方法如下:
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
//通过ServletContextEvent可以得到ServletContext
ServletContext context=arg0.getServletContext();
}
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
String nameString = arg0.getServletContext().getInitParameter("test");
System.out.println("contextInitialized + name = " + nameString);
}
HttpSessionListener
ServletRequest
只能有一个,但是其监听器HttpSessionListener
可以有多个。主要用于统计在线人数,记录访问日志 web.xml
中可以设置session的生命周期,1表示大概一分钟session会过期,但不一定是精确的一分钟,0表示永不会过期。
<session-config>
<session-timeout>1</session-timeout>
</session-config>
主要方法如下:
public void sessionCreated(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
//通过HttpSessionEvent得到HttpSession
HttpSession httpSession = arg0.getSession();
}
public void sessionDestroyed(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
}
ServletRequestListener
ServletContext
只能有一个,但是其监听器ServletRequestListener
可以有多个。主要用于读取参数,记录访问历史主要方法如下:
public void requestDestroyed(ServletRequestEvent arg0) {
// TODO Auto-generated method stub
}
public void requestInitialized(ServletRequestEvent arg0) {
// TODO Auto-generated method stub
//得到传入的参数
String nameString = arg0.getServletRequest().getParameter("name");
}
只需要标注@WebListener
,无需再web.xml
注册,并且不能指定顺序(2.5的顺序是根据在web.xml
的注册顺序)
并至少实现一个方法即可:
ServletContextListener
HttpSessionListener
ServletRequestListener
ServletContextAttributeEvent
HttpSessionAttributeEvent
ServletRequestAttributeEvent