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

2016-02-19 21:45 3 1 收藏

今天图老师小编要跟大家分享如何使用XML实现多渠道接入网站的构架,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!

【 tulaoshi.com - Web开发 】

  一.背景

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

  二.构架
  

  

  如图一所显示,在现有的所有接入都已经使用上的时候,设计者看的都眼花缭乱了,如果是为了凑份子,那这些程序怎么写都可以,而且也肯定可以实现,但维护起来就会比较痛苦,还是回到那个问题,怎么可以实现更完美呢?如图二显示:
  

  

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

    三.思想和模式

  XMLRouter的最初想法来自于计算机的主板和之中的Builder Pattern, 计算机主板的PCI 插槽定义了PCI的规范,只要你生产的卡符合PCI标准,那你插入到这个主板上就可以工作, 至于里面是怎么工作的则是已经封装好了. Builder Pattern则是提出将复杂的构建分离开来, 一步一步的进行实现.XMLRouter是将这些复杂的渠道分离开来,一个个的进行表现.

  Services思想:为了能和Router进行沟通,在这些渠道接入时必须定义统一的接口,这里成为Services, 只要符合Services规范的程序就可以接入到Router并进行数据的路由.

  Factory模式和Composite模式

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

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

    四.XML配置文件

  XML文件对于Router之中的使用分为两个部分, 第一个是Router的配置,如:
  
  以下是引用片段:
  ?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

  这是Router的配置文件, service节点代表需要接入的渠道, service节点包含connector子节点, 子节点的配置根据type来区分, 如果是database则包含url, user, passwd,driver等属性, 如果是socket则包含 port, maxthread等属性, 属性值可以根据自己的定义来配置.

  另一种XML文件则是XML交易数据文件,用于在所有的services中传递数据,每个Services自己包涵一个相应的XML文件,比如webtrans.xml格式如下:
  
  以下是引用片段:
  ?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

  相应的dbtrans.xml格式如下
  
  

  以下是引用片段:
  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

  
  其余XML则可按这样的规则来定制

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

    五.技术实现

  RouterFactory
  
  以下是引用片段:
  package com.web.router;
  import com.web.platform.Exception.RouterException;
  import java.util.java/util/Hashtable.java.html" target="_blank"Hashtable; 

  以下是引用片段:
  /**
   * Router产生和清除的类
   */
  public class RouterFactory 
  {
    /**
   * Router存储的树front
   */
    private static java/util/Hashtable.java.html" target="_blank"Hashtable QueuePairFront = null;
    /**
   * Router存储的树back
   */
    private static java/util/Hashtable.java.html" target="_blank"Hashtable QueuePairBack = null; 
  /**
   * Router存储的树
   */
    private static java/util/Hashtable.java.html" target="_blank"Hashtable QueueRouter = null; 
  
    /**
   * 返回的XMLRouter
   */
    public static XMLRouter instance = null;
    /**
   * Router的定义
   */
    public static RouterDefine routerdefine = null;
    /**
   * Router的ID号
   */
    public static long routeIndex = 0;
    /**
   * @roseuid 3F169C21027C
   */
    public RouterFactory() 
    {
    }
    /**
   * 初始化Hashtable和Vector
   */
    public static void initFactory() throws java/lang/Exception.java.html" target="_blank"Exception
    {
    QueuePairFront = new java/util/Hashtable.java.html" target="_blank"Hashtable(); 
    QueuePairBack = new java/util/Hashtable.java.html" target="_blank"Hashtable(); 
    QueueRouter    = new java/util/Hashtable.java.html" target="_blank"Hashtable();
    initRouteDefine();
    } 
  /**
   * 初始化Route的设置
   * 
   */
    private static void initRouteDefine() throws java/lang/Exception.java.html" target="_blank"Exception
    {
    if( routerdefine == null )
    routerdefine = new RouterDefine();
    routerdefine.loadRouterDef();
    }
    /**
   * 返回实例
   * @return com.web.router.XMLRouter
   */
    public static XMLRouter getInstance(long index) throws RouterException
    {
   return (XMLRouter)QueueRouter.get(new java/lang/Long.java.html" target="_blank"Long(index));
    } 
  
    /**
   * 产生一个XMLRouter的实例
   * @return com.web.router.XMLRouter
   * @roseuid 3F1618A103BC
   */
    public static XMLRouter popInstance() throws RouterException
    {
    routeIndex ++;
    instance = new XMLRouter(routeIndex);
    setDefine( instance );
    QueueRouter.put(new java/lang/Long.java.html" target="_blank"Long(routeIndex), instance);   
   return instance;
    }
    /**
   * 清空Hashtable,Vector等
   * @roseuid 3F1618B203C1
   */
    private static void freeResource() throws java/lang/Exception.java.html" target="_blank"Exception
    {
    QueuePairFront.clear();
    QueuePairBack.clear();
    QueueRouter.clear();
    QueuePairFront = QueuePairBack = QueueRouter = null;
  }
    /**
   * 清除实例
   * @param instanceID
   * @throws Exception
   */
    public static void removeInstance(XMLRouter instance) throws java/lang/Exception.java.html" target="_blank"Exception 
    {
    instance.clear();
   QueueRouter.remove( new java/lang/Long.java.html" target="_blank"Long(instance.getIndex() ) ) ;
    }
  /**
   * Method isNull.
   * @return boolean
   */
    public static boolean isNull()
    {
   …… 
    return false;
    }
  }
  XMLRouter
  
  以下是引用片段:
  package com.web.router; 
  import com.web.platform.Exception.RouterException;
  import com.web.common.*;
  import java.util.*;
  import java.lang.reflect.java/lang/reflect/Method.java.html" target="_blank"Method;
  import java.lang.reflect.java/lang/reflect/Constructor.java.html" target="_blank"Constructor; 
  /**
   * @author keli
   * @version 0.0.1
   * 平台的关键,路由的类,每个Router将从RouterFactory里读取
   * Router存储的树front,和back,routeIndex,目的是为了能在路由
   * 之后可以清除申请的对象。
   * Router可以实现同步和异步的功能.
   */
  public class XMLRouter 
  {
    /**
   * Router存储的树front
   */
   private static java/util/Hashtable.java.html" target="_blank"Hashtable QueuePairFront = null;
    /**
   * Router存储的树back
   */
   private static java/util/Hashtable.java.html" target="_blank"Hashtable QueuePairBack = null; 
  /**
   * 本router的index号码
   */
   private long routeIndex = 0; 
  /**
   * router的设置
   */
   private RouterDefine define = null;  
  /**
   * 用于判断是路由的起回点
   */
   private java/lang/String.java.html" target="_blank"String action = "";
   /**
   *此变量只是用于在routeto方法中申请新的class 
   */
   private java/lang/String.java.html" target="_blank"String classname = "";
    /**
   */
    public XMLRouter(long index) 
    {
   routeIndex = index;
    }
    /**
   * 路由
   * @throws Exception
   * @roseuid 3F1616BD0186
   */
    public void routing(Env env) throws RouterException, java/lang/Exception.java.html" target="_blank"Exception 
    {
    /*如果为起点*/
   if( action.equalsIgnoreCase( RouterConstant.CFG_FUNC_ROUTETO ) )  
   {
   ……
   }
   /*如果为返回点*/
   else if( action.equalsIgnoreCase( RouterConstant.CFG_FUNC_ROUTEBACK ) )
   {
   ……
   }
   /*否则为错误*/
   else
   throw new RouterException("Set Router action error.");
    }
  
  
   /**
   * 读取本Router的id号.
   * @return long
   */
   public long getIndex()
   {
    return routeIndex;  
   }
  
  /**
   * 清除所有对象.
   * @throws RouterException
   */
   public void clear() throws RouterException
   {
   QueuePairFront.remove(new java/lang/Long.java.html" target="_blank"Long(routeIndex));
   QueuePairBack.remove(new java/lang/Long.java.html" target="_blank"Long(routeIndex));
   /*系统回收*/
   java/lang/System.java.html" target="_blank"System.runFinalization();   
   } 
  
   /**
   * 设置本Router的设置.
   * @param def
   * @throws RouterException
   */
   public void setDefine(RouterDefine def) throws RouterException
   {
   define = def;  
   } 
   /**
   * 设置action的值
   * @param actionName
   * @throws RouterException
   */
   public void setAction( java/lang/String.java.html" target="_blank"String actionName )
   {
   action = actionName;  
   }
  }

  Service类
  
  以下是引用片段:
  package com.web.common; 
  import com.web.platform.Exception.RouterException; 
  /**
   * Service的父类,abstract 
   */
  public abstract class RouteService 
  {
    /**
   */
    public RouteService() 
    {
    }
    /**
   * routeTo方法,是交易的起点。
   * @param env
   * @throws RouterException
   */
    public abstract void routeto(Env env) throws RouterException;
    /**
   * routeBack,交易的结束点,
   * @param env
   * @throws RouterException
   */
    public abstract void routeback(Env env) throws RouterException;
    /**
   * routeaccept方法,是交易的接收点,也是routeto的接收函数,
   * routeaccept为被动交易对象的主要处理函数
   * @param env
   * @throws RouterException
   */
    public abstract void routeaccept(Env env) throws RouterException;  
    /**
   * routing方法,是Service对外的接口函数
   * @throws RouterException
   */
    public abstract void routing() throws RouterException;

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

    六.说明

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

来源:https://www.tulaoshi.com/n/20160219/1627036.html

延伸阅读
在前两篇文章中我们讨论了XML文件的读取和写入,但都是基于流模型的解决方案,今天我们就来谈谈在C#中如何实现DOM,DOM确实有它的不足,但在编程工作中它还是不可或缺的技术。下面我们来简单了解一下DOM的相关知识。 DOM的全称是Document Object Model(文档对象模型),它是来自W3C的官方标准,它允许按照W3C标准W3C DOM Level1和W3C...
标签: Web开发
首先要明确的是:XML是被设计用来存储数据、携带数据和交换数据的,他不是为了显示数据而设计的。 XML可以从HTML中分离数据 通过XML,你可以在HTML文件之外存储数据。在不使用XML时,HTML用于显示数据,数据必须存储在HTML文件之内;使用了XML,数据就可以存放在分离的XML文档中。这种方法可以让你集中精力去到使用HTML做好数据的...
标签: SQLServer
  在项目开发的过程当中,项目组开发成员的编程风格差异和数据库操作语句SQL的灵活性给项目组带来了越来越多的操作和维护难度。 比如:从user表中取出所有数据,有的人会写成“select * from user”,有的人会写成“select all from user”,虽然在操作中不会有任何的错误,但在其他人读程序的过程时就会产生不好的感觉。 如果这种程序差...
标签: Web开发
  XML(eXtensible Markup Language,可扩展标记语言)作为一种数据标记语言正在不断引起人们的关注,XML的可扩展性已经受到了越来越多的人的关注,特别是在跨平台的数据交换当中,XML技术的运用可以轻松的解决这个问题.越来越多的企业宣布将在他们的产品中增加对XML的支持,Microsoft未来的发展战略.net的实现也是完全基于XML语言,由此可...
标签: Web开发
  $fields=mysql_list_fields("embed",$table,$con); $j=0; //$num_fields=mysql_field_name($fields,$j); //echo $num_fields; while ($jmysql_num_fields($fields)){ $num_fields=mysql_field_name($fields,$j); $filestr.="".$num_fields.""; $filestr.=$row[$j]; $filestr.="/".$num_fields.""; $j++;} $filestr.="/".$table.""; } ...

经验教程

276

收藏

76
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部