中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > Web开发 > JSP > Servlets
如何使用XML实现多渠道接入网站的构架
作者:未知 时间:2005-07-24 21:21 出处:JR 责编:chinaitpower
              摘要:如何使用XML实现多渠道接入网站的构架

如何使用XML实现多渠道接入网站的构架


    其实写这篇文章的目的最多的想法是把自己在去年在瑞士做项目时应用的一个框架给展现出来让大家共享,但我又有点担心我的表达能力不能将我在里面使用的思想很好的表现出来,所以迟迟不敢下笔,最后还是下了决心,写吧, 不行就在好好改改,当然也希望大家多提些意见。

一.背景


    在现在的网站中,接入的渠道是越来越多了,技术也是越来越先进,WAP, SMS,EMAIL, 传统的Web, Socket等等,如果连数据库和LDAP也算接入的话,那在设计之中需要扩展的空间要做到很好很好,才保证在添加新的渠道情况下不需要更多的修改代码甚至不改代码的情况。但可能吗?我想也不可能,但有什么方式可以更好的解决这种多渠道接入的框架的完美性呢?

二.构架


     

【图一】

    如图一所显示,在现有的所有接入都已经使用上的时候,设计者看的都眼花缭乱了,如果是为了凑份子,那这些程序怎么写都可以,而且也肯定可以实现,但维护起来就会比较痛苦,还是回到那个问题,怎么可以实现更完美呢?
    在项目组的构架讨论中,我提出了路由的感念,并得到了大家统一的认可,如图二显示
 


【图二】


    图二看起来象个八爪的章鱼,章鱼腿分别连接所有的接入渠道,进行连接所有这些渠道的核心就是这个章鱼的头XMLRouter,Router在此的作用是沟通所有渠道,实现数据的路由,争强系统在构架上的扩展性和灵活性,好处会很多很多。称呼为XMLRouter是因为如果不使用XML这种灵活而又规范的语言来做为数据传输的媒介,那Router的工作量也同样会成倍的增加,定义好XML的规范后将为以后的扩展带来很多好处.

三.思想和模式


    XMLRouter的最初想法来自于计算机的主板和<<Design Pattern>>之中的Builder Pattern, 计算机主板的PCI 插槽定义了PCI的规范,只要你生产的卡符合PCI标准,那你插入到这个主板上就可以工作, 至于里面是怎么工作的则是已经封装好了. Builder Pattern则是提出将复杂的构建分离开来, 一步一步的进行实现.XMLRouter是将这些复杂的渠道分离开来,一个个的进行表现.
    
    Services思想:为了能和Router进行沟通,在这些渠道接入时必须定义统一的接口,这里成为Services, 只要符合Services规范的程序就可以接入到Router并进行数据的路由.

    Factory模式和Composite模式
    XMLRouter在实际的设计中将采用Factory模式产生,Router由RouterFactory生产, 在投入使用时将放置于队列中,传递数据和接收数据以及返回数据都从队列中取相应的Router来调用,应用了Composite的模式.

四.XML配置文件


XML文件对于Router之中的使用分为两个部分, 第一个是Router的配置,如:
[pre]<?xml version="1.0" ?> 
<services>
    <!-- database Service -->
    <service name="database" type="database" class="com.web.service.DBService">
    <connector 
            driver="com.microsoft.jdbc.sqlserver.SQLServerDriver" 
            url="jdbc:microsoft:sqlserver://192.168.0.179:1433" user="test" 
            passwd="test" />
    </service>
    <!-- Web Service-->
    <service name="web" type="web" class="com.web.service.WebService" >
        <connector  />
    </service>
……
</services>[/pre]

这是Router的配置文件, service节点代表需要接入的渠道, service节点包含 

connector子节点, 子节点的配置根据type来区分, 如果是database则包含url, user, passwd, driver等属性, 如果是socket则包含 port, maxthread等属性, 属性值可以根据自己的定义来配置.

另一种XML文件则是XML交易数据文件,用于在所有的services中传递数据,每个Services自己包涵一个相应的XML文件,比如webtrans.xml格式如下:
[pre]<?xml version="1.0" ?> 
<transaction>
    <trans name="addDoc" service="database" method="insert">
        <property name="createtime" type="timestamp"/>
        <property name="creatorid" type="long"/>
        <property name="doctypeid" type="int"/>
        <property name="docstatusid" type="int"/>            
    </trans>        
</transaction>[/pre]
相应的dbtrans.xml格式如下
[pre]    <trans name="addDoc" table="TDOC_DOCS" method="insert">
        <primarykey name="docid" />        
        <set>
            <property name="createtime" type="timestamp"/>
            <property name="creatorid" type="long"/>
            <property name="doctypeid" type="int"/>
            <property name="docstatusid" type="int"/>            
        </set>
    </trans>[/pre]
其余XML则可按这样的规则来定制

Ps:请参阅我之前写的文章
”使用XML封装数据库操作语句的实现”


五.技术实现


RouterFactory


  1. package com.web.router;
  2. import com.web.platform.Exception.RouterException;
  3. import java.util.Hashtable;
  4. /**
  5.  * Router产生和清除的类
  6.  */
  7. public class RouterFactory 
  8. {
  9.    
  10.    /**
  11.     * Router存储的树front
  12.     */
  13.    private static Hashtable QueuePairFront = null;
  14.    
  15.    /**
  16.     * Router存储的树back
  17.     */
  18.    private static Hashtable QueuePairBack = null;
  19.    /**
  20.     * Router存储的树
  21.     */
  22.    private static Hashtable QueueRouter = null;
  23.    /**
  24.     * 返回的XMLRouter
  25.     */
  26.    public static XMLRouter instance = null;
  27.    /**
  28.     * Router的定义
  29.     */
  30.    public static RouterDefine routerdefine = null;
  31.    /**
  32.     * Router的ID号
  33.     */
  34.    public static long routeIndex = 0;
  35.    
  36.    
  37.    /**
  38.     * @roseuid 3F169C21027C
  39.     */
  40.    public RouterFactory() 
  41.    {
  42.     
  43.    }
  44.    
  45.    /**
  46.     * 初始化Hashtable和Vector
  47.     */
  48.    public static void initFactory() throws Exception
  49.    {
  50.            QueuePairFront = new Hashtable(); 
  51.            QueuePairBack  = new Hashtable(); 
  52.            QueueRouter       = new Hashtable();
  53.            initRouteDefine();
  54.    }
  55.     /**
  56.      * 初始化Route的设置
  57.      * 
  58.      */
  59.    private static void initRouteDefine() throws Exception
  60.    {
  61.            if( routerdefine == null )
  62.                routerdefine = new RouterDefine();
  63.            routerdefine.loadRouterDef();
  64.    }
  65.    
  66.   
  67.    /**
  68.     * 返回实例
  69.     * @return com.web.router.XMLRouter
  70.     */
  71.    public static XMLRouter getInstance(long index) throws RouterException
  72.    {
  73.         return (XMLRouter)QueueRouter.get(new Long(index));
  74.    }
  75.    /**
  76.     * 产生一个XMLRouter的实例
  77.     * @return com.web.router.XMLRouter
  78.     * @roseuid 3F1618A103BC
  79.     */
  80.    public static XMLRouter popInstance() throws RouterException
  81.    {
  82.            routeIndex ++;
  83.            instance = new XMLRouter(routeIndex);
  84.            setDefine( instance );
  85.            QueueRouter.put(new Long(routeIndex), instance);          
  86.         return instance;
  87.    }
  88.    
  89.    /**
  90.     * 清空Hashtable,Vector等
  91.     * @roseuid 3F1618B203C1
  92.     */
  93.    private static void freeResource() throws Exception
  94.    {
  95.            QueuePairFront.clear();
  96.            QueuePairBack.clear();
  97.            QueueRouter.clear();
  98.            QueuePairFront = QueuePairBack = QueueRouter = null;
  99. }
  100.    
  101.    /**
  102.     * 清除实例
  103.     * @param instanceID
  104.     * @throws Exception
  105.     */
  106.    public  static void removeInstance(XMLRouter instance) throws Exception 
  107.    {
  108.            instance.clear();
  109.         QueueRouter.remove( new Long(instance.getIndex() ) ) ;
  110.    }
  111.    
  112.    
  113. /**
  114.  * Method isNull.
  115.  * @return boolean
  116.  */
  117.    public static boolean isNull()
  118.    {
  119.         …… 
  120.           return false;
  121.    }
  122. }



XMLRouter


  1. package com.web.router;
  2. import com.web.platform.Exception.RouterException;
  3. import com.web.common.*;
  4. import java.util.*;
  5. import java.lang.reflect.Method;
  6. import java.lang.reflect.Constructor;
  7. /**
  8.  * @author keli
  9.  * @version 0.0.1
  10.  * 平台的关键,路由的类,每个Router将从RouterFactory里读取
  11.  * Router存储的树front,和back,routeIndex,目的是为了能在路由
  12.  * 之后可以清除申请的对象。
  13.  * Router可以实现同步和异步的功能.
  14.  */
  15. public class XMLRouter 
  16. {
  17.    /**
  18.     * Router存储的树front
  19.     */
  20.     private static Hashtable QueuePairFront = null;
  21.    
  22.    /**
  23.     * Router存储的树back
  24.     */
  25.     private static Hashtable QueuePairBack = null;
  26.     /**
  27.      * 本router的index号码
  28.      */
  29.     private long routeIndex = 0;
  30.     /**
  31.      * router的设置
  32.      */
  33.     private RouterDefine  define = null;   
  34.     /**
  35.      * 用于判断是路由的起回点
  36.      */
  37.     private String  action = "";
  38.     
  39.     /**
  40.      *此变量只是用于在routeto方法中申请新的class 
  41.      */
  42.     private String  classname = "";
  43.        
  44.        /**
  45.     */
  46.        public XMLRouter(long index) 
  47.        {
  48.         routeIndex = index;
  49.        }
  50.    
  51.        /**
  52.     * 路由
  53.     * @throws Exception
  54.     * @roseuid 3F1616BD0186
  55.     */
  56.        public void routing(Env env) throws RouterException, Exception 
  57.        {
  58.            /*如果为起点*/
  59.         if( action.equalsIgnoreCase( RouterConstant.CFG_FUNC_ROUTETO  ) )    
  60.         {
  61.             ……
  62.         }
  63.         /*如果为返回点*/
  64.         else if( action.equalsIgnoreCase( RouterConstant.CFG_FUNC_ROUTEBACK  ) )
  65.         {
  66.          ……
  67.         }
  68.         /*否则为错误*/
  69.         else
  70.             throw new RouterException("Set Router action error.");
  71.        }
  72.    
  73.    
  74.     /**
  75.      * 读取本Router的id号.
  76.      * @return long
  77.      */
  78.      public long  getIndex()
  79.      {
  80.            return routeIndex;       
  81.      }
  82.    
  83.     /**
  84.      * 清除所有对象.
  85.      * @throws RouterException
  86.      */
  87.     public void clear() throws RouterException
  88.     {
  89.         QueuePairFront.remove(new Long(routeIndex));
  90.         QueuePairBack.remove(new Long(routeIndex));
  91.         /*系统回收*/
  92.         System.runFinalization();         
  93.     }
  94.     
  95.     /**
  96.      * 设置本Router的设置.
  97.      * @param def
  98.      * @throws RouterException
  99.      */
  100.     public void setDefine(RouterDefine def) throws RouterException
  101.     {
  102.         define = def;    
  103.     } 
  104.     
  105.     /**
  106.      * 设置action的值
  107.      * @param actionName
  108.      * @throws RouterException
  109.      */
  110.     public void setAction( String actionName )
  111.     {
  112.         action = actionName;        
  113.     }
  114. }
  115. [h5]Service类[/h5]
  116. package com.web.common;
  117. import com.web.platform.Exception.RouterException;
  118. /**
  119.  * Service的父类,abstract 
  120.  */
  121. public abstract class RouteService 
  122. {
  123.    
  124.    /**
  125.     */
  126.    public RouteService() 
  127.    {
  128.     
  129.    }
  130.    
  131.    /**
  132.     * routeTo方法,是交易的起点。
  133.     * @param env
  134.     * @throws RouterException
  135.     */
  136.    public abstract void routeto(Env env) throws RouterException;
  137.    
  138.    /**
  139.     * routeBack,交易的结束点,
  140.     * @param env
  141.     * @throws RouterException
  142.     */
  143.    public abstract void routeback(Env env) throws RouterException;
  144.    
  145.    
  146.    /**
  147.     * routeaccept方法,是交易的接收点,也是routeto的接收函数,
  148.     * routeaccept为被动交易对象的主要处理函数
  149.     * @param env
  150.     * @throws RouterException
  151.     */
  152.    public abstract void routeaccept(Env env) throws RouterException;   
  153.    
  154.    /**
  155.     * routing方法,是Service对外的接口函数
  156.     * @throws RouterException
  157.     */
  158.    public abstract void routing() throws RouterException;    
  159. }


接下来则需要实现所有的Services的类了,这里就不做介绍了.

六.说明


这个Router到目前为止只能实现同步的交易, 暂时不支持异步的交易,但是由于对Router使用了Composite的模式设计的,实现异步交易也是可以扩展的,这里不做详细分析.

这篇文章是我工作的一个总结,希望能对大家有所帮助.不足之处希望多多指教.


Good Luck, Enjoy.

Keli  thisishnh@163.com
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有