- 浏览: 188532 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
qja:
这个classpathContainersLast 是什么意思 ...
maven-eclipse-plugin 使用示例 -
litianqwe:
楼主 我是看着你的视频学习gwt的,觉得它好生硬,我有个问题想 ...
GWT开发游戏尝试--植物大战僵尸 -
litianqwe:
楼主 我现在有个问题 那我现在用GXT如果想对某一行增加一个双 ...
2.Listener 监听器系统 -
lxzh504:
简单明了,写的非常好。
scalable io in java学习 -
ocaicai:
很有研究能力,思维清晰!
GWT中对不同浏览器兼容性实现原理
web.xml中配置ContinuationFilter
GWT Service中的设置
处理Comet请求
<filter> <filter-name>jetty</filter-name> <filter-class>org.eclipse.jetty.continuation.ContinuationFilter</filter-class> <init-param > <param-name>faux</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>jetty</filter-name> <servlet-name>comet</servlet-name> </filter-mapping>
GWT Service中的设置
import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Queue; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import net.sf.hibernate4gwt.core.HibernateBeanManager; import net.sf.hibernate4gwt.gwt.HibernateRemoteService; import org.eclipse.jetty.continuation.Continuation; import org.eclipse.jetty.continuation.ContinuationThrowable; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import com.extjs.gxt.ui.client.data.BaseModelData; import com.extjs.gxt.ui.client.data.ModelData; import com.google.gwt.user.server.rpc.UnexpectedException; import com.single.desktopoa.client.event.CometEvents; import com.single.desktopoa.common.person.Person; import com.single.desktopoa.exception.RetryException; public class BaseService extends HibernateRemoteService { public static final String PAYLOAD = "com.google.gwt.payload"; public static final String PERSON = "person"; public static final String COMET_UTIL = "CometUtil"; public static final CometUtil cometUtil=new CometUtil(); protected Person person; protected WebApplicationContext springContext; @Override public void init(ServletConfig config) throws ServletException { super.init(config); springContext = WebApplicationContextUtils.getWebApplicationContext( config.getServletContext(), WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); setBeanManager((HibernateBeanManager) springContext .getBean("hibernateBeanManager")); } @Override protected String readContent(HttpServletRequest request) throws ServletException, IOException { String payload = (String) request.getAttribute(PAYLOAD); if (payload == null) { payload = super.readContent(request); request.setAttribute(PAYLOAD, payload); } return payload; } @Override protected void doUnexpectedFailure(Throwable e) { throwIfRetryRequest(e); super.doUnexpectedFailure(e); } //如果我们的异常不想被GWT捕获,在该方法中向上抛出 protected void throwIfRetryRequest(Throwable caught) { if (caught instanceof UnexpectedException) { caught = caught.getCause(); } //如果抛出的是自定义的,为了Hold request的异常,则继续往上抛出 ContinuationThrowable() //此ContinuationThrowable() 是一个Error,ContinuationFilter会捕获这个Error,为了能让Filter捕获,我手动向上抛出,很笨拙的方法,期待以后改进 if(caught instanceof RetryException){ throw new ContinuationThrowable(); } } @Override protected void onBeforeRequestDeserialized(String serializedRequest) { person = (Person) getThreadLocalRequest().getSession().getAttribute( PERSON); super.onBeforeRequestDeserialized(serializedRequest); } public class CometMember { public Person person; public Continuation continuation; public Queue<ModelData> queue = new LinkedList<ModelData>(); public void addEvent(String event,Object data) { boolean isContain = false; for (Iterator<ModelData> it = queue.iterator(); it.hasNext();) { if (it.next().get("event").equals(event)) { isContain = true; break; } } if (!isContain) { ModelData modeldata=new BaseModelData(); modeldata.set("event", event); if(data!=null) modeldata.set("data", data); queue.add(modeldata); } synchronized (this) { // if (continuation != null) { // continuation.resume(); // } } } } public static class CometUtil { protected HashMap<Long, CometMember> memberMap = new HashMap<Long, CometMember>(); public List<Person> getOnlineList(){ List<Person> onlines=new ArrayList<Person>(); for(CometMember member:memberMap.values()){ onlines.add(member.person); } return onlines; } public boolean addEvent(Person receiver, String event,Object data) { if (isContain(receiver)) { CometMember member = memberMap.get(receiver.getId()); member.addEvent(event,data); return true; } return false; } public void addMember(CometMember member) { for(Iterator<CometMember> it=memberMap.values().iterator();it.hasNext();){ CometMember mem=it.next(); mem.addEvent(CometEvents.WORKTALK_newlogin, null); } memberMap.put(member.person.getId(), member); //test member.addEvent(CometEvents.WORKTALK_newlogin, null); } private boolean isContain(Person receiver) { if (memberMap.get(receiver.getId()) == null) { return false; } return true; } } }
处理Comet请求
import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.continuation.Continuation; import org.eclipse.jetty.continuation.ContinuationSupport; import org.mortbay.jetty.RetryRequest; import com.extjs.gxt.ui.client.data.BaseModelData; import com.extjs.gxt.ui.client.data.ModelData; import com.single.desktopoa.exception.RetryException; import com.single.desktopoa.module.comet.CometService; import com.single.desktopoa.server.BaseService; public class CometServiceImpl extends BaseService implements CometService { public List<ModelData> getEvents() { HttpServletRequest request=getThreadLocalRequest(); HttpServletResponse response=getThreadLocalResponse(); CometMember member=(CometMember)request.getSession().getAttribute(MEMBER); if(member==null){ member=new CometMember(); member.person=person; request.getSession().setAttribute(MEMBER, member); cometUtil.addMember(member); } if(member.queue.size()>0){ List<ModelData> result=new ArrayList<ModelData>(); while(member.queue.size()>0){ result.add(member.queue.poll()); } return result; }else { Continuation continuation=ContinuationSupport.getContinuation(request); if(continuation.isInitial()){ //如果是新创建的 continuation.suspend(response); member.continuation=continuation; }else{ return new ArrayList<ModelData>(); } } //手动抛出异常,表明此请求需要Hold住,待以后唤醒 throw new RetryException(); } }
发表评论
-
关于GXT视频
2010-05-05 15:48 2291我在浪曦发布过视频,地址http://bbs.langsin. ... -
2.Listener 监听器系统
2010-04-30 15:01 1792GXT中的Listener采用观察者模式 因此在顶层就有一个接 ... -
1.1 BaseEvent
2010-04-30 14:36 1020前面讲了EventType做为GXT中基本的事件。 下面介绍 ... -
1.Event 事件系统
2010-04-30 14:22 1836要说GXT里面的事件Event,就必须先了解一下GWT提供的事 ... -
GXT源码解析
2010-04-30 13:50 1365先列个目录 1.Event 事件系统 2.Listener ... -
GXT中对Cookie的操作
2010-01-08 15:50 1542在GXT中已经提供了相关的类,能够让我们很方便的操作cooki ... -
Registry的用途
2010-01-08 14:22 2126先贴上源代码: /* * Ext GWT - Ext ... -
GXT中的MVC(1)
2010-01-07 18:02 2110在GXT中,官方已经给了我们一个MVC设计模型。我们只需要了解 ... -
使用JSNI来调用JAVA方法
2009-10-12 16:47 1337静态方法的调用: public static void ... -
为HTML中的Element添加单击事件
2009-10-12 16:09 1328private native void addCl ... -
TreePanel上监听Double Click
2009-10-09 20:50 2260在TreePanel上监听双击事件,为:Events.OnDo ... -
GWT开源项目DesktopOA 桌面OA系统
2009-10-01 20:03 6644DesktopOA 桌面OA系统是基 ... -
在GWT中开启session
2009-09-12 02:24 1688GWT中默认不开启session 如需要使用session,要 ... -
GWT与Spring的整合
2009-09-10 11:07 1850在使用GWT的RPC时,我们一般会创建一个类继承RemoteS ... -
GXT与EXT-GWT GWT-EXT 以及收费问题
2009-08-16 14:32 7161很多人可能搞不太清楚这几个东西的区别 GWT-EXT是goo ...
相关推荐
里面东西很多,都是关于GWT-COMET的内容,实现gwt的服务器推技术,包括gwt-comet-examples-1.2.3:google官网上的Test实例;gwt-comet-1.2.3.jar:jar包,gwt-example:聊天实例源代码(.java的),gwt-event-source...
在Jetty中部署应用 部署管理器 部署绑定 热部署 Context提供者 如何部署web应用 webApp提供者 如何部署第三方产品 部署展开形式的web应用 使用Jetty进行开发 如何使用Jetty进行开发 如何编写Jetty中的Handlers 使用...
EXT-GWT的API和DOC文档对于学习和使用EXT-GWT至关重要,它们详尽地介绍了各个组件的用法和功能,帮助开发者了解如何在项目中集成和使用这些组件。 接下来,“Gwt-Ext基础-中级-进阶”这部分教程可能涵盖了从基础到...
3. **Widget库**:GWT提供了一套丰富的Widget库,包括按钮、文本框、面板等基本UI组件,以及表单、日期选择器等复杂控件,这些都是用Java封装的,可以直接在Java代码中使用。 4. **事件处理**:GWT中的事件模型基于...
在 Eclipse 工程 `myProject` 中使用 `applicationCreator.cmd` 创建 GWT 应用程序框架。此命令同样接受参数以指定目标 Eclipse 工程。 **步骤四:导入 Eclipse 工程** 完成以上步骤后,将创建好的 Eclipse 工程...
在《GWT揭秘》一书的8.1节中,详细讲解了如何在GWT中使用XMLHttpRequest来请求动态数据。本篇文章将深入探讨这一主题。 首先,XMLHttpRequest是Web开发中的一个基础组件,它允许浏览器在不刷新整个页面的情况下向...
Gwt中文手册,GWt入门Gwt中文手册,GWt入门Gwt中文手册,GWt入门
1. 在IDE中添加GWT库,使用Java编写和调试应用程序。 2. 利用GWT自带的编译器将Java代码编译成JavaScript和HTML。 3. 将编译后的代码发布到Web服务器上,并检查是否兼容主流浏览器。 4. 在Eclipse中创建工程,使用...
GWT使用宿主模型(Host Model)和Web模型(Web Model)的概念,宿主模型是Java代码运行的环境,而Web模型是JavaScript代码在浏览器中的运行环境。GWT提供了`GWT.isClient()`方法判断当前代码是在哪一侧运行。 4.6 ...
EXT-GWT2.0.1+API+DOC Gwt-Ext基础-中级-进阶GWT中文教程
在Eclipse中添加GWT插件是使用GWT开发的第一步。可以通过安装Eclipse插件来实现这一步骤。安装插件的源地址可以从Google官方网站下载,例如Eclipse 3.5(Galileo)、Eclipse 3.4(Ganymede)和Eclipse 3.3(Europa)...
GWT允许开发者使用Java语言编写客户端代码,然后通过编译器将其转换为优化过的JavaScript,以便在各种浏览器上运行。这个“gwt 练习 gwt学习”项目可能是为了帮助用户熟悉GWT的基本概念、开发流程和最佳实践。 在...
在GWT中,反射是一个强大的工具,允许程序在运行时检查类、接口、字段和方法的信息,甚至可以在客户端创建和操作未知类型的对象,这对于动态加载和处理数据非常有用。 ...
gwt 开发
1. **创建项目**:使用特定的命令或工具在集成开发环境中创建GWT项目。 2. **编写代码**:利用Java语言编写业务逻辑和用户界面。 3. **编译**:使用GWT编译器将Java代码编译为JavaScript和HTML。 4. **部署与测试**...
这通常会涵盖GWT的异步编程模型,例如使用RequestFactory或者GWT的 Comet 技术来实现长轮询,以获取实时数据更新。 **Tutorial-hellomvp-2.1.zip** MVP(Model-View-Presenter)是GWT中推荐的一种设计模式,用于...
5. **创建GWT项目**:在Eclipse中,使用新安装的插件创建一个新的GWT项目。选择“File” > “New” > “Other” > “Google” > “Google Web Application Project”。在向导中,指定项目名和选择使用的GWT SDK版本...