用xmlhttp和Java session改善站內訊息

來源:互聯網
上載者:User
session|xml

這個題目含有許多需要解釋的概念,最容易說明的是“站內訊息”,這是很多論壇都有的功能,可以通過web向其他的線上使用者發送訊息,很多使用者都使用過。站內訊息的第一個好處是大家都不需要安裝用戶端,你不用知道對方的MSN或者QQ,就能與他聯絡,稱讚他的觀點或者是給他一頓臭罵。第二個好處是客戶管理方便,利用session來維護線上名單,各種指令碼都已經把session操作封裝得很易用了,不用像其他無狀態的即時通訊工具(比如使用UDP通訊的工具)一樣,要費一些腦細胞來解決線上名單的問題。缺點嘛,就是即時性不好,一般是在使用者跳轉或者重新整理頁面才能探測訊息、更新線上名單。

Session監聽嘛,沒什麼好解釋的,java提供了很靈活的事件機制來監聽session,可以監聽session的建立和銷毀,監控session所攜帶資料的建立、變化和銷毀,可以監聽session的銳利化和鈍化(瞭解對象序列化的兄弟應該知道這個),其他的平台是個什麼情況我不太清楚,估計也差不多吧。如果能夠對所有客戶的session進行監控,就不用再去操作麻煩而危險的Application了。

Xmlhttp是MS推的一項技術,功能很複雜,可以做很多事情,比如用戶端可以在簡單的HTML中開啟HTTP串連,主動向server請求資料並獲得返回資料,是DOM技術一個非常重要的應用,利用它來寫無重新整理的動態網頁面簡直是so easy,做過web開發的兄弟應該明白它的意義有多麼重大。

一、 session監聽

servlet中對session的監聽有很多介面,功能很靈活,最常用的是監聽Session和Attribute。這裡要澄清一下概念,servlet中的session監聽和Attribute監聽含義有差別,session監聽指的不是我們一般所理解的放置一個session或者銷毀一個session,這是Attribute監聽的功能,因為servlet中放置session的文法是session.setAttribute(“session名”,要放入的對象)。而session監聽,監聽的是HTTP串連,只要有使用者與server串連,就算串連的是一個空白的jsp頁面,也會觸發session事件,所以此處的session實際上指的是connection,用來統計當前線上使用者數最合適了。不知道我說清楚了沒有。下面分別講解這兩種監聽方式。

1、 session監聽

首先編寫一個session監聽類,實作HttpSessionListener介面,它的作用是計算當前有多少個線上使用者:
/*
*@Author bromon
*2004-6-12
*/
package org.bromon.test;

import javax.servlet.*;
import javax.servlet.http.*;

public class SessionCount implements HttpSessionListener
{
private static int count=0;

public void sessionCreated(HttpSessionEvent se)
{
count++;
System.out.println(“session建立:”+new java.util.Date());
}

public void sessionDestroyed(HttpSessionEvent se)
{
count--;
System.out.println(“session銷毀:”+new java.util.Date());
}

public static int getCount()
{
return(count);
}
}

怎麼樣,是不是一目瞭然?count被定義為static,是因為要保證整個系統只有這一個count。如果你實在不放心,可以把它寫成一個單例類。

然後在web.xml中聲明這個監聽器:
< listener >
< listener-class >
org.bromon.test.SessionCount
< /listener-class >
< /listener >

編寫一個測試頁面test.jsp,內容是獲得count:
< %
int count=org.bromon.test.SessionCount.getCount();
out.println(count);
% >
需要注意的是,這雷根本不涉及任何session的操作。重啟動App server,試著串連test.jsp,可以看到監聽器已經開始工作。

2、 Attribute監聽
作為一個站內訊息系統,肯定要獲得所有登陸者的ID,才有可能互發訊息。這就涉及Attribute監聽。假設我們寫了個使用者登陸的模組,使用者通過身分識別驗證之後會產生一個session,儲存它的相關資訊,比如:
//check.jsp
< %
String name=request.getParameter(“name”);
Name=new String(name.getBytes(“ISO8859-1”));
session.setAttribute(“user”,name);
% >

做過jsp的兄弟應該對這段代碼再熟悉不過了,下面寫個監聽器來監聽使用者登陸,把所有使用者的ID儲存到一個List當中,這個監聽器實作HttpSessionAttributeListener介面:

/*
*@Author bromon
*2004-6-12
*/
package org.bromon.test;

import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

public class OnlineList implements HttpSessionAttributeListener
{
private static List list=new ArrayList();

public void attributeAdded(HttpSessionBindingEvent se)
{
if(“user”.equals(se.getName()))
{
list.add(se.getValue());
}
}

public void attributeRemoved(HttpSessionBindingEvent se)
{
if(“user”.equals(se.getName()))
{
list.remove(se.getValue());
}
}

public void attributeReplaced(HttpSessionBindingEvent se){}

public static List getList()
{
return(list);
}
}

寫個簡單的jsp來得到使用者列表:
< %
java.util.List list=org.bromon.test.OnlineList.getList();
out.println(“共有”+list.size()+”名使用者已登陸:”);
for(int I=0;I< lise.size();i++)
{
out.println(list.get(i));
}
% >

也許你說,這有什麼神奇呢,監聽session而已,不著急,看看xmlhttp。

二、 XMLHTTP

XMLHTTP的用處很多,這裡只說我們需要的,就是無重新整理的與server通訊,看這段代碼:
< script language="javascript" >
xml = new ActiveXObject("Microsoft.XMLHTTP");
var post=" ";//構造要攜帶的資料
xml.open("POST","http://localhost:7001/TestWL/index.jsp",false);//使用POST方法開啟一個到伺服器的串連,以非同步方式通訊
xml.setrequestheader("content-length",post.length);
xml.setrequestheader("content-type","application/x-www-form-urlencoded");
xml.send(post);//發送資料
var res = xml.responseText;//接收伺服器返回的資料
document.write(res);
< /script >

豁然開朗,這段代碼就是開啟一個HTTP串連,以標準的HTTP格式傳遞資料,如果你喜歡,可以用XML的格式來傳遞。更改一下xml對象的構造方式就可以相容Mozilla和Netscape。下面來寫一個輪詢,每隔一段時間重新整理一次使用者列表,當然,是不需要重新整理頁面的:

< html >
< head >< title >探測器< /title >
< script language="javascript" >
function detect()
{
xml = new ActiveXObject("Microsoft.XMLHTTP");
var post=" ";//構造要攜帶的資料
xml.open("POST","http://localhost:7001/TestWL/index.jsp",false);//使用POST方法開啟一個到伺服器的串連,以非同步方式通訊
xml.setrequestheader("content-length",post.length);
xml.setrequestheader("content-type","application/x-www-form-urlencoded");
xml.send(post);//發送資料
var res = xml.responseText;//接收伺服器返回的資料
list.innerText=res;
setTimeout(“detect()”,5000);//每隔5秒鐘輪詢一次
}
< /script >
< body onload=”detect()” >
< a id=”list” >< /a >
< /body >
< /html >

這樣的通訊方式資料量很小,不用重新傳遞整個頁面,5秒鐘輪一次,普通PC也能承受較大的線上數。構造一個探測器來監聽線上列表和訊息,效果是很好的,即使你的客戶坐在電腦前袖手旁觀,鍵鼠都不碰一下,也能保證資料即時傳遞,頁面也不會發生跳轉和重新整理。

Session監聽加上XMLHTTP通訊,開發一個較為完善的站內訊息系統實在易如反掌。



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。