加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

引用 DWR Reverse Ajax功能实践的要点

发布时间:2020-12-16 00:43:44 所属栏目:百科 来源:网络整理
导读:引用 火炎焱燚 的 DWR Reverse Ajax 功能实践的要点 Reverse Ajax 主要是在 BS 架构中,从服务器端向多个浏览器主动推数据的一种技术。它的一种实现就是客户端向服务器请求后,服务器不立即回应,从而导致一个 http 长连接,等到有更新数据的时候,再利用这

引用

火炎焱燚DWR Reverse Ajax功能实践的要点

Reverse Ajax主要是在BS架构中,从服务器端向多个浏览器主动推数据的一种技术。它的一种实现就是客户端向服务器请求后,服务器不立即回应,从而导致一个http长连接,等到有更新数据的时候,再利用这个连接主动向客户端回送。

如果是初次接触,那一定要看下这篇文章

其中,详述了这种技术和JETTY服务器Continuations功能结合时的强大性能:运行在非阻塞方式下,当多个客户端请求时不会占用过多线程。

最后,此文申明DWR的实现已经天然使用了JETTY这一功能。所以使用DWR还是非常有好处的。如何使用及示例上面这篇文章已经有说明,下面就以我实际使用中碰到的问题和要点做个说明。

首先,说一下代码的组织和声明。

将使用到Reverse Ajax的代码归入一个类,比如是NotifyClient,并用springbean来声明。在将要用到这个类的地方(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,就需要用到springServletContextAware接口,下面是完整代码:

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;

}

}

另外,ScriptBufferappendScript方法是插入原始字串,appendData会根据参数类型做相应转换。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读