- 浏览: 1700648 次
- 性别:
- 来自: 杭州699号
文章分类
最新评论
-
莫莫摸:
为什么不用dubbo
RCP数据传输模型回顾 -
大胡子爸爸:
String, Class 都实现了Serializable接 ...
RPC框架几行代码就够了 -
lss598018587:
谢谢大神分享,比起新手看复杂的dubbo框架还不如看大神的这一 ...
RPC框架几行代码就够了 -
15606915740:
你好,请问一下。<dubbo:consumer filt ...
Dubbo文档 -
joqk12345:
...
一些设计上的基本常识
趁着公司项目收尾,有些空闲,写了一些回顾性的文章:
http://javatar.iteye.com/blog/258066
基于这篇文章的思考,周未写了一个简单的实现框架:
http://struts4rcp.googlecode.com
服务器端已完成,包括:请求接收,序列化策略,Action实例化工厂策略,拦截器链,异常转换等。
客户端也基本实现,包括:配置加载,传输策略,传输状态事件,同步调用,异步调用,连接监控,连接状态事件,但还差传输队列的实现,以及队列分组,队列改变事件等的处理。
1. 简介
(1) 说明
struts4rcp是一个适用于RCP/RIA应用的轻量级MVC框架,与Struts功能相似,提供远程MVC控制器支持,简化模型与视图的交互过程。
(2) 对比
常规C/S应用中,通常都采用透明化的远程方法调用方式与服务器端通讯,即:将Service接口同时部署于客户端,并在客户端生成Service接口的Stub实现,通过各种协议代理访问服务器端的Service实现,此类工具如:RMI, WebService, XML-RPC/JSON-RPC, HttpInvoker等。为什么还要加一层Action控制器?
(3) 特性
2. 使用
(1) 调用
(a) 服务器端
Action实现类:
Spring配置:
(b) 客户端
同步执行:
异步执行:
同步阻塞执行:
异步阻塞执行:
(c) Web页面
同步执行:
异步执行:
(2) 导入
(a) 服务器端
struts4rcp-server.jar
(b) 客户端
struts4rcp-client.jar
(c) Web页面
struts4rcp.js
(3) 配置
(a) 服务器端 (web.xml)
最简配置:
全部配置:
Spring配置:
(b) 客户端 (transport.properties)
最简配置:
全部配置:
(c) Web页面 (struts4rcp.js)
最简配置:
全部配置:
3. 扩展
(1) 序列化器
扩展点:
客户端(包括Web页面)与服务器端之间传递的数据格式转换。
扩展接口:
内置实现:
注册方式:
[list] 客户端:struts4rcp.properties配置:serializer=com.xxx.XxxSerializer
[*] 服务器端:web.xml配置:
[/list]
(2) 服务器端Action实例化工厂
扩展点:
服务器端Action实例的创建和装配。
扩展接口:
内置实现:
注册方式:
[list] ActionFactoryContext.getContext().setActionFactory(actionFactory);
[*] web.xml配置:
[/list]
(3) 服务器端Action拦截器
扩展点:
服务器端Action实例执行过程的前后拦截,可用于权限控制,前端检验等。
扩展接口:
注册方式:
[list] ActionFactoryContext.getContext().addActionInterceptor(actionInterceptor);
[*] web.xml配置:
[/list]
(4) 服务器端异常转换器
扩展点:
转换客户端无法反序列化的服务器端异常,如:将Spring的事务异常转换为客户端识别的异常。
扩展接口:
注册方式:
[list] ActionFactoryContext.getContext().addExceptionConverter(exceptionConverter);
[*] web.xml配置:
[/list]
(5) 客户端传输器
扩展点:
客户端与服务器端数据交换协议与策略实现。
扩展接口:
内置实现:
注册方式:
(6) 客户端异常捕获器
扩展点:
当异步执行Action时,业务未处理的异常,由全局捕获器统一处理。
扩展接口:
注册方式:
(7) 客户端连接状态事件监听器
扩展点:
客户端的网络状态改变时触发此事件。
扩展接口:
注册方式:
(8) 客户端传输状态事件监听器
扩展点:
客户端正在与服务器传输数据时以及传输结束时触发此事件。
扩展接口:
注册方式:
(9) 客户端Action队列事件监听器
扩展点:
客户端的Action队列中的任务数改变时触发此事件。
扩展接口:
注册方式:
4. 设计
(1) 部署图
struts4rcp-client.jar组件:部署于客户端,包括:
struts4rcp-server.jar组件:部署于服务器端,包括:
(2) 类图
包说明
领域说明
(3) 序列图
项目地址:
http://struts4rcp.googlecode.com
SVN地址:
http://struts4rcp.googlecode.com/svn/trunk/code/struts4rcp
http://javatar.iteye.com/blog/258066
基于这篇文章的思考,周未写了一个简单的实现框架:
http://struts4rcp.googlecode.com
服务器端已完成,包括:请求接收,序列化策略,Action实例化工厂策略,拦截器链,异常转换等。
客户端也基本实现,包括:配置加载,传输策略,传输状态事件,同步调用,异步调用,连接监控,连接状态事件,但还差传输队列的实现,以及队列分组,队列改变事件等的处理。
1. 简介
(1) 说明
struts4rcp是一个适用于RCP/RIA应用的轻量级MVC框架,与Struts功能相似,提供远程MVC控制器支持,简化模型与视图的交互过程。
- MVC: Model View Controller
- RCP: Rich Client Platform
- RIA: Rich Internet Application
- Struts: 一个适用于Web页面"请求-响应"方式的MVC框架
(2) 对比
常规C/S应用中,通常都采用透明化的远程方法调用方式与服务器端通讯,即:将Service接口同时部署于客户端,并在客户端生成Service接口的Stub实现,通过各种协议代理访问服务器端的Service实现,此类工具如:RMI, WebService, XML-RPC/JSON-RPC, HttpInvoker等。为什么还要加一层Action控制器?
- 远程调用Service接口,相当于MVC中的视图直接调用了模型,增加控制器,使职责更清晰。
- Serivce域模型通常是无状态的,增加远程控制器,管理服务器端状态。
- Service接口粒度过细,使得业务逻辑向客户端倾斜,产生过多的请求次数,增加控制器,确保大粒度请求。
- 客户端部署Service接口比较繁琐,增加控制器作为中介者,简化耦合。
- 在控制器层,同样可以实现透明化调用,用户同样不需要关心交互层面的信息。
- 在控制器中更易于处理天然的(不需要反射或字节码增强的)AOP截面和事件模型,方便拦截器,转换器,校验器,安全控制等的扩展。
- 对于大量长期使用Struts的开发人员,转入RCP开发时,更易于理解和使用,降低学习成本。
(3) 特性
- 以数据为中心的控制器
- 友好的执行过程拦截器
- 完善的集成扩展点
- 分组队列传输机制
- 全面的事件通知
2. 使用
(1) 调用
(a) 服务器端
Action实现类:
public class LoginAction implements Action<Account, User> { public User execute(Account account) throws Exception { // ...... } }
Spring配置:
<bean id="loginAction" class="com.xxx.LoginAction"> <property name="loginService" ref="loginService" /> </bean>
(b) 客户端
同步执行:
Account account = new Account("james", "123456"); // 传入数据模型 Action<Account, User> loginAction = Actions.getAction("loginAction"); // 对应Spring配置中的<bean id="loginAction"> User user = loginAction.execute(account); // 同步执行,并取得结果
异步执行:
Account account = new Account("james", "123456"); // 传入数据模型 Action<Account, User> loginAction = Actions.getAsyncAction("loginAction", new ActionCallback<User>() { public void callback(User user) throws Exception { // 异步执行完成后,通过此接口回传执行结果 } }); loginAction.execute(account); // 异步执行,并立即返回null
同步阻塞执行:
Account account = new Account("james", "123456"); // 传入数据模型 Action<Account, User> loginAction = Actions.getBlockingAction("loginGroup", "loginAction"); // 相同组名的Action将相互阻塞 User user = loginAction.execute(account); // 同步执行并取得结果,当同组的其它Action未完成时,该执行过程进入队列等待,当前线程被阻塞,直到结果返回
异步阻塞执行:
Account account = new Account("james", "123456"); // 传入数据模型 Action<Account, User> loginAction = Actions.getAsyncBlockingAction(("loginGroup", "loginAction", new ActionCallback<User>() { public void callback(User user) throws Exception { // 异步执行完成后,通过此接口回传执行结果 } }); loginAction.execute(account); // 异步执行,当同组的其它Action未完成时,该执行过程进入队列等待,阻塞异步线程,但不阻塞当前线程
(c) Web页面
同步执行:
var account = {username: "james", password: "123456", class: "com.xxx.Account"}; // 传入数据模型,若不指定class属性,表示使用Map类型 var loginAction = Actions.getAction("loginAction"); // 对应Spring配置中的<bean id="loginAction"> var user = loginAction.execute(account); // 同步执行并取得结果
异步执行:
var account = {username: "james", password: "123456", class: "com.xxx.Account"}; // 传入数据模型,若不指定class属性,表示使用Map类型 var loginAction = Actions.getAsyncAction("loginAction", function(user) { // 异步执行完成后,通过此接口回传执行结果 }); loginAction.execute(account); // 异步执行
(2) 导入
(a) 服务器端
struts4rcp-server.jar
import com.googlecode.struts4rcp.*; import com.googlecode.struts4rcp.server.*;
(b) 客户端
struts4rcp-client.jar
import com.googlecode.struts4rcp.*; import com.googlecode.struts4rcp.client.*;
(c) Web页面
struts4rcp.js
<script type="text/javascript" src="struts4rcp.js"></script>
(3) 配置
(a) 服务器端 (web.xml)
最简配置:
<servlet> <servlet-name>actionServlet</servlet-name> <servlet-class>com.googlecode.struts4rcp.server.ActionServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>actionServlet</servlet-name> <url-pattern>*.data</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>actionServlet</servlet-name> <url-pattern>*.json</url-pattern> </servlet-mapping>
全部配置:
<servlet> <servlet-name>actionServlet</servlet-name> <servlet-class>com.googlecode.struts4rcp.server.ActionServlet</servlet-class> <init-param> <param-name>serializers</param-name> <param-value> data: com.googlecode.struts4rcp.util.serialize.JavaSerializer, json: com.googlecode.struts4rcp.util.serialize.JsonSerializer </param-value> </init-param> <init-param> <param-name>actionFactory</param-name> <param-value> com.googlecode.struts4rcp.server.factory.SpringActionFactory </param-value> </init-param> <init-param> <param-name>actionInterceptors</param-name> <param-value> com.xxx.XXXActionInterceptor, com.yyy.YYYActionInterceptor </param-value> </init-param> <init-param> <param-name>exceptionConverters</param-name> <param-value> com.xxx.XXXExceptionConverter, com.yyy.YYYExceptionConverter </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>actionServlet</servlet-name> <url-pattern>*.data</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>actionServlet</servlet-name> <url-pattern>*.json</url-pattern> </servlet-mapping>
Spring配置:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/beans.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener>
(b) 客户端 (transport.properties)
最简配置:
server.host=127.0.0.1 server.port=8080 context.path=xxx
全部配置:
transporter=com.googlecode.struts4rcp.client.transport.HttpClientTransporter serializer=com.googlecode.struts4rcp.util.serialize.JavaSerializer listeners=com.xxx.XXXListener,com.yyy.YYYListener exceptionCatchers=com.xxx.XXXExceptionCatcher,com.yyy.YYYExceptionCatcher server.host=127.0.0.1 server.port=8080 context.path=xxx action.suffix=data
(c) Web页面 (struts4rcp.js)
最简配置:
// 不需要配置
全部配置:
Actions.suffix='json';
3. 扩展
(1) 序列化器
扩展点:
客户端(包括Web页面)与服务器端之间传递的数据格式转换。
扩展接口:
- com.googlecode.struts4rcp.util.serialize.Serializer
- com.googlecode.struts4rcp.util.serialize.AbstractSerializer
内置实现:
- com.googlecode.struts4rcp.util.serialize.JavaSerializer
- com.googlecode.struts4rcp.util.serialize.JsonSerializer
- com.googlecode.struts4rcp.util.serialize.JBossSerializer
- com.googlecode.struts4rcp.util.serialize.XmlSerializer
- com.googlecode.struts4rcp.util.serialize.XStreamSerializer
注册方式:
[list]
<init-param><param-name>serializers</param-name><param-value>data:com.xxx.XxxSerializer</param-value></init-param>
[/list]
(2) 服务器端Action实例化工厂
扩展点:
服务器端Action实例的创建和装配。
扩展接口:
- com.googlecode.struts4rcp.server.ActionFactory
内置实现:
- com.googlecode.struts4rcp.server.factory.SpringActionFactory
- com.googlecode.struts4rcp.server.factory.GuiceActionFactory
- com.googlecode.struts4rcp.server.factory.ReflectActionFactory
注册方式:
[list]
<init-param><param-name>actionFactory</param-name><param-value>com.xxx.XxxActionFactory</param-value></init-param>
[/list]
(3) 服务器端Action拦截器
扩展点:
服务器端Action实例执行过程的前后拦截,可用于权限控制,前端检验等。
扩展接口:
- com.googlecode.struts4rcp.server.ActionInterceptor
注册方式:
[list]
<init-param><param-name>actionInterceptors</param-name><param-value>com.xxx.XxxActionInterceptor</param-value></init-param>
[/list]
(4) 服务器端异常转换器
扩展点:
转换客户端无法反序列化的服务器端异常,如:将Spring的事务异常转换为客户端识别的异常。
扩展接口:
- com.googlecode.struts4rcp.server.ExceptionConverter
注册方式:
[list]
<init-param><param-name>exceptionConverters</param-name><param-value>com.xxx.XxxExceptionConverter</param-value></init-param>
[/list]
(5) 客户端传输器
扩展点:
客户端与服务器端数据交换协议与策略实现。
扩展接口:
- com.googlecode.struts4rcp.client.Transporter
- com.googlecode.struts4rcp.client.transport.AbstractTransporter
- com.googlecode.struts4rcp.client.transport.HttpTransporter
内置实现:
- com.googlecode.struts4rcp.client.transport.HttpClientTransporter
- com.googlecode.struts4rcp.client.transport.HttpURLConnectionTransporter
注册方式:
- struts4rcp.properties配置:transporter=com.xxx.XxxTransporter
- Actions.init(transporter, config);
(6) 客户端异常捕获器
扩展点:
当异步执行Action时,业务未处理的异常,由全局捕获器统一处理。
扩展接口:
- com.googlecode.struts4rcp.client.ExceptionCatcher
注册方式:
- struts4rcp.properties配置:exceptionCatchers=com.xxx.XxxExceptionCatcher
- Actions.addExceptionCatcher(exceptionCatcher);
(7) 客户端连接状态事件监听器
扩展点:
客户端的网络状态改变时触发此事件。
扩展接口:
- com.googlecode.struts4rcp.client.event.ConnectionListener
- com.googlecode.struts4rcp.client.event.ConnectionAdapter
注册方式:
- struts4rcp.properties配置:listeners=com.xxx.XXXConnectionListener
- Actions.getTransporter().addConnectionListener(listener);
(8) 客户端传输状态事件监听器
扩展点:
客户端正在与服务器传输数据时以及传输结束时触发此事件。
扩展接口:
- com.googlecode.struts4rcp.client.event.TransportListener
- com.googlecode.struts4rcp.client.event.TransportAdapter
注册方式:
- struts4rcp.properties配置:listeners=com.xxx.XXXTransportListener
- Actions.getTransporter().addTransportListener(listener);
(9) 客户端Action队列事件监听器
扩展点:
客户端的Action队列中的任务数改变时触发此事件。
扩展接口:
- com.googlecode.struts4rcp.client.event.ActionQueueListener
- com.googlecode.struts4rcp.client.event.ActionQueueAdapter
注册方式:
- struts4rcp.properties配置:listeners=com.xxx.XXXActionQueueListener
- Actions.getActionQueue().addActionQueueListener(listener);
4. 设计
(1) 部署图
struts4rcp-client.jar组件:部署于客户端,包括:
- com.googlecode.struts4rcp包
- com.googlecode.struts4rcp.util包
- com.googlecode.struts4rcp.client包
struts4rcp-server.jar组件:部署于服务器端,包括:
- com.googlecode.struts4rcp包
- com.googlecode.struts4rcp.util包
- com.googlecode.struts4rcp.server包
(2) 类图
包说明
- com.googlecode.struts4rcp包:客户端与服务器端交互面,共享模型。(中心接口:Action)
- com.googlecode.struts4rcp.client包:客户端实现。(入口类:Actions)
- com.googlecode.struts4rcp.server包:服务器端实现。(入口类:ActionServlet)
- com.googlecode.struts4rcp.util包:通用工具包,辅助实现。
领域说明
- 黄色:服务域
- 红色:会话域
- 绿色:实体域
(3) 序列图
- Client:调用者
- Actions:客户端Action门面
- ActionProxy:客户端Action代理实现
- Transporter:客户端请求发送传输器(缺省采用HttpClientTransporter)
- Serializer:传输序列化器(缺省采用JavaSerializer)
- ActionServlet:服务器端请求接收器
- ActionFactory:服务器端Action实例化工厂(缺省采用SpringActionFactory)
- ActionIntercepter:服务器端Action执行过程拦截器链
- Action:服务器端Action实例(调用目标)
项目地址:
http://struts4rcp.googlecode.com
SVN地址:
http://struts4rcp.googlecode.com/svn/trunk/code/struts4rcp
发表评论
-
能力成长模型
2012-05-09 00:28 22941最近看了温伯格1986年出版的《技术领导之路》, 很老的书,讲 ... -
以HTTL为例讲讲模块分包&领域模型&扩展框架
2011-10-09 20:08 16750注:该博客内容已加入 ... -
使用Map参数的Webx3扩展
2011-08-28 02:10 5917因Webx3是开源的,所以把这个简单的Webx3扩展发在博客上 ... -
Netty内存泄露
2011-08-02 20:09 24967转于自己在公司的Blog: ... -
Grizzly和Netty以及Mina简单性能对比
2011-07-17 02:48 29745转于自己在公司的Blog: http://pt.alibaba ... -
RPC框架几行代码就够了
2011-07-14 00:34 90195转于自己在公司的Blog: http://pt.alibaba ... -
魔鬼在细节中
2011-05-24 14:50 32255转于自己在公司的Blog: ... -
Dubbo扩展点重构
2011-05-12 22:09 38898转于自己在公司的Blog: http://pt.alibaba ... -
配置设计
2011-03-09 23:41 23586转于自己在公司的Blog: ... -
[转]HTML5设计原理
2011-03-09 22:57 7805Jeremy Keith在 Fronteers 2010 ... -
Hessian序列化不设SerializerFactory性能问题
2010-12-27 11:38 6474转于自己在公司的Blog: http://pt.alibaba ... -
动态代理方案性能对比
2010-11-17 21:38 46203转于自己在公司的Blog: http://pt.alibaba ... -
防痴呆设计
2010-11-05 18:58 17686转于自己在公司的Blog: ... -
负载均衡扩展接口重构
2010-11-05 18:53 8757转于自己在公司的Blog: ... -
分布式服务框架常被质疑的价值
2010-11-05 18:52 5734转于自己在公司的Blog: http://pt.alibaba ... -
Hessian3.2.1在序列化32.5k字符串时的问题
2010-11-05 18:49 7256转于自己在公司的Blog: http://pt.alibaba ... -
一些设计上的基本常识
2010-07-05 19:28 27737转于自己在公司的Blog: ... -
谈谈扩充式扩展与增量式扩展
2010-06-12 19:46 19385转于自己在公司的Blog: http://pt.alibaba ... -
Scaling Architecture
2010-02-25 10:31 4119Scaling Second Life: http://p ... -
EBay SOA
2010-02-23 18:23 4801EBay SOA PPT
相关推荐
1. **创建基本的 RCP 应用程序**:使用 Eclipse 提供的 RCP 模板创建一个基本的应用程序框架。 2. **添加功能**:向应用程序添加动作、首选项页面、视图和帮助等功能。 3. **品牌化**:添加商标信息,使应用程序更具...
通过RCP,开发者可以利用Eclipse的强大功能,同时保持应用程序的轻量级和高效性。 在Eclipse V3.1及以后的版本中,RCP的开发变得更加简化。这个教程适合那些想要学习如何使用RCP进行开发的人员,无论他们是否具备...
在"Java RCP企业应用快速开发框架"中,开发者可以利用预定义的UI部件和强大的事件处理机制,减少从零开始编写用户界面代码的工作量。框架提供了一套完整的生命周期管理,包括启动、初始化、运行、暂停、恢复和关闭...
Eclipse RCP是Eclipse IDE的一部分,它提供了一个框架,使得开发者可以构建功能丰富的、可定制的桌面应用程序。以下是对该书可能涉及的知识点的详细阐述: 1. **Eclipse RCP基础**:首先,书中会介绍Eclipse RCP的...
**实现RCP应用程序的步骤详解** RCP(Rich Client Platform)是Eclipse框架提供的一种用于构建桌面应用程序的平台。它允许开发者利用Eclipse的强大功能来创建功能丰富的、可扩展的应用程序,而无需从零开始编写所有...
6. **国际化和本地化**:Eclipse RCP支持多语言环境,开发者需要了解如何实现应用程序的国际化和本地化,包括资源文件的处理和语言切换机制。 7. **源代码实践**:压缩包中的源代码提供了实际的开发示例,通过分析...
标题中的“一个基于Nacos、Netty、Protobuf 实现的简单易懂的RCP框架”指的是一个使用了阿里巴巴的Nacos服务发现平台、高性能的网络库Netty以及高效的序列化协议Protobuf来构建的远程过程调用(RPC)框架。...
在压缩包中,"SOY用户手册1.2.pdf"可能是Soy Framework的用户指南,这是一个专门针对Java RCP开发的轻量级工具。Soy Framework简化了RCP开发流程,提供了快速构建界面和业务逻辑的工具集。用户手册可能会详细解释...
Eclipse RCP是一个强大的框架,用于构建桌面应用程序,而属性视图则是展示对象属性的一种可视化组件。 首先,我们要理解适配器模式的核心思想。适配器模式通过创建一个适配器类,将旧的或不兼容的接口转换成我们...
Eclipse Rich Client Platform(RCP)是一个强大的框架,用于构建桌面应用程序。在“Eclipse RCP应用系统开发方法与实战(第四章)”中,我们将深入探讨如何利用这个平台进行高效且灵活的应用程序开发。本章节主要...
Eclipse RCP(Rich Client Platform)是Eclipse框架下的一个应用程序开发平台,它提供了一种构建强大、可扩展且用户友好的桌面应用的途径。Eclipse RCP的应用系统开发涉及多个核心概念和技术,包括组件模型、事件...
Eclipse Rich Client Platform (RCP) 是一个强大的框架,用于构建桌面应用程序。它基于Java,提供了丰富的用户界面组件和插件机制,使得开发者能够构建功能丰富的、可扩展的应用程序。"Eclipse RCP 应用系统开发方法...
Eclipse Rich Client Platform (RCP) 是一个强大的框架,用于构建桌面应用程序。它基于Java,提供了丰富的用户界面组件和插件机制,使得开发者能够构建功能丰富的、可扩展的应用程序。本资源提供了"Eclipse RCP应用...
Eclipse Rich Client Platform (RCP) 是一个强大的框架,用于构建桌面应用程序,它基于Java,提供了丰富的用户界面组件和强大的插件系统。本资源提供的"《Eclipse RCP 应用系统开发方法与实战 源代码》"是针对...
Eclipse Rich Client Platform(RCP)是Eclipse框架的一个核心组成部分,它提供了一种构建桌面应用程序的框架。Eclipse RCP允许开发者利用Java语言和Eclipse插件体系结构来创建功能丰富的、可扩展的跨平台应用程序。...
Eclipse Rich Client Platform (RCP) 是一个强大的框架,用于构建桌面应用程序,它基于Java语言,利用了Eclipse IDE的强大功能。本项目“Eclipse RCP应用系统开发方法与实战”旨在深入探讨如何利用Eclipse RCP进行...
**RCP(Rich Client Platform)**是Eclipse框架下的一个重要组成部分,它提供了一种构建桌面应用程序的平台。RCP允许开发者利用Eclipse的强大功能来创建功能丰富的、自定义的、独立的应用程序,而不局限于Eclipse...
【Eclipse RCP应用系统开发】是针对软件开发领域中的一个特定技术,即Eclipse Rich Client Platform(Eclipse RCP)的深入探讨。Eclipse RCP是Eclipse框架下的一个开发平台,它允许开发者构建桌面应用程序,具有丰富...
非常好的一本JAVA RCP入门实战的书,兼顾理论和实战。