DWR 入门二

2016/01/01 Java

本节Demo实现的基本功能:在上节( DWR3.0框架入门(1) —— 实现ajax )的代码基础上修改,实现将index.jsp输入框中的推送文本显示在其它打开的jsp页面上。

服务器推送技术和DWR的推送方式, 参考这里

客户端每次请求(刷新)都会生成一个新的ScriptSession,当客户端请求时或者客户端退出时将会销毁ScriptSession

通过ScriptSession我们可以得到客户端(浏览器)的脚本执行权。即我们可以直接调用浏览器的js代码。

Demo修改的流程

  1. 修改MessagePush中的send方法:
package com.albert.dwr;

import java.util.Collection;
import org.directwebremoting.Browser;
import org.directwebremoting.ScriptBuffer;
import org.directwebremoting.ScriptSession;
public class MessagePush {
        public void send(final String content){
              Runnable run = new Runnable(){
                      private ScriptBuffer script = new ScriptBuffer();
                      public void run() {
                            //设置要调用的 js及参数
                            script.appendCall("show" , content);
                            //得到所有ScriptSession
                           Collection<ScriptSession> sessions = Browser.getTargetSessions();
                            //遍历每一个ScriptSession
                            for (ScriptSession scriptSession : sessions){
                                  scriptSession.addScript( script);
                           }
                     }
              };
               //执行推送
              Browser. withAllSessions(run);
       }
}
  1. 新建receiver.jsp用来接收来自服务器的消息:
<%@ page language= "java" import ="java.util.*" pageEncoding="UTF-8" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head >
    <title >dwr接收</title >
        <script src="js/jquery-1.8.3.js" ></script>
        <script type="text/javascript" src= "dwr/util.js"></script >   
        <script type="text/javascript" src= "dwr/engine.js"></script >
        <script type="text/javascript" src= "dwr/interface/messagePush.js" ></script>
  </head >
 
  <body >
        dwr接收<br />
        <div id="content" style=" width: 200px ;height: 30px;border : 1px solid ; text-align: center ; padding: 5px;"></ div>
        <script type="text/javascript" >
           //这个方法用来启动该页面的ReverseAjax功能
           dwr.engine.setActiveReverseAjax( true);
           //设置在页面关闭时,通知服务端销毁会话
           dwr.engine.setNotifyServerOnPageUnload( true);
           //这个函数是提供给后台推送的时候 调用的
           function show(content){ 
               $( "#content" ).text(content);
           }
        </script>
  </body >
</html>

测试: 先打开receiver.jsp,后打开index.jsp输入文本后发送。 出现错误:

SEVERE: Polling and Comet are disabled. To enable them set the init-param activeReverseAjaxEnabled to true.

web.xmldwrservlet中添加如下参数

<init-param>
    <param-name>activeReverseAjaxEnabled</param-name>
    <param-value>true</param-value>
</init-param> 

DWR引用js的路径问题

dwr 引用util.js,engine.js,beanName.js路径问题如果引用util.js,engine.js,beanName.jsjsp页面在webRoot下面,则

    <script type="text/javascript" src="dwr/engine.js"/></script>  
      
    <script type="text/javascript" src="dwr/util.js"/></script>  
      
    <script type="text/javascript" src="dwr/interface/beanName.js"></script>  

就可以正确引用,若引用util.js,engine.js,beanName.jsjsp页面不在webRoot下面,则必须加上<%=request.getContextPath() %>即变成了

    <script type="text/javascript" src="<%=request.getContextPath() %>/dwr/engine.js"/></script>  
      
    <script type="text/javascript" src="<%=request.getContextPath() %>/dwr/util.js"/></script>  
      
    <script type="text/javascript" src="<%=request.getContextPath() %>/dwr/interface/beanName.js"></script>  

<%=request.getContextPath() %>这个方法应该能解决许多webRoot路径问题。很多连接的首页在webRoot下,不会引起路径问题若不在webRoot下,就会出现路径问 题。都是由相对路径引出的问题。request.getContextPath()是工程名,也就是发布到web服务器的虚拟目录,比如/Sucre

补充:

<script type="text/javascript" src="dwr/engine.js"/></script> 

这里的src="dwr/engine.js"中的dwr要与web.xml中的<url-pattern>相对应

    <!-- 指定核心Servlet的URL映射 -->  
        <servlet-mapping>  
            <servlet-name>dwr-invoker</servlet-name>  
            <!-- 指定核心Servlet映射的URL -->  
            <url-pattern>/dwr/*</url-pattern>  
        </servlet-mapping>  

js引入模板

<script src='/[YOUR-WEBAPP]/dwr/interface/[YOUR-SCRIPT].js'></script>  
<script src='/[YOUR-WEBAPP]/dwr/engine.js'></script> 

Search

    Table of Contents