浏览 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的冲突? 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |


