浏览 2253 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-09
最后修改:2008-12-03
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实现类: 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页面)与服务器端之间传递的数据格式转换。 扩展接口:
内置实现:
注册方式: [list] <init-param><param-name>serializers</param-name><param-value>data:com.xxx.XxxSerializer</param-value></init-param> [/list] (2) 服务器端Action实例化工厂 扩展点: 服务器端Action实例的创建和装配。 扩展接口:
内置实现:
注册方式: [list] <init-param><param-name>actionFactory</param-name><param-value>com.xxx.XxxActionFactory</param-value></init-param> [/list] (3) 服务器端Action拦截器 扩展点: 服务器端Action实例执行过程的前后拦截,可用于权限控制,前端检验等。 扩展接口:
注册方式: [list] <init-param><param-name>actionInterceptors</param-name><param-value>com.xxx.XxxActionInterceptor</param-value></init-param> [/list] (4) 服务器端异常转换器 扩展点: 转换客户端无法反序列化的服务器端异常,如:将Spring的事务异常转换为客户端识别的异常。 扩展接口:
注册方式: [list] <init-param><param-name>exceptionConverters</param-name><param-value>com.xxx.XxxExceptionConverter</param-value></init-param> [/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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |