最近在做的项目,是一个C/S和B/S混合的项目,我主要负责设计开发框架部分,
最开始设计时,因时间仓促,没有细想,就草草上阵了,
现在项目快结束了,回过头来想想,还是有很多地方可以完善,这里说一下数据传输这一块。
因项目中B/S使用的是Struts2,所以C/S也通过Struts2提供的拦截器和Result扩展点进行了适配,
使得C/S数据传输序列化与反序列化对于业务逻辑透明化,目的是要让服务器端B/S和C/S写法一致。(客户端使用HttpClient实现)
Struts2整体设计还行,但确越来越臃肿,而且对RCP支持很不友好。
其实,C/S主流设计思路中,都是在Service层留出接口,并将接口部署到客户端,
中间通过RMI, Hessian, Burlap, WebService, HttpInvoker等任意方式生客户端Stub,
Stub实现中所有接口函数都远程代理服务器端相应Service实现,也就是客户端与服务器端对等体,
这样就可以通过接口“直接”调用服务器端函数,从而进行透明化数据传输。
B/S中的DWR也使用了这种方式。
这种设计的主要好处就是全部透明化,但将接口部署到客户端不是很方便,
而且服务器上的函数调用起来太方便,如果交互函数粒度较小,会使得业务逻辑向客户端倾斜,
保留Action门面,似乎还是很有必要的,这样可以保证客户端与服务器端交互粒度足够大,
但Action应该以数据为中心,而不是以控制为中心,
在RCP应用中,视图控制基本转移到客户端了,Action不应再对“跳转/切换”之类的过多关注,
WEB应用中的MVC框架,其返回值大多用来做控制,这也是它们不太适宜兼容RCP的问题所在。
按这个思路的设计如下:
客户端与服务器端共享:
Action接口:(在Action门面层实现透明化对等体)
public interface Action {
Serializable execute(Serializable object);
}
服务器端:
实现Action接口:
public class XxxAction implements Action {
private XxxService xxxService;
public void setXxxService(XxxService xxxService) {
this.xxxService = xxxService;
}
public Serializable execute(Serializable object) {
// ...
}
}
在spring的beans.xml中注册:
<bean id="xxxAction" class="com.xxx.action.XxxAction">
<property name="xxxService" ref="xxxService"/>
</bean>
RCP应用客户端: (使用Swing/SWT做视图,序列化对象作传输)
在Java代码中,使用如:
// 返回的是代理,但看起来像拿到了服务器端的Action
Action xxxAction = ActionFacade.getAction("xxxAction");
// result和params为任意可序列化对象
Object result = xxxAction.execute(params);
WEB应用客户端: (使用ExtJS做视图,JSON作传输)
在JSP页面中,使用如:
<!-- name属性为action在beans.xml中注册的id号 -->
<ext:action var="xxxAction" name="xxxAction" />
<ext:script>
<!-- result和params为json对象 -->
var result = xxxAction.execute(params);
</ext:script>
当然,服务器端拦截器的设计是必不可少的,
这种天然的截面,比AOP的自动代理用起来方便很多。
包括安全,检验,转换,控制都可以使用该截面统一实现。
拦截接口:
public interface ActionInterceptor {
Serializable intercept(Action action, Serializable object);
}
另外,ThreadLocal的ActionContext也是必要的,
用于封装交互过程的附属信息等。
如:
ActionContext.getContext().getRequest();
ActionContext.getContext().getSession();
分享到:
相关推荐
在本教程中,我们将深入探讨如何利用.RCP(点云数据)文件进行建筑图纸的绘制,特别是针对现代建筑和历史建筑的复原工作。 首先,我们需要理解什么是.RCP文件。.RCP是“Reality Computing Point Cloud”(现实计算...
该数据集包含的是关于中亚五国在两种不同的气候情景(RCP2.6和RCP4.5)下,棉花和冬小麦...同时,这些数据也可以为农业模型提供输入,以模拟不同气候情景下的作物生长和需水量,从而为农业规划和可持续发展提供依据。
Eclipse JFace Databinding This article explains the Eclipse JFace Databinding....The article assumes that you are familiar with Eclipse RCP development. In this article Eclipse 3.5 (Galileo) is used.
**RCP(Rich Client Platform)与OSGI详解** **RCP概述** RCP,全称为Rich Client Platform,是由Eclipse基金会开发的一种软件框架,主要用于构建功能丰富的桌面应用程序。RCP提供了一个灵活的基础平台,允许开发者...
### 基于Java拓扑模型和RCP的GIS平台研究 #### 1. 引言:软件框架在GIS开发中的重要性 软件框架在现代软件工程中扮演着至关重要的角色,尤其在地理信息系统(GIS)领域。软件框架提供了一种可复用的设计架构,不仅...
本文通过实验数据分析了不同风速对RCP封装热阻的影响,发现随着风速增大,热阻会有所下降,但这种影响并不是简单的线性关系。 知识点六:流体对热阻的影响 文中提到了流体(主要是指空气)流动条件对芯片封装热阻的...
- **模型(Model)**:数据模型,尽管实例中未使用数据库,但模型概念依然重要,可以用于存储和管理应用程序的数据。 - **事件(Event)**:RCP使用事件驱动模型,组件通过监听和触发事件进行通信。 - **扩展点...
3. **模型(Model)**:RCP支持基于模型的开发,这意味着数据和视图是分离的。模型定义了应用的数据结构,而视图则负责展示这些数据。 4. **扩展点(Extension Points)**:这是RCP的灵活性所在。通过定义和使用...
RCP基于模型的开发方式允许开发者在Simulink平台上进行控制算法和驱动的开发,这大大简化了集成环节。通过使用RCP,开发者可以在同一平台上构建程序架构,一键生成产品化代码,且代码质量高,对最终产品具有很强的...
由于闪电不是气候模型的输出变量,因此进行了测试以评估作为模型输出的海洋和大气场观测数据与RINDAT和BrasilDAT检测网络产生的闪电之间的关系。 结果,获得0.84的相关性。 在这些预测中,已经证实,尽管在当前气候...
5. **模型-视图-控制器(MVC)**:RCP遵循MVC设计模式,理解如何分离业务逻辑、数据模型和用户界面,提高代码的可维护性和可扩展性。 6. **程序集成功能**:学习如何打包RCP应用程序,包括生成产品配置、创建可执行...
开发者应使用HTTPS来加密传输,防止数据被窃取或篡改。同时,更新站点的验证也非常重要,以防止恶意的第三方站点提供假的更新。 总结起来,RCP在线升级是一个涉及元数据管理、依赖关系解析、用户交互以及错误处理的...
6. **模型(Model)**:在“simplebrowser”中,可能存在一个模型来存储和管理浏览器的数据,比如网页URL、书签等。 7. **服务(Service)**:RCP通过服务接口提供通用功能,比如国际化服务(Internationalization ...
1. **RCP架构**:RCP基于插件模型,由多个插件组成,每个插件都有明确的职责划分,这使得系统具有高度的模块化和可扩展性。图片可能会展示这些插件如何互相协作,以及它们在整体架构中的位置。 2. **工作台...
RCP基于插件模型,每个功能模块都可以作为一个独立的插件,这使得RCP具有高度的可扩展性和灵活性。在RCP应用中,界面布局通常由多个组件构成,如视图(View)、编辑器(Editor)、透视图(Perspective)等。 视图是...
6. **模型-视图-控制器(MVC)**:设计模式,用于分离用户界面的表示层、业务逻辑和数据模型。在RCP中,模型处理数据,视图显示数据,而控制器处理用户输入并协调模型和视图。 7. **命令(Command)**:Eclipse RCP...
- **Eclipse RCP架构**:RCP基于插件模型,每个功能模块都是一个独立的插件,通过服务定位和服务依赖来实现组件间的通信。 - **工作台(Workbench)**:RCP的核心组成部分,负责管理窗口、视图、编辑器等用户界面...
4. **数据模型**:创建一个数据模型来存储`Person`对象,通常会使用`ArrayList`或者`ObservableList`,这样可以监听数据变化并更新视图。 5. **绑定数据**:将数据模型与表格视图关联起来,例如使用`TableViewer`的...
课程中可能还会涉及RCP的事件模型,它是RCP中不同组件之间通信的关键。你需要学习如何使用事件监听器来处理用户操作和其他组件的交互。此外,还要学习服务(Services)的概念,服务是RCP中实现模块化和解耦的一种...