servlet监听器实现在线人数统计

一.准备知识

  1. servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。
  2. filter:filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。
  3. listener:监听器,从字面上可以看出listener主要用来监听只用。通过listener可以监听web服务器中某一个执行动作,并根据其要求作出相应的响应。通俗的语言说就是在application,session,request三个对象创建消亡或者往其中添加修改删除属性时自动执行代码的功能组件。
  4. servlet:servlet的生命周期始于它被装入web服务器的内存时,并在web服务器终止或重新装入servlet时结束。servlet一旦被装入web服务器,一般不会从web服务器内存中删除,直至web服务器关闭或重新结束。
    (1)、装入:启动服务器时加载Servlet的实例;
    (2)、初始化:web服务器启动时或web服务器接收到请求时,或者两者之间的某个时刻启动。初始化工作有init()方法负责执行完成;
    (3)、调用:从第一次到以后的多次访问,都是只调用doGet()或doPost()方法;
    (4)、销毁:停止服务器时调用destroy()方法,销毁实例。
  5. filter:(一定要实现javax.servlet包的Filter接口的三个方法init()、doFilter()、destroy(),空实现也行)。
    (1)、启动服务器时加载过滤器的实例,并调用init()方法来初始化实例;
    (2)、每一次请求时都只调用方法doFilter()进行处理;
    (3)、停止服务器时调用destroy()方法,销毁实例。
  6. listener:类似于servlet和filter
    web.xml 的加载顺序是:context- param -> listener -> filter –> servlet

二.预备知识 
       通过ServletContext 的实例可以存取应用程序的全局对象以及初始化阶段的变量。 在JSP文件中,application 是 ServletContext 的实例,由JSP容器默认创建。Servlet 中调用 getServletContext()方法得到 ServletContext 的实例。
       注意:全局对象即Application范围对象,初始化阶段的变量指在web.xml中,经由<context-param>元素所设定的变量,它的范围也是Application范围,例如:

<context-param> 
<param-name>Name</param-name> 
<param-value>browser</param-value> 
</context-param> 

        当容器启动时,会建立一个Application范围的对象,若要在JSP网页中取得此变量时:

String name = (String)application.getInitParameter("Name"); 
${initPara.name} 
//若是在Servlet中,取得Name的值方法: 
String name = (String)ServletContext.getInitParameter("Name"); 

          目前Servlet2.4和JSP2.0总共有8个监听器接口和6个Event类,如下:

           突然不支持图片发布, 笔者也很郁闷,需要的读者自己查吧。。。

三.统计在线人数

       1.第一种方式

package webbook.chapter14;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class CounterListener implements HttpSessionListener {
	private static long onlineNumber = 0;
	public static long getOnlineNumber() {
		return onlineNumber;
	}
	public void sessionCreated(HttpSessionEvent se) {
		onlineNumber++;
	}
	public void sessionDestroyed(HttpSessionEvent se) {
		onlineNumber--;
	}
}
当前应用中一共有<%=CounterListener.getOnlineNumber()%>人在线<br>

        统计的数字并不完全准确,因为可能用户下线了,session还没失效,怎么办呢?俺也不知道。。

        2.第二种方式

            显示谁在线,使用ArrayList,创建session时加入,销毁时删除(remove)。

四.结束语

        好好学习,天天向上。。。。。

你可能感兴趣的:(servlet)