欢迎来到HELLO素材网! 南京网站制作选择顺炫科技
丰富的DIV CSS模版、JS,jQuery特效免费提供下载
当前位置:主页 > 建站教程 > 网站制作教程 >

利用xmlhttp和Java session监听改善站内消息系统

发表于2019-04-24 13:12| 次阅读| 来源网络整理| 作者session

摘要:利用xmlhttp和Java session监听改善站内消息系统

利用xmlhttp和Java session监听改善站内消息系统

  这个标题含有许多需求解释的概念,最容易阐明的是“站内消息”,这是很多论坛都有的性能,可能经过web向其余的在线用户发送消息,很多用户都利用过。站内消息的第一个益处是大家都不需求装置客户端,你不用知道对方的MSN或许QQ,就能与他联络,称赞他的观点或许是给他一顿臭骂。第二个益处是客户治理方便,应用session来维护在线名单,各种脚本都已经把session操作封装得很易用了,不用像其余无形状的即时通讯工具(比如利用UDP通讯的工具)一样,要费一些脑细胞来处理在线名单的成绩。缺陷嘛,就是实时性不好,普通是在用户跳转或许刷新页面能力探测消息、更新在线名单。
  
  Session监听嘛,没什么好解释的,java提供了很灵敏的事情机制来监听session,可能监听session的创建和销毁,监控session所携带数据的创建、变化和销毁,可能监听session的锐化和钝化(了解对象序列化的兄弟应该知道这个),其余的平台是个什么情况我不太清楚,预计也差不多吧。假设可以对一切客户的session停止监控,就不用再去操作费事而风险的Application了。
  
  Xmlhttp是MS推的一项技术,性能很简单,可能做很多事件,比如客户端可能在简略的HTML中打开HTTP衔接,自动向server申请数据并获得前往数据,是DOM技术一个十分重要的运用,应用它来写无刷新的动态页面简直是soeasy,做过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接口,它的作用是计算以后有多少个在线用户:
  
  
  /**
  *@Authorbromon
  *2004-6-12
  */
  packageorg.bromon.test;
  
  importjavax.servlet.*;
  importjavax.servlet.http.*;
  
  publicclassSessionCountimplementsHttpSessionListener
  {
  privatestaticintcount=0;
  
  publicvoidsessionCreated(HttpSessionEventse)
  {
  count++;
  System.out.println(“session创建:”+newjava.util.Date());
  }
  
  publicvoidsessionDestroyed(HttpSessionEventse)
  {
  count--;
  System.out.println(“session销毁:”+newjava.util.Date());
  }
  
  publicstaticintgetCount()
  {
  return(count);
  }
  }
  
  
  
  怎样样,是不是了如指掌?count被定义为static,是由于要保证整个系统只要这一个count。假设你真实不释怀,可能把它写成一个单例类。
  
  然后在web.xml中申明这个监听器:
  <listener>
  <listener-class>
  org.bromon.test.SessionCount
  </listener-class>
  </listener>
  
  编写一个测试页面test.jsp,内容是获得count:
  <%
  intcount=org.bromon.test.SessionCount.getCount();
  out.println(count);
  %>
  
  需求留意的是,这里基本不触及任何session的操作。重启动Appserver,试着衔接test.jsp,可能看到监听器已经末尾工作。
  
  2、Attribute监听
  作为一个站内消息系统,一定要获得一切登陆者的ID,才有能够互发消息。这就触及Attribute监听。假定咱们写了个用户登陆的模块,用户经过身份验证之后会产生一个session,保存它的相干信息,比如:
  
  //check.jsp
  <%
  Stringname=request.getParameter(“name”);
  Name=newString(name.getBytes(“ISO8859-1”));
  session.setAttribute(“user”,name);
  %>
  
  
  做过jsp的兄弟应该对这段代码再相熟不过了,下面写个监听器来监听用户登陆,把一切用户的ID保存到一个List当中,这个监听器实作HttpSessionAttributeListener接口:
  
  
  /**
  *@Authorbromon
  *2004-6-12
  */
  packageorg.bromon.test;
  
  importjavax.servlet.*;
  importjavax.servlet.http.*;
  importjava.util.*;
  
  publicclassOnlineListimplementsHttpSessionAttributeListener
  {
  privatestaticListlist=newArrayList();
  
  publicvoidattributeAdded(HttpSessionBindingEventse)
  {
  if(“user”.equals(se.getName()))
  {
  list.add(se.getValue());
  }
  }
  
  publicvoidattributeRemoved(HttpSessionBindingEventse)
  {
  if(“user”.equals(se.getName()))
  {
  list.remove(se.getValue());
  }
  }
  
  publicvoidattributeReplaced(HttpSessionBindingEventse){}
  
  publicstaticListgetList()
  {
  return(list);
  }
  }
  
  
  写个简略的jsp来失去用户列表:
  <%
  java.util.Listlist=org.bromon.test.OnlineList.getList();
  out.println(“共有”+list.size()+”名用户已登陆:”);
  for(intI=0;I<lise.size();i++)
  {
  out.println(list.get(i));
  }
  %>
  
  兴许你说,这有什么神奇呢,监听session而已,不着急,看看xmlhttp。
  
  二、XMLHTTP
  
  XMLHTTP的用处很多,这里只说咱们需求的,就是无刷新的与server通讯,看这段代码:
  
  
  <scriptlanguage="javascript">
  xml=newActiveXObject("Microsoft.XMLHTTP");
  varpost="";//结构要携带的数据
  xml.open("POST",":7001/TestWL/index.jsp",false);//利用POST方法打开一个到服务器的衔接,以异步模式通讯
  xml.setrequestheader("content-length",post.length);
  xml.setrequestheader("content-type","application/x-www-form-urlencoded");
  xml.send(post);//发送数据
  varres=xml.responseText;//接纳服务器前往的数据
  document.write(res);
  </script>
  
  
  
  释然开朗,这段代码就是打开一个HTTP衔接,以标准的HTTP格式传递数据,假设你青睐,可能用XML的格式来传递。更改一下xml对象的结构模式就可能兼容Mozilla和Netscape。下面来写一个轮询,每隔一段工夫刷新一次用户列表,当然,是不需求刷新页面的:
  
  
  <html>
  <head><title>探测器</title>
  <scriptlanguage="javascript">
  functiondetect()
  {
  xml=newActiveXObject("Microsoft.XMLHTTP");
  varpost="";//结构要携带的数据
  xml.open("POST",":7001/TestWL/index.jsp",false);//利用POST方法打开一个到服务器的衔接,以异步模式通讯
  xml.setrequestheader("content-length",post.length);
  xml.setrequestheader("content-type","application/x-www-form-urlencoded");
  xml.send(post);//发送数据
  varres=xml.responseText;//接纳服务器前往的数据
  list.innerText=res;
  setTimeout(“detect()”,5000);//每隔5秒钟轮询一次
  }
  </script>
  <bodyonload=”detect()”>
  <aid=”list”></a>
  </body>
  </html>
  这样的通讯模式数据量很小,不用重新传递整个页面,5秒钟轮一次,一般PC也能接受较大的在线数。结构一个探测器来监听在线列表和消息,效果是很好的,即使你的客户坐在电脑前袖手旁观,键鼠都不碰一下,也能保证数据即时传递,页面也不会发生跳转和刷新。
  
  Session监听加上XMLHTTP通讯,开发一个较为欠缺的站内消息系统真实易如反掌