之前想弄一个监控系统运行情况的程序,后来用了监控宝所以程序没有往下写,于是把程序改成了练习一下dwr推技术,也叫ajax反转。用到的版本应该是dwr2.4。程序是在服务启动的时候开启一个线程定时访问要监控的系统,然后把一些信息写到数据库。文章主要是记录在调用写到数据库的方法后(用到了spring拦截器),利用dwr把刚写入数据库的一些信息输出到页面。关于dwr的环境搭建就不说了,只说一下要用推(ajax反转)要在web.xml中如下配置:
<!-- dwr 配置开始-->
<!-- 1、piggyback方式
这是默认的方式。
如果后台有什么内容需要推送到前台,是要等到那个页面进行下一次ajax请求的时候,将需要推送的内容附加在该次请求之后,传回到页面。
只有等到下次请求页面主动发起了,中间的变化内容才传递回页面。
2、comet方式
当服务端建立和浏览器的连接,将页面内容发送到浏览器之后,对应的连接并不关闭,只是暂时挂起。如果后面有什么新的内容需要推送到客户端的时候直接通过前面挂起的连接再次传送数据。
服务器所能提供的连接数目是一定的,在大量的挂起的连接没有关闭的情况下,可能造成新的连接请求不能接入,从而影响到服务质量。
3、polling方式
由浏览器定时向服务端发送ajax请求,询问后台是否有什么内容需要推送,有的话就会由服务端返回推送内容。这种方式和我们直接在页面通过定时器发送ajax请求,然后查询后台是否有变化内容的实现是类似的。只不过用了dwr之后这部分工作由框架帮我们完成了。
-->
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<!-- DWR默认采用piggyback方式 -->
<!-- 使用polling和comet的方式 -->
<init-param>
<param-name>pollAndCometEnabled</param-name>
<param-value>true</param-value>
</init-param>
<!-- comet方式 -->
<!--
<init-param>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
-->
<!-- polling方式:在comet方式的基础之上,再配置以下参数 -->
<!--
<init-param>
<param-name>org.directwebremoting.extend.ServerLoadMonitor</param-name>
<param-value>org.directwebremoting.impl.PollingServerLoadMonitor</param-value>
</init-param>
-->
<!-- 毫秒数。页面默认的请求间隔时间是5秒 -->
<!--
<init-param>
<param-name>disconnectedTime</param-name>
<param-value>60000</param-value>
</init-param>
-->
<init-param>
<param-name>crossDomainSessionSecurity</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<listener>
<listener-class>
org.directwebremoting.servlet.EfficientShutdownServletContextAttributeListener
</listener-class>
</listener>
<listener>
<listener-class>org.directwebremoting.servlet.EfficientShutdownServletContextListener</listener-class>
</listener>
<!-- dwr 配置结束-->
spring的拦截器拦截器拦截的如下方法saveMonitor,此方法写入数据到数据库
<!-- 系统拦截器配置begin -->
<bean id="monitorInterceptor"
class="com.adtech.servlet.MonitorInterceptor">
<property name="methodNames">
<list>
<value>saveMonitor</value>
</list>
</property>
</bean>
<bean id="monitorInterceptorProxyCreator"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>commonService</value>
</list>
</property>
<property name="interceptorNames">
<value>monitorInterceptor</value>
</property>
</bean>
<!-- 系统拦截器配置end -->
拦截器代码如下:
package com.adtech.servlet;
import java.lang.reflect.Method;
import java.util.List;
import org.springframework.aop.AfterReturningAdvice;
import com.adtech.domain.Monitor;
import com.adtech.dwr.DwrPush;
/**
* 描述:
* copyright:adtech
* 作者:lujiangnan
* 创建时间:2011-7-31
*/
public class MonitorInterceptor implements AfterReturningAdvice{
//要拦截的方法名集合
private List<String> methodNames;
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
try {
//判断当前方法是否要拦截的方法
for (int i=0,j=methodNames.size();i<j;i++){
if (methodNames.get(i).equals(method.getName())){
if(DwrPush.wctx !=null){
DwrPush.sendMessage((Monitor)args[0]);
}
break;
}
}
//如果不是,直接返回
} catch (Exception e) {
}
}
public List<String> getMethodNames()
{
return methodNames;
}
public void setMethodNames(List<String> methodNames)
{
this.methodNames = methodNames;
}
}
dwr.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" " http://www.getahead.ltd.uk/dwr/dwr10.dtd ">
<dwr>
<allow>
<convert match="java.lang.Exception" converter="exception">
<param name='include' value='message'/>
</convert>
<convert match="java.lang.StackTraceElement" converter="bean"/>
<create creator="new" javascript="dwrPush" >
<param name="class" value="com.adtech.dwr.DwrPush" />
<include method="sendMessage"/>
</create>
<convert match="com.adtech.domain.Monitor" converter="bean" />
</allow>
</dwr>
以下便是dwr中的推方法,也是页面取数据的类,其中Monitor 是javabean.
/**
* 类描述: dwr推
* copyright:
* author:lujiangnan
* date:2011-7-27
* @version
*/
public class DwrPush{
public static WebContext wctx = null;
public static void sendMessage(Monitor monitor){
if(wctx == null){
wctx = WebContextFactory.get();
}
ScriptBuffer script = new ScriptBuffer();
//执行js 方法
if(monitor != null){
StringBuffer sb = new StringBuffer();
sb.append(monitor.getId()).append(",");
sb.append(monitor.getMessage()).append(",");
sb.append(monitor.getAccessTime()).append(",");
sb.append(monitor.getAccessName()).append(",");
sb.append(monitor.getTotalTime());
script.appendScript("receiveMessages('").appendData(sb.toString()).appendScript("');");
}
ServerContext sctx = ServerContextFactory.get(wctx.getServletContext());
Collection<ScriptSession> scriptSessions = sctx.getScriptSessionsByPage(wctx.getCurrentPage());
Util util = new Util(scriptSessions);
//可以设置样式等
// util.setStyle("test", "display", "none");
for (ScriptSession session : scriptSessions) {
session.addScript(script);
}
}
}
jsp页面主要代码如下:
<script>
function getData(){
dwrPush.sendMessage(null);
}
function receiveMessages(message) {
var msg = eval("("+message+")");
var temp = msg.split(",");
var num = temp[0];
var status = temp[1];
var accessTime = new Date(temp[2]).format('yyyy-MM-dd hh:mm:ss');
var accessName = temp[3];
var totalTime = temp[4];
var newRow = document.getElementById('tableData').insertRow(2);
var cell0 = newRow.insertCell(0);
var cell1 = newRow.insertCell(1);
var cell2 = newRow.insertCell(2);
var cell3 = newRow.insertCell(3);
var cell4 = newRow.insertCell(4);
cell0.innerHTML = num;
cell1.innerHTML = status;
if(status =="连接失败"){
cell1.style.color = 'red';
}
cell2.innerHTML = accessTime;
cell3.innerHTML = accessName;
cell4.innerHTML = totalTime;
}
Date.prototype.format = function(format){.......}
</script>
///此处是关键
<body onload="DWREngine.setActiveReverseAjax(true); getData();">
<div align="center">
<TABLE title=监控记录表 class="list" align="center" id="tableData">
<tr id="titleData"><td colspan="4">系统连接监控记录表</td><td colspan="1" onclick="getData()" style="size: 10px"><a href="<c:url value='/monitorResult/monitor.htm?action=getMonitorRecord'/>">更多</a></td></tr>
<TR id="headData" bgcolor="#fffce7" style="color:#968054">
<TD width="9%">序号</TD>
<TD width="20%">连接状态</TD>
<TD width="33%">访问时间</TD>
<TD width="22%">系统地址</TD>
<TD>响应时间</TD>
</TR>
</TABLE>
</DIV>
</body>
效果图为每次数据库有更新在表格数据的第一行添加一行,图:
[img]
[/img]
因为本身也不太懂,是做着玩的,希望朋友们可以指点改进一下。

- 大小: 29.4 KB
分享到:
相关推荐
DWR的主要功能之一是推送技术,这使得服务器可以主动向客户端发送数据,而不仅仅是响应客户端的请求。这种能力在创建实时更新的应用程序,如聊天应用,股票报价或者在线游戏时非常有用。 DWR推送技术的核心在于其...
在“dwr推技术反转聊天事例”中,我们将探讨DWR如何用于构建一个实时的聊天应用程序,并分析其中的关键知识点。 首先,我们需要理解DWR的核心概念。DWR允许JavaScript在浏览器端直接调用服务器端的Java方法,而无需...
DWR的独特之处在于它的“反转Ajax”(Reverse Ajax)概念,即服务器可以主动向客户端推送数据,而不仅仅是响应客户端的请求。这在股票实时显示等需要即时更新信息的应用场景中非常有用。 在"股票实时显示"的应用...
标题中的“dwr推技术官方实例”是指DWR提供的关于其推技术的实际操作示例,这些示例可能涵盖了DWR 2.0.4及以上版本的最新功能。由于高质量的实例资源在网络上可能不易找到,所以这份实例集合显得尤为宝贵。 描述中...
3. **DWR推送(Push)**:DWR的推送功能使得服务器可以主动向客户端发送数据,而不仅仅是响应客户端的请求。这在实现实时更新的应用场景中非常有用,比如聊天室、股票报价等。在`dwrengine.js`库中,可以找到关于...
标题 "dwr推模式" 涉及到的是Direct Web Remoting (DWR) 技术的一种工作模式,主要用于Web应用程序中的实时数据交互。DWR允许JavaScript与服务器端的Java代码进行交互,提供了异步更新页面的能力,极大地提高了用户...
总的来说,结合DWR和Spring,我们可以构建出一个高效、可扩展的消息推送系统,使得Web应用能够实时地与用户互动,提升用户体验。在实际项目中,还需要考虑安全性、错误处理、性能监控等方面,确保系统的稳定性和可靠...
本实例主要关注DWR的消息推送功能,这在创建实时更新的应用如聊天室、股票报价或在线游戏等场景中非常有用。 1. **DWR框架概述** DWR框架的核心是将Java对象暴露给JavaScript,使得前端可以像操作本地对象一样操作...
本文将详细介绍如何实现DWR的服务器推送功能。 一、DWR简介 DWR的核心功能是通过AJAX技术创建了一个JavaScript到Java的桥梁,使得开发者可以像操作本地对象一样操作远程服务器上的对象。它支持自动类型转换、错误...
通过DWR的Push技术,服务器可以主动向客户端推送消息,而不仅仅是响应客户端的请求。这种模式在群聊系统中特别有用,因为它可以让所有在线用户实时接收到新消息,无需频繁轮询服务器。 **3. 流技术** 在聊天系统中...
### dwr实现消息精确推送详解 #### 一、前言 Direct Web Remoting(DWR)是一种开源技术,它使得JavaScript可以直接调用服务器端的Java方法成为可能,从而简化了客户端与服务器之间的交互过程。本篇文章将详细介绍...
在这个名为“dwr推送demo”的项目中,开发者提供了一个适合初学者理解DWR推送功能的实例。 DWR的核心特性在于它的Ajax(异步JavaScript和XML)支持,它允许JavaScript直接调用服务器端的Java方法,而无需传统的HTTP...
实现了struts+hibernate+spring+dwr查询数据集合(方法返回List)的操作,客户端不用写太多代码就可以轻松实现ajax无刷新技术,这些繁多的代码都由dwr为我们完成!将下的文件用eclipse打开附加现有的数据库并将相关...
**Ajax与DWR技术详解** Ajax(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。这种技术的核心在于利用JavaScript进行异步数据交换,结合XML或者JSON格式的数据...
### dwr推模式学习资料知识点解析 #### 一、DWR简介及推模式概述 **Direct Web Remoting (DWR)** 是一个简化Ajax应用程序开发的Java框架,它允许客户端JavaScript直接调用服务器端的Java方法,从而使得开发更加...
在实际项目中,根据`dwrpush`这个文件名,我们可以推测这是一个关于DWR推送技术的示例或配置文件,可能包含了如何设置和使用DWR推送功能的代码示例。通过对这个文件的深入学习和实践,可以更好地理解和掌握DWR3的推...
要启用DWR 3的推送功能,首先需要在项目的Web-INF目录下创建`dwr.xml`配置文件,配置允许推送的Java类和方法。例如: ```xml <dwr> </dwr> ``` 这里,`MyPushService`是你创建的Java服务类,它将...
这个"DWR 推送例子, CHAT"是演示如何利用DWR实现双向通信,创建一个实时聊天应用的示例。下面将详细解释DWR的核心概念以及这个CHATDEMO的工作原理。 首先,理解DWR的基本工作方式非常重要。DWR通过在服务器端运行的...
DWR的核心特性是它支持AJAX(Asynchronous JavaScript and XML)以及服务器推送技术,极大地提高了Web应用的用户体验。 **服务器推送技术**: 传统的HTTP协议是基于请求-响应模型的,即客户端发起请求,服务器响应...
在这个"Dwr推数据Demo"中,我们看到的是一个基于DWR技术实现的多人聊天室。这个应用展示了如何利用DWR的实时双向通信能力来推送数据到客户端,从而实现聊天室的功能。 首先,让我们深入理解DWR的工作原理。DWR通过...