@duyao
2015-05-30T05:36:54.000000Z
字数 4094
阅读 2143
java_web
监听器可以监听客户端发送的请求和服务器端发出的响应,满足servlet规范,是一种特殊的servlet类。
可以监听ServletContext,HttpSeesion和ServletRequest,即jsp域对象中的application,session和request
可以在事件发生前后做一些必要的处理。
1. 统计在线人数和在线用户
2. 系统启动时加载初始化信息
3. 统计网站访问量
4. 与spring进行结合
若资源中有多个监听器,则按照其在web.xml的注册顺序进行启动
若资源中有监听器,过滤器和servlet多者,其优先级是:监听器>过滤器>servlet
ServletContext)的事件监听器HttpSession)的事件监听器ServletRequest)的事件监听器ServletContext--实现接口-->ServletContextListenerHttpSession--实现接口-->HttpSessionListenerServletRequest--实现接口-->ServletRequestListenerServletContext--实现接口-->ServletContextAttributeEventHttpSession--实现接口-->HttpSessionAttributeEventServletRequest--实现接口-->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可以得到ServletContextServletContext context=arg0.getServletContext();}public void contextInitialized(ServletContextEvent arg0) {// TODO Auto-generated method stubString 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得到HttpSessionHttpSession 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的注册顺序)
并至少实现一个方法即可:
ServletContextListenerHttpSessionListenerServletRequestListenerServletContextAttributeEventHttpSessionAttributeEventServletRequestAttributeEvent