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