手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网页制作>Javascript>列表

基于JMX通知框架的AJAX深度开发

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!



图2 使用HTMLAdaptor看到的MBean视图
  因而,UserWeb.broadcastState()方法被执行-它同步地通知所有的听者有关admin MBean的状态:

public void broadcastState() throws Exception {
 try {
  Notification n = new Notification("alert.broadcast", "ExampleApp:Name=UserWeb", 0);
  n.setUserData(new UserWeb(this));
  this.sendNotification(n);
 }
 catch (Exception e) {
  throw e;
 }
}



  因为数据在网络上是串行化传输的,所以这种并非暂时的对象图必须是可串行化的。

  六、使用听者接收来自MBean Props的通知

  所谓的事件听者就是ManagementListener Singleton。在管理服务器上的JMX通知框架远程调用ManagementListener中的handleNotification()方法-该方法存在于每个OLTP簇JVMs(它们是在服务器启动时注册的)上的每一个听者之中:

public void handleNotification(Notification notification, Object handback) {
System.out.println("Received alert: " notification.getType());
//取得来自通知的事件userdata
Object userData = notification.getUserData();
if (userData instanceof UserWeb) {
 //来自于destin8 Web
 UserWeb WebVo = (UserWeb)userData;
 UserWebMBeanHelper helper = MBeanHelperFactory.getWebHelper();
 //使用MbeanHelper从值对象获取数据并放入本地MBean中
 helper.setAlertMessage(WebVo.getAlertMessage());
 helper.setAlertStatus(WebVo.getAlertStatus());
 helper.setCallBack(WebVo.getCallBack());
 helper.setRefreshAlertStatus(WebVo.getRefreshAlertStatus());
}
}


  "master" UserWeb数据被置入本地用户Web MBean中-经由它的MBean助理来实现。因而,每个管理服务器被用master UserWeb状态所更新。这就是JMX元素所具有的功能。

  七、 管理状态的AJAX请求

  要使浏览器客户端支持AJAX,需要具备如下:

  ·main.jsp-被装配的JSP页面,它能够检查(JMX)警告状态并向服务器查询警告。这个.jsp文件包括admin.js

  ·admin.js-这是一个JavaScript实用程序,它使用XMLHttpRequest来向服务器查询管理状态,分析XML响应,并且重画屏幕的"status"区域

  被包含在main.jsp中的JavaScript描述如下:

<script type="text/javascript" src="./js/admin.js" ></script>


   不是连续地查询,而是只有启动浏览器警告功能时我们才进行查询。我们使用UserWebMBeanHelper来检查这个功能。如果该功能被启动,那么当页面加载时,JavaScript函数initAdmin()将被调用:

<%
if (MBeanHelperFactory.getWebHelper().isAlertEnabled()) {
%>
<body bgcolor="#F4FFE4" onload="initAdmin();">
<%
} else {
%>
<body bgcolor="#F4FFE4">
<%
}
%>


  重画的'status'屏幕区域定义如下:

<span id="adminBanner" class="style1"></span>


  "adminBanner"将被使用来标记可重画的区域-当分析XML响应并提取消息时。

  这个initAdmin()方法调度一个JavaScript方法trapAlert()-这个方法在callbackTimeout毫秒后执行:

function setCallback() {
 callBack = setTimeout('trapAlert()',callbackTimeout);
}
function initAdmin() {
 setCallback();
}


  注意,是由trapAlert()方法来实现启动XMLHttpRequest:

function trapAlert() {
 if (window.XMLHttpRequest) {
  req = new XMLHttpRequest();
 } else if (window.ActiveXObject) {
  req = new ActiveXObject("Microsoft.XMLHTTP");
 }
 req.onreadystatechange = processRequest;
 req.open("GET", './admin?reqid=0', true);
 req.send(null);
}


  在此,HTTP GET用来读数据(只使用了一个小的请求参数),并且目标是admin servlet。这个请求是异步的,并且当请求状态变化时,processRequest JavaScript函数被调用:

req.onreadystatechange = processRequest;


  在继续处理前等待一个响应,这看上去似乎非常合理;然而,如果一个网络或服务器问题导致一个事务无法完成,那么你要冒着使你的脚本挂起来的危险。相比之下,一个相应于onreadystatechange事件的异步调用更为灵活些。

  在请求完成时,processRequest事件处理器被调用:

function processRequest() {
 if (req.readyState == 4) {
  if (req.status == 200) {
   parseMessages();
  }
  ....
  setCallback();//只有完成时才这样做
 }
}


  列表1(见下载源码)显示了所有可用的状态码。当请求完成并且返回HTTP状态代码200(OK)时,parseMessages()方法被调用以从XML消息中提取数据。然后,再次调度trapAlert()方法。如果XML响应有一个不同的重试间隔,那么这个值会由parseMessages()函数设置。

  八、分析XML响应并重画屏幕

  parseMessages()函数首先提取XML响应

response = req.responseXML;


  然后,它提取有关警告状态,警告文本和重试间隔等的元素:

itemStatus = response.getElementsByTagName('status')[0].firstChild.nodeValue;
itemText = response.getElementsByTagName('textBody')[0].firstChild.nodeValue;
callbackTimeout = parseInt(response.getElementsByTagName('callBack')[0].firstChild.nodeValue);


  然后,警告文本被重画到adminBanner文档元素(见上):

document.getElementById("adminBanner").innerHTML= itemText;


  该警告消息显示在如图3所示的屏幕上。


图3 重画的屏幕

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!