0

0

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

黄舟

黄舟

发布时间:2017-02-27 16:22:18

|

1970人浏览过

|

来源于php中文网

原创

一.背景

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

二.构架

1213.gif

 【图一】

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

1214.gif

【图二】

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

  三.思想和模式

  XMLRouter的最初想法来自于计算机的主板和之中的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的配置,如:

以下是引用片段:

情感家园企业站5.0 多语言多风格版
情感家园企业站5.0 多语言多风格版

一套面向小企业用户的企业网站程序!功能简单,操作简单。实现了小企业网站的很多实用的功能,如文章新闻模块、图片展示、产品列表以及小型的下载功能,还同时增加了邮件订阅等相应模块。公告,友情链接等这些通用功能本程序也同样都集成了!同时本程序引入了模块功能,只要在系统默认模板上创建模块,可以在任何一个语言环境(或任意风格)的适当位置进行使用!

下载
 
 
    
    
    
    
    
    
      
    
…… 

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

  另一种XML文件则是XML交易数据文件,用于在所有的services中传递数据,每个Services自己包涵一个相应的XML文件,比如webtrans.xml格式如下:

以下是引用片段:

 
 
    
      
      
      
            
        

  相应的dbtrans.xml格式如下

以下是引用片段:

 
          
      
        
        
        
              
      
   


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

  五.技术实现

  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的模式设计的,实现异步交易也是可以扩展的,这里不做详细分析.

 以上就是如何使用XML实现多渠道接入网站的构架的内容,更多相关内容请关注PHP中文网(www.php.cn)!

相关专题

更多
Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

11

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

4

2026.01.21

无人机驾驶证报考 uom民用无人机综合管理平台官网
无人机驾驶证报考 uom民用无人机综合管理平台官网

无人机驾驶证(CAAC执照)报考需年满16周岁,初中以上学历,身体健康(矫正视力1.0以上,无严重疾病),且无犯罪记录。个人需通过民航局授权的训练机构报名,经理论(法规、原理)、模拟飞行、实操(GPS/姿态模式)及地面站训练后考试合格,通常15-25天拿证。

16

2026.01.21

Python多线程合集
Python多线程合集

本专题整合了Python多线程相关教程,阅读专题下面的文章了解更多详细内容。

1

2026.01.21

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

4

2026.01.21

windows激活码分享 windows一键激活教程指南
windows激活码分享 windows一键激活教程指南

Windows 10/11一键激活可以通过PowerShell脚本或KMS工具实现永久或长期激活。最推荐的简便方法是打开PowerShell(管理员),运行 irm https://get.activated.win | iex 脚本,按提示选择数字激活(选项1)。其他方法包括使用HEU KMS Activator工具进行智能激活。

2

2026.01.21

excel表格操作技巧大全 表格制作excel教程
excel表格操作技巧大全 表格制作excel教程

Excel表格操作的核心技巧在于 熟练使用快捷键、数据处理函数及视图工具,如Ctrl+C/V(复制粘贴)、Alt+=(自动求和)、条件格式、数据验证及数据透视表。掌握这些可大幅提升数据分析与办公效率,实现快速录入、查找、筛选和汇总。

6

2026.01.21

毒蘑菇显卡测试网站入口 毒蘑菇测试官网volumeshader_bm
毒蘑菇显卡测试网站入口 毒蘑菇测试官网volumeshader_bm

毒蘑菇VOLUMESHADER_BM测试网站网址为https://toolwa.com/vsbm/,该平台基于WebGL技术通过渲染高复杂度三维分形图形评估设备图形处理能力,用户可通过拖动彩色物体观察画面流畅度判断GPU与CPU协同性能;测试兼容多种设备,但中低端手机易卡顿或崩溃,高端机型可能因发热降频影响表现,桌面端需启用独立显卡并使用支持WebGL的主流浏览器以确保准确结果

25

2026.01.21

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

7

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
XML教程
XML教程

共142课时 | 5.7万人学习

XQuery 教程
XQuery 教程

共12课时 | 3.6万人学习

XLink  教程
XLink 教程

共7课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号