`
weiqianghe
  • 浏览: 12775 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

DWR推技术

    博客分类:
  • java
阅读更多
DWR 推技术ajax 2010-11-18 11:45:39 阅读173 评论0   字号:大中小 订阅 .


                                  DWR2.x的推技术

DWR2.x的推技术也叫DWR Reverse Ajax(逆向Ajax)主要是在BS架构中,从服务器端向多个浏览器主动推数据的一种技术。在DWR所开的线程中使用Reverse Ajax时,通过WebContextFactory.get()获取WebContext对象,进而获取脚本Session。在DWR之外使用Reverse Ajax时,就要用到ServerContext,在Spring环境中要得到ServerContext,就需要用到Spring的ServletContextAware接口。

一、Reverse Ajax的实现有3种方式:

      DWR的逆向Ajax主要包括两种模式:主动模式和被动模式。其中主动模式包括polling和comet两种,被动模式只有piggyback这一种。

     1、piggyback方式

           这是默认的方式。

           如果后台有什么内容需要推送到前台,是要等到那个页面进行下一次ajax请求的时候,将需要推送的内容附加在该次请求之后,传回到页面。只有等到下次请求页面主动发起了,中间的变化内容才传递回页面。

      2、comet方式

           当服务端建立和浏览器的连接,将页面内容发送到浏览器之后,对应的连接并不关闭,只是暂时挂起。如果后面有什么新的内容需要推送到客户端的时候直接通过前面挂起的连接再次传送数据。服务器所能提供的连接数目是一定的,在大量的挂起的连接没有关闭的情况下,可能造成新的连接请求不能接入,从而影响到服务质量。

      3、polling方式

           由浏览器定时向服务端发送ajax请求,询问后台是否有什么内容需要推送,有的话就会由服务端返回推送内容。这种方式和我们直接在页面通过定时器发送ajax请求,然后查询后台是否有变化内容的实现是类似的。只不过用了dwr之后这部分工作由框架帮我们完成了。

二、使用DWR的推技术的步骤

     1、在web.xml文件中增加以下配置信息

Xml代码 

1. <servlet> 

2.    <servlet-name>dwr-invoker</servlet-name> 

3.    <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> 

4.    <init-param> 

5.        <param-name>debug</param-name> 

6.        <param-value>true</param-value> 

7.    </init-param> 

8.      

9.    <!-- DWR默认采用piggyback方式 --> 

10.      

11.    <!-- 使用polling和comet的方式 --> 

12.    <init-param> 

13.        <param-name>pollAndCometEnabled</param-name> 

14.        <param-value>true</param-value> 

15.    </init-param> 

16.      

17.    <!-- comet方式 --> 

18.    <!--   

19.    <init-param> 

20.        <param-name>activeReverseAjaxEnabled</param-name> 

21.        <param-value>true</param-value> 

22.    </init-param> 

23.     --> 

24.       

25.    <!-- polling方式:在comet方式的基础之上,再配置以下参数 --> 

26.    <!--   

27.    <init-param> 

28.        <param-name>org.directwebremoting.extend.ServerLoadMonitor</param-name> 

29.        <param-value>org.directwebremoting.impl.PollingServerLoadMonitor</param-value> 

30.    </init-param> 

31.     --> 

32.        

33.    <!-- 毫秒数。页面默认的请求间隔时间是5秒 --> 

34.    <!--   

35.    <init-param> 

36.        <param-name>disconnectedTime</param-name> 

37.        <param-value>60000</param-value>   

38.    </init-param> 

39.     --> 

40.       

41.    <load-on-startup>1</load-on-startup>        

42. </servlet> 

43.

44. <servlet-mapping> 

45.    <servlet-name>dwr-invoker</servlet-name> 

46.    <url-pattern>/dwr/*</url-pattern> 

47. </servlet-mapping> 



    2、在dwr.xml中增加以下配置信息

Xml代码 

1. <create creator="new" javascript="DWRHelper"> 

2.    <param name="class" value="com.cjm.web.dwr.DWRHelper"/> 

3.    <include method="addMessage"/> 

4.    <include method="test"/> 

5. </create> 

6.

7. <convert converter="bean" match="com.cjm.web.dwr.Message"> 

8.    <param name="include" value="id,text"/> 

9. </convert> 



    3、pojo类Message的源码

Java代码 

1. public class Message {  

2.    private long id = System.currentTimeMillis();  

3.    private String text;  

4.      

5.    public Message(){  

6.          

7.    }  

8.      

9.    public Message(String newText){  

10.        text = newText;  

11.    }  

12.      

13.    public long getId() {  

14.        return id;  

15.    }  

16.    public void setId(long id) {  

17.        this.id = id;  

18.    }  

19.    public String getText() {  

20.        return text;  

21.    }  

22.    public void setText(String text) {  

23.        this.text = text;  

24.    }  

25. } 



     4、DWRHelper类源码

Java代码 

1. public class DWRHelper {  

2.    private static LinkedList<Message> messages = new LinkedList<Message>();  

3.    private static ReentrantLock lock = new ReentrantLock(); //JDK5锁  

4.      

5.    public void addMessage(String text){  

6.        try{  

7.            lock.lock();  

8.              

9.            if(text!=null && text.trim().length()>0){  

10.                messages.addFirst(new Message(text));  

11.                if(messages.size()>10){  

12.                    messages.removeLast();  

13.                }  

14.            }  

15.        }catch(Exception ex){  

16.            ex.printStackTrace();  

17.        }finally{  

18.            lock.unlock();  

19.        }  

20.          

21.        //获得DWR上下文  

22.        WebContext webContext = WebContextFactory.get();  

23.          

24.        //获取当前页面URL,比如/ext3/test_tag.jsp  

25.        String currentPage = webContext.getCurrentPage();  

26.          

27.        //当前脚本sessin  

28.        ScriptSession scriptSession = webContext.getScriptSession();  

29.          

30.        //设置页面控件的值  

31.        Util util = new Util(scriptSession);  

32.        util.setValue("text", ""); //这里是清空页面输入框的值  

33.          

34.        //设置脚本sessin的属性值  

35.        scriptSession.setAttribute("uid", "cjm");  

36.          

37.        //获取脚本session的属性值  

38.        for(Iterator it=scriptSession.getAttributeNames();it.hasNext();){  

39.            String attrName = (String)it.next();  

40.            System.out.println(attrName + "=" + scriptSession.getAttribute(attrName));  

41.        }  

42.          

43.        //获取所有浏览当前页面的脚本session  

44.        Collection<ScriptSession> sessions = webContext.getScriptSessionsByPage(currentPage);  

45.          

46.        Util utilAll = new Util(sessions);  

47.          

48.        //执行客户端脚本  

49.        ScriptBuffer script = new ScriptBuffer();  

50.        script.appendScript("clientFunction(")  

51.          .appendData(scriptSession.getAttribute("uid"))  

52.          .appendScript(");");  

53.          

54.        for(ScriptSession session: sessions){  

55.            session.addScript(script);  

56.        }  

57.          

58.        //更新这些脚本session的一些元素  

59.        utilAll.removeAllOptions("messages");  

60.        utilAll.addOptions("messages", messages, "id", "text");  

61.    }

62. } 



    5、JSP页面源码

Html代码 

1. <%@ page language="java" pageEncoding="UTF-8"%> 

2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 

3. <html> 

4. <head> 

5.    <script type='text/javascript' src='/ext3/dwr/engine.js'></script> 

6.    <script type='text/javascript' src='/ext3/dwr/util.js'></script> 

7.    <script type='text/javascript' src='/ext3/dwr/interface/DWRHelper.js'></script> 

8. </head> 

9.    

10. <!-- 通过 dwr.engine.setActiveReverseAjax(true); 启动该页面的Reverse Ajax功能  --> 

11. <body onload="dwr.engine.setActiveReverseAjax(true);sendMessage();"> 

12.    <p>输入信息: <input id="text" onkeypress="dwr.util.onReturn(event, sendMessage)" />   

13.    <input type="button" value="Send" onclick="sendMessage()" /></p> 

14.

15.    <script type="text/javascript"> 

16.        function sendMessage() {  

17.            DWRHelper.addMessage(dwr.util.getValue("text"));  

18.        }  

19.    </script> 

20.      

21.    <hr/> 

22.    <select id="messages"></select> 

23.      

24. </body> 

25. </html> 
分享到:
评论

相关推荐

    dwr推技术官方实例

    标题中的“dwr推技术官方实例”是指DWR提供的关于其推技术的实际操作示例,这些示例可能涵盖了DWR 2.0.4及以上版本的最新功能。由于高质量的实例资源在网络上可能不易找到,所以这份实例集合显得尤为宝贵。 描述中...

    dwr推技术实现服务器推送数据

    总结来说,DWR推技术是实现服务器主动向客户端推送数据的一种高效方式,尤其适用于需要实时数据更新的应用,如股票实时显示。通过反转Ajax,DWR简化了开发流程,提高了用户体验,是现代Web开发中的一个重要工具。

    dwr推技术简单案例

    在这个“dwr推技术简单案例”中,我们将深入理解DWR的核心概念,学习如何设置和使用DWR来实现实时数据推送。 首先,我们需要了解DWR的基本工作原理。DWR通过在浏览器和服务器之间建立一个持久连接,使得服务器可以...

    dwr 推技术 demo

    通过这个"DWR推技术demo",你可以学习如何设置DWR环境,配置DWR以启用推送功能,以及在客户端和服务器端编写相应的代码来实现双向通信。这个项目对于理解DWR工作原理和实际应用非常有帮助,特别是对于那些希望在Web...

    dwr推技术反转聊天事例

    在“dwr推技术反转聊天事例”中,我们将探讨DWR如何用于构建一个实时的聊天应用程序,并分析其中的关键知识点。 首先,我们需要理解DWR的核心概念。DWR允许JavaScript在浏览器端直接调用服务器端的Java方法,而无需...

    使用dwr推技术实现站内聊天室,可对所有人和指定人发送消息

    在本示例中,我们将深入探讨如何利用DWR推技术来构建一个站内聊天室,允许用户向所有人或特定个体发送消息。 1. **DWR推技术**: DWR推技术(Push technology)是DWR的一个重要特性,它允许服务器主动向客户端推送...

    java聊天室 dwr推技术

    在这个聊天室项目中,DWR推技术扮演了关键角色。"推技术"通常指的是服务器向客户端主动推送信息,而不是等待客户端发起请求。在聊天室这种实时性要求较高的场景下,服务器端需要及时将新消息推送到所有在线用户,而...

    DWR推技术-用于做及时通讯更新的

    然而,DWR通过建立一个持久的连接,使得服务器可以主动地向客户端推送数据,从而提高了用户体验。 DWR的核心功能包括: 1. **远程方法调用(Remote Method Invocation, RMI)**:DWR允许JavaScript直接调用服务器...

    DWR的推技术

    #### 一、DWR推技术概述 DWR(Direct Web Remoting)是一种简化Ajax开发的框架,它允许Java对象直接与JavaScript交互,从而实现更流畅的网页应用体验。在DWR 2.x版本中,引入了推技术,即所谓的“Reverse Ajax”,...

    DWR推送技术大全 dwr推送聊天实例

    DWR推送技术的实现主要涉及以下几个关键组件: 1. **DWR Engine**:这是DWR的核心部分,负责处理JavaScript与服务器端Java对象之间的交互。它通过AJAX(Asynchronous JavaScript and XML)技术在客户端和服务器之间...

    DWR服务器推技术Demo

    DWR是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站。它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样。

    dwr 实现推技术 实例

    **DWR(Direct Web Remoting)技术详解及推技术实例** DWR,全称为Direct Web Remoting,是一种在Web应用程序中实现JavaScript与Java之间进行安全、高效通信的技术。它允许服务器端的Java代码直接调用客户端的...

    dwr后台推送

    另外,`DWR推技术在开发中需要注意的ScriptSession问题 - zhyiwww - BlogJava.mht`文件可能包含了开发者在实际开发过程中遇到的一个常见问题——ScriptSession。ScriptSession是DWR用于跟踪客户端会话的机制,但如果...

    DWR服务器推送技术(实时)

    DWR的核心特性是它支持AJAX(Asynchronous JavaScript and XML)以及服务器推送技术,极大地提高了Web应用的用户体验。 **服务器推送技术**: 传统的HTTP协议是基于请求-响应模型的,即客户端发起请求,服务器响应...

    dwr推送技术

    在实际项目中,根据`dwrpush`这个文件名,我们可以推测这是一个关于DWR推送技术的示例或配置文件,可能包含了如何设置和使用DWR推送功能的代码示例。通过对这个文件的深入学习和实践,可以更好地理解和掌握DWR3的推...

    dwr服务器推技术

    在描述中提到的"DWR服务器推技术整合Struts2",意味着我们将DWR与流行的MVC框架Struts2相结合,以创建一个具有聊天功能的Web应用。Struts2提供了一个强大的架构来处理HTTP请求,并结合DWR,可以创建一个动态的、交互...

    dwr推模式

    标题 "dwr推模式" 涉及到的是Direct Web Remoting (DWR) 技术的一种工作模式,主要用于Web应用程序中的实时数据交互。DWR允许JavaScript与服务器端的Java代码进行交互,提供了异步更新页面的能力,极大地提高了用户...

    dwr推送及js访问java代码

    在“dwr推送及js访问java代码”的项目中,我们可以看到如何利用DWR进行双向通信。首先,DWR的核心组件包括`DWR Engine`、`Servlet`和`AutoBean`等。`DWR Engine`负责在客户端和服务器之间建立连接,`Servlet`处理...

    DWR推送技术

    在本项目的背景下,由于HTML5的WebSocket不适用于所有浏览器,特别是对旧版IE的支持,因此选择了DWR作为实现推送技术的工具。DWR的核心思想是建立一个持久的连接(long-polling)来实现实时数据推送。这种机制下,...

    使用dwr+spring实现消息推送

    在IT行业中,消息推送是一项重要的技术,它使得服务器能够实时地向客户端发送数据,而无需客户端不断地轮询请求。在本教程中,我们将探讨如何利用Direct Web Remoting (DWR) 和Spring框架来实现这样的功能。 DWR是...

Global site tag (gtag.js) - Google Analytics