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


所属类别:JSP

文章作者:未知

特别推荐:免费发布信息 承包关键词~~抢爆了!HOT!


如何使用XML实现多渠道接入网站的构架其实写这篇文章的目的最多的想法是把自己在去年在瑞士做项目时应用的一个框架给展现出来让大家共享,但我又有点担心我的表达能力不能将我在里面使用的思想很好的表现出来,所以迟迟不敢下笔,最后还是下了决心,写吧,不行就在好好改改,当然也希望大家多提些意见。一.背景在现在的网站中,接入的渠道是越来越多了,技术也是越来越先进,WAP,SMS,EMAIL,传统的Web,Socket等等,如果连数据库和LDAP也算接入的话,那在设计之中需要扩展的空间要做到很好很好,才保证在添加新的渠道情况下不需要更多的修改代码甚至不改代码的情况。但可能吗?我想也不可能,但有什么方式可以更好的解决这种多渠道接入的框架的完美性呢?二.构架【图一】如图一所显示,在现有的所有接入都已经使用上的时候,设计者看的都眼花缭乱了,如果是为了凑份子,那这些程序怎么写都可以,而且也肯定可以实现,但维护起来就会比较痛苦,还是回到那个问题,怎么可以实现更完美呢?在项目组的构架讨论中,我提出了路由的感念,并得到了大家统一的认可,如图二显示【图二】图二看起来象个八爪的章鱼,章鱼腿分别连接所有的接入渠道,进行连接所有这些渠道的核心就是这个章鱼的头XMLRouter,Router在此的作用是沟通所有渠道,实现数据的路由,争强系统在构架上的扩展性和灵活性,好处会很多很多。称呼为XMLRouter是因为如果不使用XML这种灵活而又规范的语言来做为数据传输的媒介,那Router的工作量也同样会成倍的增加,定义好XML的规范后将为以后的扩展带来很多好处.三.思想和模式XMLRouter的最初想法来自于计算机的主板和<>之中的BuilderPattern,计算机主板的PCI插槽定义了PCI的规范,只要你生产的卡符合PCI标准,那你插入到这个主板上就可以工作,至于里面是怎么工作的则是已经封装好了.BuilderPattern则是提出将复杂的构建分离开来,一步一步的进行实现.XMLRouter是将这些复杂的渠道分离开来,一个个的进行表现.Services思想:为了能和Router进行沟通,在这些渠道接入时必须定义统一的接口,这里成为Services,只要符合Services规范的程序就可以接入到Router并进行数据的路由.Factory模式和Composite模式XMLRouter在实际的设计中将采用Factory模式产生,Router由RouterFactory生产,在投入使用时将放置于队列中,传递数据和接收数据以及返回数据都从队列中取相应的Router来调用,应用了Composite的模式.四.XML配置文件XML文件对于Router之中的使用分为两个部分,第一个是Router的配置,如:[pre]<?xmlversion="1.0"?><!--databaseService--><!--WebService-->……[/pre]这是Router的配置文件,service节点代表需要接入的渠道,service节点包含connector子节点,子节点的配置根据type来区分,如果是database则包含url,user,passwd,driver等属性,如果是socket则包含port,maxthread等属性,属性值可以根据自己的定义来配置.另一种XML文件则是XML交易数据文件,用于在所有的services中传递数据,每个Services自己包涵一个相应的XML文件,比如webtrans.xml格式如下:[pre]<?xmlversion="1.0"?>[/pre]相应的dbtrans.xml格式如下[pre][/pre]其余XML则可按这样的规则来定制Ps:请参阅我之前写的文章”使用XML封装数据库操作语句的实现”五.技术实现RouterFactorypackagecom.web.router;importcom.web.platform.Exception.RouterException;importjava.util.Hashtable;/***Router产生和清除的类*/publicclassRouterFactory{/***Router存储的树front*/privatestaticHashtableQueuePairFront=null;/***Router存储的树back*/privatestaticHashtableQueuePairBack=null;/***Router存储的树*/privatestaticHashtableQueueRouter=null;/***返回的XMLRouter*/publicstaticXMLRouterinstance=null;/***Router的定义*/publicstaticRouterDefinerouterdefine=null;/***Router的ID号*/publicstaticlongrouteIndex=0;/***@roseuid3F169C21027C*/publicRouterFactory(){}/***初始化Hashtable和Vector*/publicstaticvoidinitFactory()throwsException{QueuePairFront=newHashtable();QueuePairBack=newHashtable();QueueRouter=newHashtable();initRouteDefine();}/***初始化Route的设置**/privatestaticvoidinitRouteDefine()throwsException{if(routerdefine==null)routerdefine=newRouterDefine();routerdefine.loadRouterDef();}/***返回实例*@returncom.web.router.XMLRouter*/publicstaticXMLRoutergetInstance(longindex)throwsRouterException{return(XMLRouter)QueueRouter.get(newLong(index));}/***产生一个XMLRouter的实例*@returncom.web.router.XMLRouter*@roseuid3F1618A103BC*/publicstaticXMLRouterpopInstance()throwsRouterException{routeIndex++;instance=newXMLRouter(routeIndex);setDefine(instance);QueueRouter.put(newLong(routeIndex),instance);returninstance;}/***清空Hashtable,Vector等*@roseuid3F1618B203C1*/privatestaticvoidfreeResource()throwsException{QueuePairFront.clear();QueuePairBack.clear();QueueRouter.clear();QueuePairFront=QueuePairBack=QueueRouter=null;}/***清除实例*@paraminstanceID*@throwsException*/publicstaticvoidremoveInstance(XMLRouterinstance)throwsException{instance.clear();QueueRouter.remove(newLong(instance.getIndex()));}/***MethodisNull.*@returnboolean*/publicstaticbooleanisNull(){……returnfalse;}}XMLRouterpackagecom.web.router;importcom.web.platform.Exception.RouterException;importcom.web.common.*;importjava.util.*;importjava.lang.reflect.Method;importjava.lang.reflect.Constructor;/***@authorkeli*@version0.0.1*平台的关键,路由的类,每个Router将从RouterFactory里读取*Router存储的树front,和back,routeIndex,目的是为了能在路由*之后可以清除申请的对象。*Router可以实现同步和异步的功能.*/publicclassXMLRouter{/***Router存储的树front*/privatestaticHashtableQueuePairFront=null;/***Router存储的树back*/privatestaticHashtableQueuePairBack=null;/***本router的index号码*/privatelongrouteIndex=0;/***router的设置*/privateRouterDefinedefine=null;/***用于判断是路由的起回点*/privateStringaction="";/***此变量只是用于在routeto方法中申请新的class*/privateStringclassname="";/***/publicXMLRouter(longindex){routeIndex=index;}/***路由*@throwsException*@roseuid3F1616BD0186*/publicvoidrouting(Envenv)throwsRouterException,Exception{/*如果为起点*/if(action.equalsIgnoreCase(RouterConstant.CFG_FUNC_ROUTETO)){……}/*如果为返回点*/elseif(action.equalsIgnoreCase(RouterConstant.CFG_FUNC_ROUTEBACK)){……}/*否则为错误*/elsethrownewRouterException("SetRouteractionerror.");}/***读取本Router的id号.*@returnlong*/publiclonggetIndex(){returnrouteIndex;}/***清除所有对象.*@throwsRouterException*/publicvoidclear()throwsRouterException{QueuePairFront.remove(newLong(routeIndex));QueuePairBack.remove(newLong(routeIndex));/*系统回收*/System.runFinalization();}/***设置本Router的设置.*@paramdef*@throwsRouterException*/publicvoidsetDefine(RouterDefinedef)throwsRouterException{define=def;}/***设置action的值*@paramactionName*@throwsRouterException*/publicvoidsetAction(StringactionName){action=actionName;}}[h5]Service类[/h5]packagecom.web.common;importcom.web.platform.Exception.RouterException;/***Service的父类,abstract*/publicabstractclassRouteService{/***/publicRouteService(){}/***routeTo方法,是交易的起点。*@paramenv*@throwsRouterException*/publicabstractvoidrouteto(Envenv)throwsRouterException;/***routeBack,交易的结束点,*@paramenv*@throwsRouterException*/publicabstractvoidrouteback(Envenv)throwsRouterException;/***routeaccept方法,是交易的接收点,也是routeto的接收函数,*routeaccept为被动交易对象的主要处理函数*@paramenv*@throwsRouterException*/publicabstractvoidrouteaccept(Envenv)throwsRouterException;/***routing方法,是Service对外的接口函数*@throwsRouterException*/publicabstractvoidrouting()throwsRouterException;}接下来则需要实现所有的Services的类了,这里就不做介绍了.六.说明这个Router到目前为止只能实现同步的交易,暂时不支持异步的交易,但是由于对Router使用了Composite的模式设计的,实现异步交易也是可以扩展的,这里不做详细分析.这篇文章是我工作的一个总结,希望能对大家有所帮助.不足之处希望多多指教.GoodLuck,Enjoy.Kelithisishnh@163.com关闭本页

相关信息

· 使用事件使线程同步

· 微软新系统Win Vista安全特性深度阐述

· 教你如何防治Access宏病毒的通用技巧

· Win Vista操作系统安全性能剖析








....

82666 18011