引用 DWR Reverse Ajax功能实践的要点
引用 火炎焱燚的DWR Reverse Ajax功能实践的要点 Reverse Ajax主要是在BS架构中,从服务器端向多个浏览器主动推数据的一种技术。它的一种实现就是客户端向服务器请求后,服务器不立即回应,从而导致一个http长连接,等到有更新数据的时候,再利用这个连接“主动”向客户端回送。 如果是初次接触,那一定要看下这篇文章 其中,详述了这种技术和JETTY服务器Continuations功能结合时的强大性能:运行在非阻塞方式下,当多个客户端请求时不会占用过多线程。 最后,此文申明DWR的实现已经天然使用了JETTY这一功能。所以使用DWR还是非常有好处的。如何使用及示例上面这篇文章已经有说明,下面就以我实际使用中碰到的问题和要点做个说明。 首先,说一下代码的组织和声明。 将使用到Reverse Ajax的代码归入一个类,比如是NotifyClient,并用spring的bean来声明。在将要用到这个类的地方(NodeSvcImpl类),也通过成员变量引入: <beanid="notifyClient"class="com.hhh.nms.remote.NotifyClient"> </bean>
<beanid="nodeSvcImpl"class="com.hhh.nms.magic.NodeSvcImpl"> <propertyname="notifyClient"ref="notifyClient"/> </bean> 然后在dwr.xml里这样声明: <dwr> <allow> <createcreator="spring"javascript="NotifyClient"> <paramname="beanName"value="notifyClient"/> <includemethod="updateService"/> </create> </allow> </dwr> 其次一个要点是,如果你不是在DWR所开的线程中使用Reverse Ajax,那WebContextFactory.get()会返回空,这是因为只有DWR自己的线程才会初始化它。那如果你是在DWR之外使用,比如说收到JMS消息,或者UDP消息后,想通知所有客户端,你就要用到ServerContext。 要得到ServerContext,就需要用到spring的ServletContextAware接口,下面是完整代码: packagecom.hhh.nms.remote; importorg.apache.log4j.Logger; importjavax.servlet.ServletContext; importorg.springframework.web.context.ServletContextAware; importjava.util.Collection; importorg.directwebremoting.ScriptBuffer; importorg.directwebremoting.ScriptSession; importorg.directwebremoting.WebContext; importorg.directwebremoting.WebContextFactory; importorg.directwebremoting.ServerContext; importorg.directwebremoting.ServerContextFactory; importorg.directwebremoting.proxy.dwr.Util; publicclassNotifyClientimplementsServletContextAware{ staticLoggerlogger=Logger.getLogger(NotifyClient.class.getName()); privateServletContextservletContext=null; publicvoidsetServletContext(ServletContextservletContext) { this.servletContext=servletContext; }
publicintserviceUpdate(Stringstr1,Stringstr2){ logger.info("entered");
logger.info("WebContext1"+servletContext);
ServerContextctx=ServerContextFactory.get(servletContext); //GenerateJavaScriptcodetocallclient-side //WebContextctx=WebContextFactory.get(); logger.info("WebContext"+ctx); if(ctx!=null){ //StringcurrentPage=ctx.getCurrentPage(); //logger.info("currentpage:"+currentPage);
ScriptBufferscript=newScriptBuffer(); script.appendScript("updatePoint(") .appendData(str1) .appendScript(",") .appendData(str2) .appendScript(");");
//Pushscriptouttoclientsviewingthepage Collection<ScriptSession>sessions= ctx.getScriptSessionsByPage("/ebnms/index.eb?do=dwrtest"); logger.info("jspsessionsize:"+sessions.size());
//or Collection<ScriptSession>sessions2= ctx.getAllScriptSessions(); logger.info("allsessionsize:"+sessions2.size());
for(ScriptSessionsession:sessions2){ session.addScript(script); } } return0; } } 另外,ScriptBuffer的appendScript方法是插入原始字串,appendData会根据参数类型做相应转换。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |