锁定老帖子 主题: 请教关于DWR的推技术问题,
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-09-28
服务器状态保存在ScriptSession中 客户端页面中的引擎定时发请求到WEB 服务器 ,察看ScriptSession ,如果发现不为空,则将 ScriptSession中保存的JS调用发送到客户端页面,否则 线程等待一定时间,但是ScriptSession 是通过DWR内部上下文对象得到的,也就是说在DWR框架以外无法改变ScriptSession 我的问题是,如果是DWR控制范围外的机制导致服务器数据变化,如:数据库被外部系统改变, 这种改变怎么推到客户端? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-09-28
"定时发请求到WEB 服务器",你也这么说了.
这哪儿还叫推呀. 所以你的问题在这个"ScriptSession"上.它能不能及时的得到真实数据,就决定了被"推"来的数据是不是被外部系统改变后的数据. |
|
返回顶楼 | |
发表时间:2007-09-29
楼上的你用过dwr吗?
如果数据来自页面增加没有问题,比如:我在一个list页面中增加一条数据,通过dwr调用保存新增的信息,调用相应的推的方法。其他页面也能实现推的效果。不过如果我的数据来自业务层而不是通过页面请求上来的,数据虽然变化了,手动调用推方法,页面还是不能实现数据的更新。 |
|
返回顶楼 | |
发表时间:2007-09-29
建议看看WebContext的取得方式,对于DWR来说基本上没有框架内外之分,拿到这个就剩下数据组织的问题了。需要注意的是,在Servlet初始化的某些阶段无法取得WebContext,怀疑是DWRServlet还没有完成初始化。
|
|
返回顶楼 | |
发表时间:2007-09-29
WebContext wctx = WebContextFactory.get();
我看了源码 public static WebContext get() { if(builder == null) return null; else return builder.get(); } 因为我的数据变化不是通过页面来的,我调用上面方法不知道里面builder 在什么时候注入啊,所以我得到的wctx是null。应该是有框架内外之分的。至少我通过udp得到的数据,不知道通过什么方式通知到每个web客户端。 |
|
返回顶楼 | |
发表时间:2007-09-29
DWRServlet:
webContextBuilder = StartupUtil.initWebContext(servletConfig, servletContext, container); 应该是这里。 感觉要真正调用过一次DWRServlet之后才真正有效。 DWR本身就没有规定哪里是框架内,只要能WebContextFactory.get(); 对比公开给js的java类,完全没有限定吧,也就是说在任一个类里用WebContext都能正常完成功能才对。 |
|
返回顶楼 | |
发表时间:2007-09-29
我通过页面访问,wctx不为null的,只要我后台发一个udp包给服务,在服务器端自己调用,wctx就是null,前面DWRServlet肯定调用过了。
|
|
返回顶楼 | |
发表时间:2007-09-30
DWRServet.doPost()
webContextBuilder.set(request, response, getServletConfig(), getServletContext(), container); 这里new了WebContext,WebContext与request、response关系很紧,正在考虑其他办法绕过去 |
|
返回顶楼 | |
发表时间:2007-09-30
是的啊。我收到的数据是没有request、response的啊。所以没有办法,推给客户端啊。看看还有什么办法吗?
|
|
返回顶楼 | |
发表时间:2007-09-30
有点蹩脚的解决方法:需要修改DwrServlet两个地方,公开Ioc Container
public static Container getContainer() { return container; } private static DefaultContainer container; 然后在想要的地方,直接取ScriptSessionManager Container container = DwrServlet.getContainer(); ScriptSessionManager ssm = (ScriptSessionManager) container.getBean(ScriptSessionManager.class.getName()); Collection<ScriptSession> sessions = ssm.getAllScriptSessions(); Util utilAll = new Util(sessions); ScriptBuffer s = new ScriptBuffer(); s.appendScript("alert("); s.appendData("something funny here!"); s.appendScript(");"); utilAll.addScript(s); out.println("</body></html>"); |
|
返回顶楼 | |