`
lizhensan
  • 浏览: 369480 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

RAP源码泛读及分析

 
阅读更多

SWT、RWT如何保证大部分API的一致?

 RWT对关键的方法进行了重写:渲染、事件处理,增加了适配模型AbstractWidgetLCA

 在SWT、RWT中看似同样的处理,其实意义已经不同

       while( !shell.isDisposed() ) {

        if( !display.readAndDispatch() ) {//1

          display.sleep();//2

        }

      }

 SWT中

 1:触发控件事件

 2:基于OS,捕获系统事件、渲染UI

 RWT中

 1:触发后台控件事件

 2:基于HTTP,借助WidgetLCA适配模型,捕获WEB中的事件、渲染WEBUI

 

 

把前台括事件  映射到后台控件事件中,后台控件的响应在前台进行表现

前后台通宵通过JsonObject通讯

 

RAP总体分2个线程

1:http请求线程

2:后台UI处理线程(基于会话,保证多用户的安全性)

org.eclipse.rap.rwt.internal.lifecycle.RWTLifeCycle.UIThreadController

 

如何扩展RAP控件控件?

1:首先找个第三方的控件,比如:jquery的tree,把js拿过来

2:实现后台Wight把后台调用的方法通过RemoteObject与js进行映射

3:打包插件供别人使用

这样别人就可以像开发swt一样去实现一个jquery的树

 

 

 

 

RAP的一个响应流程:

比如在单机按钮弹出对话框的这个动作原理:

(WEB)单击按钮->触发js->ajax后台发送请求->

(后台处理)后台将request适配为对应控件的事件->后台弹出对话框(逻辑调用)->适配为前台动作(json的形式)->发送前台->

(WEB)动态调用js方法(弹出对话框)

 

RAP核心的代码

1:适配控件的处理(前后台的映射)

2:主逻辑的控制、WEB与OSGI的集成、一些WEB服务机制的搭建等

 

 

前台为什么选择Qooxdoo 

Qooxdoo并没有jquery、ext有名气,为什么还要选择它呢?个人觉得是因为它的设计思路与SWT比较接近,适配控件比较容易写

 

 

RCP RAP 有大部分的交集,但各自都有各自各特有的API

RAP 优势

1:把rcp的优秀的平台,无缝的迁移到了web中,可以搭建自己的WEB平台,具有极大的扩展性,eclipse的成功已经证明了这一点

这个我觉得是它最大的优势,它是个WEB平台不仅仅是个web框架,它可以把Ext、Flex、Jquery等作为一个插件或组件来使用

目前已经有很多插件供RAP使用,RAP项目的定位可能与当初RCP类似,要打造一个web生态,比如:

可以将共性的模块开发插件并提供扩展点,对外发布使用,这样你的开发就是在某个功能模块上再次开发,而不需要从头开发了

对于公司来也可以在技术上形成沉淀

 

 

2:保持与RCP的开发模式,这样可以将RCP的开发经验及封装的API使用到RAP中,但也有些不同:

   Web是一个多用户环境,所以在一个静态对象中(如singleton)保持应用状态是有可能引起问题的。

   现有的RAP是RCP的一个子集——如果期望得到超出RAP支持的RCP附加功能,这里推荐的做法是通过插件来引入它们。

   因为应用是在服务器上执行,开发者不应给每个用户分配大量的内存(这同样也是桌面应用的最佳实践)

 

3:开源便于研究内部实现,与一般框架一样都具有丰富的组件

 

RAP 缺点

1:使用人比较少、网上的相关资料也很少与RCP一样

2:不试用用户量大的项目,架构已经决定了

因为对于后台控件会为每个会话缓存一份,这样用户量大了服务端的内存消耗也是成正比的上升

不过它的懒加载机制会弥补下这种不足

 

 

RAP1例子说明

如果有发布应用为war,需要下载eclipse插件

用到了RCP中的视图、编辑器(tab)、form、菜单、Jface中的控件(List、Table)、带搜索的弹出对话框等进行了测试

结果:效果很不错,并且部署到tomcat中局域网访问也很流畅

 

 

 

 

http://www.blogjava.net/vwpolo/archive/2009/05/21/271911.html

 

http://www.blogjava.net/vwpolo/archive/2010/06/04/284577.html

如何发布rap

http://blog.csdn.net/luoww1/article/details/16880631

支持gef

 

RAP现有的客户端表现是基于qooxdoo

 

GWT是整个在浏览器执行的,而RAP的执行被分成了服务器端和客户端两部分

 

org.eclipse.rap.rwt.service.ServiceHandler

service  client(所有内容都是从服务端请求过来的(servet))

org.eclipse.equinox.http.servlet.internal.ResourceServlet

org.eclipse.equinox.http.servlet.internal.ServletRegistration 

org.eclipse.rap.rwt.internal.service.StartupPageTemplate

rap-client.js

resources.js

org.eclipse.rap.rwt.internal.protocol.ProtocolMessageWriter

org.eclipse.rap.rwt.application.Application

org.eclipse.rap.rwt.application.ApplicationConfiguration

org.eclipse.rap.rwt.remote.RemoteObject org.eclipse.rap.rwt.internal.remote.DeferredRemoteObject

org.eclipse.rap.rwt.remote.Connection

org.eclipse.rap.rwt.internal.protocol.ProtocolMessageWriter

org.eclipse.rap.rwt.internal.protocol.Operation

org.eclipse.rap.rwt.lifecycle.WidgetAdapter

org.eclipse.rap.rwt.internal.remote.LifeCycleRemoteObject

org.eclipse.swt.internal.widgets.buttonkit.ButtonOperationHandler

org.eclipse.rap.rwt.lifecycle.WidgetUtil.getLCA(Widget)

org.eclipse.rap.rwt.internal.service.UISessionImpl

org.eclipse.rap.rwt.internal.lifecycle.RWTLifeCycle.executeUIThread()

org.eclipse.rap.rwt.internal.lifecycle.UIThread

org.eclipse.rap.rwt.internal.service.LifeCycleServiceHandler.writeProtocolMessage(ServletResponse)

org.eclipse.rap.rwt.internal.service.ContextProvider.getProtocolWriter()

org.eclipse.rap.rwt.internal.service.LifeCycleServiceHandler.handlePostRequest(HttpServletRequest, HttpServletResponse)

org.eclipse.rap.rwt.internal.service.ContextProvider

org.eclipse.rap.rwt.internal.lifecycle.RWTLifeCycle.createUIThread()

org.eclipse.rap.rwt.internal.lifecycle.RWTLifeCycle

org.eclipse.rap.rwt.internal.lifecycle.RWTLifeCycle.executeUIThread()

org.eclipse.rap.rwt.internal.lifecycle.UIThread.switchThread()

org.eclipse.rap.rwt.internal.service.ServiceStore

org.eclipse.rap.rwt.internal.lifecycle.RWTLifeCycle.UIThreadController

org.eclipse.rap.rwt.internal.lifecycle.RWTLifeCycle.createUI()

org.eclipse.rap.rwt.lifecycle.AbstractWidgetLCA.readData(Widget)网页中的事件适配到后台控件中

org.eclipse.rap.rwt.remote.OperationHandler



 

以上都是个人在看源码的时候随笔记下的,比较乱,可能也有理解不对的地方望多指教

 

  • 大小: 18.5 KB
分享到:
评论
2 楼 lizhensan 2014-04-28  
RAP 本身所有的UI都是惰性加载的,只有你真正用了才会去加载对应的Class
1 楼 cxman 2014-04-25  
请教一个问题:
RAP如何实现数据的懒加载,就是界面先显示出来后有什么方法自动去触发加载数据,就像html中的onload方法可以调用加载数据,但在rap上就不知道怎么调用了。

相关推荐

Global site tag (gtag.js) - Google Analytics