天天看點

利用Servlet監聽器統計線上人數

 監聽器的作用是監聽web容器的有效事件,它由Servlet空器管理,利用Listener接口監聽某個執行程式,并根據該程式的需求做出适應的響應。下面介紹一個應用Servlet監聽實作統計線上人數的執行個體。

整體結構:

利用Servlet監聽器統計線上人數

步驟:

(1)建立UserInfoList.java類檔案,主要用來存儲線上使用者和對線上使用者進行具體操作:

package com.lixiyu;
import java.util.Vector;
public class UserInfoList {
public static UserInfoList user= new UserInfoList();
@SuppressWarnings("rawtypes")
private Vector vector=null;
/*利用private調用構造函數,
 * 防止被外界産生新的instance對象
 */
@SuppressWarnings("rawtypes")
public UserInfoList(){
    this.vector=new Vector();
}
//外界使用的instance對象
public static UserInfoList getInstance(){
    return user;
}
//增加使用者
@SuppressWarnings("unchecked")
public boolean addUserInfo(String user){
    if(user!=null){
        this.vector.add(user);
        return true;
    }else{
        return false;
    }
}
//擷取使用者清單
@SuppressWarnings("rawtypes")
public Vector getList(){
    return vector;
}
//移除使用者
public void removeUserInfo(String user){
    if(user!=null){
        vector.removeElement(user);
    }
}
}      

(2)建立UserInfoTrace.java類檔案,主要實作valueBound(HttpSessionBindingEvent arg0)和valueUnbound(HttpSessionBindingEven arg0)兩個方法。當有對象加入session時,valueBound()方法會被自動執行;當有對象從session中移除時,valueUnbound()方法會被自動執行,在valueBound()和valueUnbound()方法中都加入了輸出資訊的功能,可使使用者在控制台更清楚地了解執行過程。

利用Servlet監聽器統計線上人數

代碼:

package com.lixiyu;
import javax.servlet.http.HttpSessionBindingEvent;
public class UserInfoTrace implements javax.servlet.http.HttpSessionBindingListener{
private String user;
private UserInfoList container=UserInfoList.getInstance();
public UserInfoTrace(){
    user="";
}
//設定線上監聽人員
public void setUser(String user){
    this.user=user;
}
//擷取線上監聽
public String getUser(){
    return this.user;
}
@Override
public void valueBound(HttpSessionBindingEvent arg0) {
    // TODO Auto-generated method stub
    System.out.println("上線"+this.user);
}
@Override
public void valueUnbound(HttpSessionBindingEvent arg0) {
    // TODO Auto-generated method stub
    System.out.println("下線"+this.user);
    if(user!=""){
        container.removeUserInfo(user);
}
}
}      

(3)建立showUser.jsp頁面檔案,在頁面中設定session的setMaxInactiveInterval()為10秒,這樣可以縮session的生命周期:

<%@ page contentType="text/html; charset=UTF-8" language="java" import="java.sql.*" errorPage="" %>
<%@ page import="java.util.*"%>
<%@ page import="com.lixiyu.*"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>使用監聽檢視線上使用者</title>
<link href="css/style.css" rel="stylesheet" type="text/css">
</head>
<%
UserInfoList list=UserInfoList.getInstance();
UserInfoTrace ut=new UserInfoTrace();
String name=request.getParameter("user");
ut.setUser(name);
session.setAttribute("list",ut);
list.addUserInfo(ut.getUser());
session.setMaxInactiveInterval(10);
%>
<body>
<div align="center">
<table width="506" height="230" border="0" cellpadding="0" cellspacing="0" background="p_w_picpath/background2.jpg">
  <tr>
    <td align="center"><br><br>
                                                                                                                      
 <textarea rows="8" cols="20">
<%
Vector vector=list.getList();
if(vector!=null&&vector.size()>0){
for(int i=0;i<vector.size();i++){
  out.println(vector.elementAt(i));
}
}
%>
</textarea><br><br>
 <a href="loginOut.jsp">傳回</a>
                                                                                                                      
 </td>
  </tr>
</table>
</div>
</body>
</html>      

(4)編寫一個過濾器CharactorFilter確定不會亂碼,編寫MyContentListener實作監聽接口并配置web.xml檔案映射。

CharactorFilter

package com.lixiyu;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
// 字元編碼過濾器
public class CharactorFilter implements Filter {
    // 字元編碼
    String encoding = null;
    @Override
    public void destroy() {
        encoding = null;
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // 判斷字元編碼是否為空
        if(encoding != null){
            // 設定request的編碼格式
            request.setCharacterEncoding(encoding);
            // 設定response字元編碼
            response.setContentType("text/html; charset="+encoding);
        }
        // 傳遞給下一過濾器
        chain.doFilter(request, response);
    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 擷取初始化參數
        encoding = filterConfig.getInitParameter("encoding");
    }
}      

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
  <display-name>web</display-name>
 <!-- 聲明過濾器 -->
    <filter>
        <!-- 過濾器名稱 -->
        <filter-name>CharactorFilter</filter-name>
        <!-- 過濾器的完整類名 -->
        <filter-class>com.lixiyu.CharactorFilter</filter-class>
        <!-- 初始化參數 -->
        <init-param>
            <!-- 參數名 -->
            <param-name>encoding</param-name>
            <!-- 參數值 -->
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <!-- 過濾器映射 -->
    <filter-mapping>
        <!-- 過濾器名稱 -->
        <filter-name>CharactorFilter</filter-name>
        <!-- URL映射 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  <servlet>
    <description>Added by JBuilder to compile JSPs with debug info</description>
    <servlet-name>debugjsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <init-param>
      <param-name>classdebuginfo</param-name>
      <param-value>true</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>debugjsp</servlet-name>
    <url-pattern>*.jsp</url-pattern>
  </servlet-mapping>
<listener>
     <listener-class>com.lixiyu.MyContentListener</listener-class>
</listener>
</web-app>      

(5)編寫登陸頁index.jsp和登出頁loginOut.jsp

index.jsp

<%@ page contentType="text/html; charset=UTF-8" language="java" import="java.sql.*" errorPage="" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>使用監聽檢視線上使用者</title>
</head>
<script language="javascript">
function checkEmpty(form){
for(i=0;i<form.length;i++){
if(form.elements[i].value==""){
alert("表單資訊不能為空");
return false;
}
}
}
</script>
<link href="css/style.css" rel="stylesheet" type="text/css">
<body>
<div align="center">
  <table width="506" height="170" border="0" cellpadding="0" cellspacing="0" background="p_w_picpath/background1.jpg">
    <tr>
      <td align="center">
        <form name="form" method="post" action="showUser.jsp" onSubmit="return checkEmpty(form)">
    <input type="text" name="user"><br><br>
    <input type="submit" name="Submit" value="登入">
  </form>
                                                                                                     
                                                                                                     
                                                                                                     
      </td>
    </tr>
  </table>
</div>
</body>
</html>      

loginOut.jsp

<%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %>
<%
         session.invalidate();
 out.println("<script>parent.location.href='index.jsp';</script>");
%>      

最後運作本執行個體,結果如圖所示:

當輸入為空會提示:

利用Servlet監聽器統計線上人數
利用Servlet監聽器統計線上人數

繼續閱讀