在 Servlet 技 术 中 我 们 学 习 了 request 、 session 、application 作用域对象,其主要作用是实现数据的在不同场景中的灵活流转。但是数据的具体流转过程我们是看不到的,比如作用域对象是什么时候创建和销毁的,数据是什么时候存取,改变和删除的。因为具体的流转过程看不到,所以也就无法再指定的时机对数据和对象进行操作,比如 session 销毁的时候,在线人数-1。
使用监听器
Servlet 监听器是 Servlet 规范中定义的一种特殊类,用于监听
ServletContext、HttpSession 和 ServletRequest 等域对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件。
ServletRequest和HttpServletRequest的区别:
HttpServletRequest和ServletRequest都是接口
HttpServletRequest继承自ServletRequest
HttpServletRequest比ServletRequest多了一些针对于Http协议的方法。如
getHeader(), getMethod(),getSession()等等。
客户端浏览器发出的请求被封装成为一个HttpServletRequest对象。
对象包含了客户端请求信息包括:
请求的地址,
请求的参数,
提交的数据,
上传的文件客户端的ip甚至客户端操作系统都包含在其内。
当HTTP转发给Web容器处理时,Web容器会收集相关信息,并产生HttpServletRequest对象,使用这个对象可以取得所有HTTP请求中的信息,可以在Servlet中进行处理,也可以转发给其他的Servlet/Jsp处理。
ServletRequestListener用于监听ServletRequest对象的创建和销毁,一个ServletRequest可以注册多个ServletRequestListener接口,request创建时调用requestInitialized(),request销毁时调用requestDestroyed()
Request
Session
Application
创建、销毁、属性改变事件
在事件发生之前,之后进行一些处理,比如统计在线人数
监听 request
监听 session
监听 application
统计网站在线人数
1.监听request的创建和销毁:ServletRequestListener
requestInitialized(ServletRequestEvent sre)---创建
requestDestroyed(ServletRequestEvent sre)--销毁
形参:
1,1.监听request作用域数据的变更:ServletRequestAttributeListener
attributeAdded(ServletRequestAttributeEvent srae)--添加
attributeRemoved(ServletRequestAttributeEvent srae) --移除
attributeReplaced(ServletRequestAttributeEvent srae) --修改
形参:
2.监听session的创建和销毁:HttpSessionListener
可用来做当前在线人数的统计功能
sessionCreated(HttpSessionEvent se)--创建
sessionDestroyed(HttpSessionEvent se)--销毁
形参:
2.1 attributeAdded(HttpSessionBindingEvent event)--增加
2.2 attributeRemoved(HttpSessionBindingEvent event)--移除
2.3 attributeReplaced(HttpSessionBindingEvent event)--修改
形参:
3.监听application对象的创建和销毁:ServletContextListener
可用来统计页面访问人数的操作或者投票操作
contextInitialized(ServletContextEvent sce)
contextDestroyed(ServletContextEvent sce)
形参:
2. 监听application对象的数据的变更:ServletContextAttributeListener
2.1 attributeAdded(ServletContextAttributeEvent event) --新增
2.2 attributeRemoved(ServletContextAttributeEvent event)--移除
2.3 attributeReplaced(ServletContextAttributeEvent event)--修改
形参:
<listener>
<listener-class>监听器类的包名和类名</listener-class>
</listener>
示例:
<listener>
<listener-class>com.lin.listener.MyListener</listener-class>
</listener>
每当有一个访问连接到服务器时,服务器就会创建一个session 来管理会话。那么我们就可以通过统计session 的数量来获得当前在线人数。
所以使用到的是HttpSessionListener √监听器。
public class MyListener implements HttpSessionListener,ServletContextListener{
//监听Application对象
@Override
public void contextInitialized(ServletContextEvent sce) {
//声明计数对象
int count=0;
//获取Application对象
ServletContext sc = sce.getServletContext();
sc.setAttribute("count",count);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
//监听Sesion对象
@Override
public void sessionCreated(HttpSessionEvent se) {
//获取Application对象中的计数器
ServletContext sc = se.getSession().getServletContext();
int count=(int) sc.getAttribute("count");
//计数器自增
++count;
//然后再将计数器存储到application中
sc.setAttribute("count", count);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
//获取Application对象中的计数器
ServletContext sc = se.getSession().getServletContext();
int count=(int) sc.getAttribute("count");
//计数器自减
--count;
//然后再将计数器存储到application中
sc.setAttribute("count", count);
}
}
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!