论坛首页 AJAX版 DWR

DWR的推送

浏览 486 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2008-07-02
项目中有个需求,把服务器端一些操作都输出到页面上显示,类似一个日志功能的操作.针对这样的需求,我反复想想,还是觉得用服务器的推送技术比较好,正好看到网上有人用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的冲突?
   
论坛首页 AJAX版 DWR

跳转论坛:
JavaEye推荐