Reverse Ajax主要是在BS架构中,从服务器端向多个浏览器主动推数据的一种技术。它的一种实现就是客户端向服务器请求后,服务器不立即回应,从而导致一个http长连接,等到有更新数据的时候,再利用这个连接“主动”向客户端回送。
如果是初次接触,那一定要看下这篇文章
其中,详述了这种技术和JETTY服务器Continuations功能结合时的强大性能:运行在非阻塞方式下,当多个客户端请求时不会占用过多线程。
最后,此文申明DWR的实现已经天然使用了JETTY这一功能。所以使用DWR还是非常有好处的。如何使用及示例上面这篇文章已经有说明,下面就以我实际使用中碰到的问题和要点做个说明。
首先,说一下代码的组织和声明。
将使用到Reverse Ajax的代码归入一个类,比如是NotifyClient,并用spring的bean来声明。在将要用到这个类的地方(NodeSvcImpl类),也通过成员变量引入:
<bean id="notifyClient" class="com.hhh.nms.remote.NotifyClient">
bean>
<bean id="nodeSvcImpl" class="com.hhh.nms.magic.NodeSvcImpl">
<property name="notifyClient" ref="notifyClient"/>
bean>
然后在dwr.xml里这样声明:
<dwr>
<allow>
<create creator="spring" javascript="NotifyClient">
<param name="beanName" value="notifyClient"/>
<include method="updateService" />
create>
allow>
dwr>
其次一个要点是,如果你不是在DWR所开的线程中使用Reverse Ajax,那WebContextFactory.get()会返回空,这是因为只有DWR自己的线程才会初始化它。那如果你是在DWR之外使用,比如说收到JMS消息,或者UDP消息后,想通知所有客户端,你就要用到ServerContext。
要得到ServerContext,就需要用到spring的ServletContextAware接口,下面是完整代码:
package com.hhh.nms.remote;
import org.apache.log4j.Logger;
import javax.servlet.ServletContext;
import org.springframework.web.context.ServletContextAware;
import java.util.Collection;
import org.directwebremoting.ScriptBuffer;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.WebContext;
import org.directwebremoting.WebContextFactory;
import org.directwebremoting.ServerContext;
import org.directwebremoting.ServerContextFactory;
import org.directwebremoting.proxy.dwr.Util;
public class NotifyClient implements ServletContextAware {
static Logger logger = Logger.getLogger (NotifyClient.class.getName());
private ServletContext servletContext = null;
public void setServletContext( ServletContext servletContext )
{
this.servletContext = servletContext;
}
public int serviceUpdate (String str1, String str2) {
logger.info ("entered");
logger.info ("WebContext1"+servletContext);
ServerContext ctx = ServerContextFactory.get(servletContext );
// Generate JavaScript code to call client-side
// WebContext ctx = WebContextFactory.get();
logger.info ("WebContext"+ctx);
if (ctx != null) {
//String currentPage = ctx.getCurrentPage();
//logger.info ("current page:" + currentPage);
ScriptBuffer script = new ScriptBuffer();
script.appendScript("updatePoint(")
.appendData(str1)
.appendScript(",")
.appendData (str2)
.appendScript(");");
// Push script out to clients viewing the page
Collection sessions =
ctx.getScriptSessionsByPage("/ebnms/index.eb?do=dwrtest");
logger.info ("jsp session size:" + sessions.size ());
// or
Collection sessions2 =
ctx.getAllScriptSessions ();
logger.info ("all session size:" + sessions2.size ());
for (ScriptSession session : sessions2) {
session.addScript(script);
}
}
return 0;
}
}
另外,ScriptBuffer的appendScript方法是插入原始字串,appendData会根据参数类型做相应转换。
分享到:
相关推荐
即时通讯DWR Reverse Ajax
dwr reverseajax clockms
dwr reverseajax ClockLogging
dwr实现ajax功能ajax+dwr.........................
Server Side Reverse Ajax Clock
实现一个简单的Web版的聊天功能,Java使用开源框架最新版本的dwr3,包括相应的JSP页面的实现。
dwr反向Ajax的三种情况dwr反向Ajax的三种情况
两个例子reverse ajax的实现 博文链接:https://yaojialing.iteye.com/blog/716094
dwr反向ajax使用,即时提醒。WEB网页实现右下角时时弹出提醒DIV
DWR实现AJAX验证实例,通过输入的数查询数据库字段是否存在。在前台显示。eclips实现。
dwr的使用和ajax的使用demo
在做公司OA时遇到了服务器向客户端发信息的屏障,后来百度搜了下,发现了DWR反转可以实现。这是自己做的一个小东西,大家可以下载看看!共同学习!呵呵!
AJAX DWR教程AJAX DWR教程AJAX DWR教程AJAX DWR教程AJAX DWR教程AJAX DWR教程AJAX DWR教程AJAX DWR教程
这篇文章让读者看到了一个使用了DWR的Web应用是如何一步步建立的。我会展示创建这个简单的示例应用的必要的细节,这个应用是可下载的并且可以在你的环境中布署来看看DWR如何工作。
这两本书来的也不容易,所以想跟大家分享一下,想学着两个技术的,看完绝对不后悔。
struts2使用Dwr实现Ajax异步提交信息的使用步骤和配置详解。
这是我用dwr做的一个例子,非常好懂,就是一个文本框,旁边一个按钮,连接了mysql数据库,在文本框里输入注册名,如果数据库里面已有,就会在旁边提示出来,用的是DWR技术,DER是ajax技术里的一个框架,简单易学,只要看了我这...
使用DWR开发AJAX For J2EE
NULL 博文链接:https://ping2010.iteye.com/blog/1680406
dwr demo ajax dwr demo ajax dwr demo ajax dwr demo ajax