论坛首页 入门技术论坛

DWR的推送

浏览 5938 次
锁定老帖子 主题:DWR的推送
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-07-02  
DWR
项目中有个需求,把服务器端一些操作都输出到页面上显示,类似一个日志功能的操作.针对这样的需求,我反复想想,还是觉得用服务器的推送技术比较好,正好看到网上有人用dwr实现了这个功能,因此我也尝试着做了下.呵呵,成绩斐然啊,不过不算完全满意,有些东西没想明白怎么回事.
我用struts2+spring+hibernate,ajax库用的jquery,发现jquery跟dwr的util.js冲突,不知道如何使用dwr的util.js.
首先,在web.xml中配置dwr(dwr版本为version: 2.0.3):
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
<init-param>
<description>false</description>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<description>AJAX</description>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>
initApplicationScopeCreatorsAtStartup
</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>maxWaitAfterWrite</param-name>
<param-value>100</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

然后,写struts2的action类:
public class BaseAction extends ActionSupport implements ServletContextAware,java.io.Serializable
    {
    protected ServletContext servletContext;
   
    public void setServletContext(ServletContext arg0)
    {
   this.servletContext = arg0;
}
public void outMessage(String msg)
{
    ServerContext wctx = ServerContextFactory.get(this.servletContext);
ScriptSession scriptSessions = null;
Collection<ScriptSession> sessions = wctx.getAllScriptSessions ();

msg = MessageUtil.formatDate(new Date(),"yyyy-MM-dd HH:mm:ss") + " \t"+ msg;
ScriptBuffer script = new ScriptBuffer();
script.appendScript("showMessage(")
.appendData(msg)
.appendScript(");");

for (ScriptSession session : sessions) {
session.addScript(script);

}
}
然后,注册action到spring中:
<bean id="baseAction" class="com.fsc.frame.base.web.BaseAction" />

然后,注册dwr.xml文件:
<allow>
<create creator="spring" javascript="Msg">
<param name="beanName" value="baseAction"/>
</create>
    </allow>

然后就是写页面,即将服务器消息推送到页面上:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<table CLASS="body_bottom" width="98%" align="center">
  <tr>
    <td width="95%">   
      <textarea rows='5' id="message" name="STATUS_MESSAGE" ReadOnly style="width:100%" class="CSS_TextArea"></textarea>
    </td>
  </tr>
</table>   
<script type='text/javascript' src='dwr/interface/Msg.js'></script>
<script type='text/javascript' src='dwr/engine.js'></script>
<script type='text/javascript'>

/**
* 页面初始化
*/
function init()
{
  dwr.engine.setActiveReverseAjax(true); // 激活反转 重要
}

window.onload = init;//页面加载完毕后执行初始化方法init

function showMessage(msg)
{
var htmlMsg =  $("#message").val() + msg + "\n";
$("#message").val(htmlMsg);
document.all.STATUS_MESSAGE.scrollTop = document.all.STATUS_MESSAGE.scrollHeight;
}
</script>

这样一个完整的应用就完成了.
需要注意的是,在action里输出到页面上的script方法必须要先在页面上进行定义.

问题:
    1.
    Collection<ScriptSession> sessions = new HashSet<ScriptSession>();
    sessions.addAll(ServerContextFactory.get(this.servletContext).getScriptSessionsByPage("/framework/footer.jsp"));
为啥这么写得不到页面session呢?那位知道麻烦说下.
2. 如何才能避免jquery跟dwr的util.js的冲突?
   发表时间:2008-11-24  
兄弟,我遇到了你第一个问题,估计是Struts的原因,但是还没找到解决的办法。你解决了吗?
0 请登录后投票
   发表时间:2009-03-13  
$ 符号是jquery和 dwr冲突的原因 你查下 jquery 的文档,里面有个解决的办法,就是jquery 不再使用 $ 符号 用  jQuery 代替,这样可能会影响 你的jquery 插件
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics