客户端与服务端的通讯

一、概述


上图简单描述了框架中的客户端与服务端通讯,画面调用doAction()方法,读取画面的配置文件,并根据配置文件将画面上的内容映射到bean中,然后通过Spring HttpInvoker的将组成的bean传到服务端。
二、画面映射
现在使用的画面映射的方法有两种:
  • 及时映射:控件的值改变后就直接映射到bean中,bean中的值改变后也及时映射到画面的控件中。
  • 延时映射:在需要时将所有的需要的控件值一起映射到bean中,或在需要时将bean中所有的值映射到画面中。
项目中采用的第二中,在画面调用doAction()方法的时候,将控件的值映射bean,传输给服务端;都服务端的结果bean返回将bean中的值,再映射到画面中。这个过程的有以下三个过程实现:
画面配置文件解析
  • 映射工具类
  • 属性类型
  • ValueItem
  • bean
1、画面配置文件解析
<? xml version="1.0" encoding="UTF-8"  ?>
< frames >
  
< frame  id ="画面ID"  classtype ="画面名"  loadbeanid ="CertList_LoadBean" >
    
< forms >
      
< form  id ="CertList_LoadBean" >
        ......
      
</ form >
      
< form  id ="bean ID"  validator ="validator ID" >
        
< field  id ="属性名"  control ="控件名"  type ="类型"   />
        ......
      
</ form >
      ......
    
</ forms >
    
< actions >
      
< action  id  = "Action ID"  name  = "Action名"  inputid ="参数bean ID"  outputid  = "返回bean ID" />
      ......
    
</ actions >
  
</ frame >
</ frames >

    根据每个Action配置参数Bean和返回Bean。每个属性都有ID和类型,如果控件名省略就对应一个画面中的非控件属性。
2、映射工具类
    读取控件的值,并作一些简单的check和类型转换。Check通过Spring的Valang Validator实现,通过check后作类型转换后放入bean中。
3、属性类型
    画面的属性分为三种类型,控件属性,frame属性,action属性。
  • 控件属性对应一个控件,值保存在控件中。
  • Frame属性保存在画面的缓存中,画面销毁的时候会清楚。
  • Action属性,在每个action执行完后会将所有的Action属性清除,然后将Action执行的结果中的action属性映射如对应的画面属性中。
4、ValueItem
    在项目设计的前期由于领导的坚持在数据的传输过程中,加入了ValueItem的概念,将每个属性以及其类型封装入ValueItem中,但是由于封装的太薄,反而没有看到优势,总觉得是个累赘。可是在日另一个项目[自治体财务]的开发过程中也发现了类似ValueItem的东西,只不过功能更丰富,觉得是个挺不错的东西。
    ValueItem的改进思路:
    从画面中直接将String值和控件保存入ValueItem中,然后进行类型验证和Validate。验证失败后将控件的背景色改变。验证通过后以String的形式将值传入服务器端。
5、Bean
    Bean中保存了一个ValueItem的集合,现在的系统中是每个Action对应一个bean,Bean中实际存放的是一个HashMap,传输的时候将整个HashMap序列化传入服务端。
三、传输
    现在系统中的传输使用了SpringHttpInvoker机能,非常方便在Spring中配置以后可以直接传输Java对象。
1、定义接口
package study.service;

import study.bean.ActionBean;
import study.bean.ResultBean;

/**
 * <b>サブシステム名:</b>XXXXXXフレームワーク共通<br>
 * <b>機能名称:</b>リモート通信共通機能<br>
 * <b>処理説明:</b>リモートサービスインタフェースを定義するクラス。<br>
 * <b>変更履歴:</b>2007/07/04 XXXXX 新規<br>
 * <br>
 * 
 * @author XXXXX
 * @since 1.0.0
 * @version 1.0.0 2007/07/04 初版
 * <p>
 */
public interface IRemotingService {

    /**
     * <b>機能概要:</b> ログインアクションの入り口。<br>
     * <br>
     * <b>処理詳細:</b> <br>
     * <ul>
     * <li>ログインアクションの入り口
     * </ul>
     * 
     * @param bean クライアントのビーン
     * @return ResultBean 実行結果
     * @since 1.0.0
     * <p>
     */
    public ResultBean login(ActionBean bean);

    /**
     * <b>機能概要:</b> ビジネスアクションの入り口。<br>
     * <br>
     * <b>処理詳細:</b> <br>
     * <ul>
     * <li>ビジネスアクションの入り口
     * </ul>
     * 
     * @param bean クライアントのビーン
     * @return ResultBean 実行結果
     * @since 1.0.0
     * <p>
     */
    public ResultBean execute(ActionBean bean);

    /**
     * <b>機能概要:</b> ログアウトアクションの入り口。<br>
     * <br>
     * <b>処理詳細:</b> <br>
     * <ul>
     * <li>ログアウトアクションの入り口
     * </ul>
     * 
     * @param bean クライアントのビーン
     * @return ResultBean 実行結果
     * @since 1.0.0
     * <p>
     */
    public ResultBean logout(ActionBean bean);
}

2,服务器端配置
     < bean  name ="/RemotingService"  class ="jp.co.XXX.framework.server.handler.CenterAppHttpInvokerServiceExporter" >
        
< property  name ="service" >
            
< bean  class ="jp.co.XXX.framework.server.handler.RemotingController" >
                
< property  name ="handlerMapping"  ref ="remotingMapping"   />
                
< property  name ="actionValidate"  ref ="/ActionValidate"   />
            
</ bean >
        
</ property >
        
< property  name ="serviceInterface"  value ="jp.co.XXX.framework.common.service.IRemotingService"   />
    
</ bean >
3,客户端配置

    
<!--  **RMI**  -->     < bean  id ="remotingFactoryBean"  class ="jp.co.XXX.framework.common.remoting.DCHttpInvokerProxyFactoryBean" >
        
< property  name ="serviceUrl"
            value
="${server.prefix}${server.ip}:${server.port}/${server.module}/${server.service.remoting}"   />
        
< property  name ="serviceInterface"  value ="jp.co.XXX.framework.common.service.IRemotingService"   />
    
</ bean >




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值