监听对象:request session application
作用范围:request:请求对象,同一次请求有效(请求转发后有效;重定向后无效);
session会话对象,同一次会话有效(无论怎么跳转,都有效;关闭/切换浏览器后无效 ; 从 登陆->退出 之间 全部有效);
application全局对象,全局变量;整个项目运行期间 都有效 (切换浏览器 仍然有效);关闭服务、其他项目 无效
三个都共同有的方法:
Object getAttribute(String name):根据属性名,或者属性值
void setAttribute(String name,Object obj) :设置属性值(新增,修改)
setAttribute(“a”,“b”) ;//如果a对象之前不存在,则新建一个a对象 ;
如果a之前已经存在,则将a的值改为b
void removeAttribute(String name):根据属性名,删除对象
.以上的范围对象,都通过 setAttribute()复制,通过getAttribute()取值;
application和Servlet:
application对象是ServletContext的实例,servletContext和application 是一样的,就相当于一个类创建了两个不同名称的变量
在 servlet中ServletContext就是application对象。两者的区别就是application用在jsp中,servletContext用在servlet中。
当Web服务器启动时,Web服务器会自动创建一个application对象。application对象一旦创建,它将一直存在,直到Web服务器关闭(session是在浏览器打开和关闭时存在)
访问同一个网站的客户都共享一个application对象,因此,application对象可以实现多客户间的数据共享。访问不同网站的客户,对应的application对象不同。
application对象的生命周期:从Web服务器启动,直到Web服务器关闭。
1、监听对象的创建和销毁 (继承后面的接口,重写接口中的方法),每个监听器 各自提供了两个方法:监听开始、监听结束的方法
request: ServletRequestListener(接口)(在请求网页时创建,网页请求完毕关闭)
session: HttpSessionListener(接口) (在浏览器第一次打开时创建,当浏览器关闭时,原session并没有被销毁,destory方法没有执行,而是等到timeout到期,才销毁这个session)
application: ServletContextListener(接口) (在服务端打开时创建,服务器关闭时销毁)
ServletContext在servlet容器启动时自动创建
2、监听对象中属性的变更 (继承后面的接口)
request: ServletRequestAttributeListener(接口)
session: HttpSessionAttributeListener(接口)
application: ServletContextAttributeListener(接口)
每个监听器 各自提供了三个方法:增加,替换,移除方法
application:String attrName = scae.getName(); //目前则会那个在操作做的属性名(获取属性名)
Object attrValue = scae.getServletContext().getAttribute(attrName); // 根据属性名获得属性值(通过名字找value)
application.setAttribute(“name”,“zs”);//第一次这是新增name属性
application.setAttribute(“name”,“ls”);//第二次这是替换name属性
application.removeAttribute(“name”,“ls”);//移除触发
session: String attrName = se.getName(); //目前则会那个在操作做的属性名(获取属性名)
Object attrValue = se.getSession().getAttribute(attrName); // 根据属性名获得属性值(通过名字找value)
session.setAttribute(“name”,“zs”);//第一次这是新增name属性
session.setAttribute(“name”,“ls”);//第二次这是替换name属性
request: String attrName = srae.getName(); //目前则会那个在操作做的属性名(获取属性名)
Object attrValue = srae.getServletRequest().getAttribute(attrName); // 根据属性名获得属性值(通过名字找value)
request.setAttribute(“name”,“zs”);//第一次这是新增name属性
request.setAttribute(“name”,“ls”);//第二次这是替换name属性
3、session的钝化和活化(Session 被钝化、活化的对象它的类必须实现Serializable 接口)
钝化:内存到硬盘,当服务器正常关闭时,还存活着的session(在设置时间内没有销毁) 会随着服务器的关闭被以文件(“SESSIONS.ser”)的形式存储在tomcat 的work 目录下,这个过程叫做Session 的钝化。
活化:硬盘到内存,当服务器再次正常开启时,服务器会找到之前的“SESSIONS.ser” 文件,从中恢复之前保存起来的Session 对象,这个过程叫做Session的活化。
session对象的四种状态
3.1监听session对象的绑定和解绑:HttpSessionBindingListener(只是钝化之前和活化之后的时刻,两个方法,绑定和解绑,一个类继承HttpSessionBindingListener,当这个类A的实例对象a进行session.setAttribute(“a”,a)时进行监听)
session.setAttribute(“a”,xxx) 对象a【绑定】到session中
session.removeAttribute(“a”) 将对象a从session中【解绑】
3.2监听session对象的钝化和活化:HttpSessionActivationListener(类实现该接口,监听该类产生示例对象钝化之前和活化之后的时刻)
钝化
活化
(钝化和活化时刻需要在 tomcat安装目录/conf/context.xml中配置
钝化和活化的本质就是系列化和反序列化,需要类继承Serializable接口
配置钝化活化:配置 tomcat安装目录/conf/context.xml
<Manager className="org.apache.catalina.session.PersistentManager"
saveOnRestart="true" maxActiveSessions="1">
<Store className="org.apache.catalina.session.FileStore" directory="a">
</Store>
</Manager>
<!--
className:固定写法不变
maxActiveSessions:最大空闲事件,超过该时间进行钝化
Store:className:执行者,固定写法
directory:session保存的地方,相对路径,相对于D:\tomcat-9\work\Catalina\localhost\项目名,也可以写绝对路径
-->
总结:钝化和活化 实际执行时通过context.xml中进行配置而执行
活化:session中获取某一个对象时,如果该对象不存在,则直接尝试从之前钝化的文件中去获取
HttpSessionActivationListener只是负责在session钝化和活化时予以监听。