JSP&Servlet 监听器

来源:互联网 发布:知乎俄罗斯模特在中国 编辑:程序博客网 时间:2024/06/01 10:47
定义:

Servlet规范中定义的一种特殊类,用于监听servletcontext,HttpSession和servletRequest等域对象的创建于销毁事件,用于监听域对象的属性发生修改的事件,可以在事件发生前,发生后做一些必要的处理。


用途:
统计在线人数和在线用户
系统启动时加载初始化信息
统计网站访问量
与spring结合

首先创建一个普通类继承自javax.servlet.ServletContextEvent
继承其两个方法:
//销毁public void contextDestroyed(ServletContextEvent arg0) {System.out.println("Destroyed");}//初始化public void contextInitialized(ServletContextEvent arg0) {System.out.println("Initialized");}

web.xml:
<listener>        <listener-class>cn.hpu.edu.FirstListener</listener-class>    </listener>

打开服务器的同时会显示Initialized,关闭监听器的时候会显示Destroyed。

监听器的启动顺序:


监听器的分类:
按监听的对象划分:

1.用于监听应用程序环境对象servletcontent的事件监听
2.用于监听用户会话对象httpsession的事件监听器
3.用于监听请求消息对象servletrequest的事件监听器
按监听的事件划分:
1.监听域对象的创建和销毁的事件监听器
2.监听域对象中的属性的增加和删除的事件监听器
3.监听绑定到httpsession域中的某个对象的状态的事件监听器
servletcontent的监听:
定时器,全局属性对象
配置文件:
 
<context-param>   <param-name>initParam</param-name>   <param-value>Java</param-value>   </context-param>


为InitParameter添加一个值。
在初始化方法中添加String init = arg0.getServletContext().getInitParameter("initParam");
并且添加打印语句,在结果中会将init的值打印。
HttpSession的监听:
统计在线人数,记录访问日志
同content一样,创建一个继承自javax.servlet.http.HttpSessionEvent的类,并在web.xml中配置。
public void sessionCreated(HttpSessionEvent arg0) {System.out.println("sessionCreated");}public void sessionDestroyed(HttpSessionEvent arg0) {System.out.println("sessionDestroyed");}

session创建:
当用户打开浏览器第一次访问应用时,就会分配一个session
session销毁:
手动点击退出
关闭浏览器一段时间直到session过期
不关闭浏览器到session超时
添加配置代码:
 
<session-config>    <session-timeout>1</session-timeout>    </session-config>     //设置1分钟后session过期

打开该程序的网页后,后台打印sessionCreated,关闭浏览器大概1分钟后,后台打印sessionDestroyed。
Request的监听:
读取参数,记录访问历史
同content一样,创建一个继承自javax.servlet.ServletRequestEvent的类,并在web.xml中配置。
public void requestDestroyed(ServletRequestEvent arg0) {System.out.println("requestDestroyed");}@Overridepublic void requestInitialized(ServletRequestEvent arg0) {System.out.println("requestInitialized");}


结果:
requestInitialized
sessionCreated
requestDestroyed
在初始化方法中添加:String name = arg0.getServletRequest().getParameter("name");
访问http://localhost:8080/FirstListener/?name=java
后台打印:
requestInitialized:name=java
sessionDestroyed
sessionCreated
requestDestroyed
实例:监听域对象中的属性的增加和删除的事件监听


增加 删除 替换的方法

分别创建3个类:MyHttpSessionAttributeListener,MyServletContextAttributeListener,MyServletRequestAttributeListener,分别继承自javax.servlet.http.HttpSessionAttributeListener,ServletContextAttributeEvent,ServletRequestAttributeEvent
每个类中都会生成add,remove,replaced3个方法,分别在里面添加类似System.out.println("HttpSession_attributeAdded:"+httpsessionbindingevent.getName()),System.out.println("ServletContext_attributeAdded:"+servletcontextattributeevent.getName()),System.out.println("ServletRequest_attributeAdded:"+servletrequestattributeevent.getName())的语句,来区分3个方法。
在web.xml文件中配置这3个监听。
新建init.jsp,来实现添加;
request.setAttribute("requestName", "requestValue");
request.getSession().setAttribute("sessionName", "sessionValue");
request.getSession().getServletContext().setAttribute("contextName", "contextValue");
request.setAttribute("requestName", "requestValue");
request.removeAttribute("requestName");
新建destory.jsp,来实现删除:
request.removeAttribute("requestName");
request.getSession().removeAttribute("sessionName");
request.getSession().getServletContext().removeAttribute("contextName");
在原有的index.jsp中添加2个按钮,init,destory
访问index.jsp页面,后台输出:
requestInitialized:name=null
ServletContext_attributeAdded:org.apache.jasper.runtime.JspApplicationContextImpl          //jsp应用的实现类
sessionCreated
requestDestroyed
点击init:
requestInitialized:name=null
ServletRequest_attributeAdded:requestName
HttpSession_attributeAdded:sessionName
ServletContext_attributeAdded:contextName
ServletRequest_attributeReplaced:requestName
ServletRequest_attributeRemoved:requestName
requestDestroyed
再次点击init:
requestInitialized:name=null
ServletRequest_attributeAdded:requestName
HttpSession_attributeReplaced:sessionName
ServletContext_attributeReplaced:contextName
ServletRequest_attributeReplaced:requestName
ServletRequest_attributeRemoved:requestName
requestDestroyed
点击destory:
requestInitialized:name=null
HttpSession_attributeRemoved:sessionName
ServletContext_attributeRemoved:contextName
requestDestroyed
实例:监听绑定到httpsession域中的某个对象的状态的监听事件监听器
httpsession中的对象状态:
绑定(通过setAttribute储存到session)——>解除绑定(removeattribute)      钝化(将session持久化到存储设备上)——>活化(将session从储存设备上恢复)

session钝化机制:


Tomcat中两种session钝化管理器
session钝化机制有sessionmanager管理(org.apache.catalina.session.StandardManger)
当Tomcat服务器被关闭或重启时,tomcat服务器会将当前内存中的session对象钝化到服务器文件系统中;
另一种情况是web应用程序被重新加载时,内存中的session对象也会被钝化到服务器的文件系统中。
钝化后的文件被保存在Tomcat安装路径/work/Catalina/hostname/应用名称/SESSION.ser
(org.apache.catalina.session.Persistenmanager)
首先在钝化的基础上进行了扩张。第一种情况如上面1,第二种如上面2,第三种情况,可以在配置主流内存的session对象数目,将不常用的session对象保存到文件系统或数据库,当用时在重新加载。

默认情况下,tomcat提供2个钝化驱动类:org.apache.catalina.FileStore和org.apache.Catalina.JDBCStore。


实例代码:
创建一个普通javabean,User继承HttpSessionBindingListener,HttpSessionActivationListener,Serializable,添加username,password属性,添加普通的属性方法。
然后添加
public void valueBound(HttpSessionBindingEvent httpsessionbindingevent) {System.out.println("valueBound Name:"+httpsessionbindingevent.getName());}public void valueUnbound(HttpSessionBindingEvent httpsessionbindingevent) {System.out.println("valueUnbound Name:"+httpsessionbindingevent.getName());}//钝化public void sessionWillPassivate(HttpSessionEvent httpsessionevent) {System.out.println("sessionWillPassivate "+httpsessionevent.getSource());}//活化public void sessionDidActivate(HttpSessionEvent httpsessionevent) {System.out.println("sessionDidActivate "+httpsessionevent.getSource());}


在init.jsp中添加
request.getSession().setAttribute("currentUser", new cn.hpu.edu.User());//将一个用户的实例添加到session中
绑定与解除绑定的过程:
打开index.jsp页面点击init后,在原有的基础上会多出
valueBound Name:currentUser
HttpSession_attributeAdded:currentUser
点击destory,会多出:
valueUnbound Name:currentUser
HttpSession_attributeRemoved:currentUser
钝化过程:
关闭服务器,会显示:

 


当再次打开服务器,运行网页时会触发活化操作,文件中的SESSIN.ser文件消失。
原创粉丝点击