网络编程
位置:首页>> 网络编程>> XML编程>> 如何使用XML实现多渠道接入网站的构架

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

 来源:互联网 发布时间:2008-09-05 17:13:00 

标签:

一.背景

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

二.构架

【图一】

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

【图二】

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

三.思想和模式

XMLRouter的最初想法来自于计算机的主板和<

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

Factory模式和Composite模式

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则可按这样的规则来定制

五.技术实现

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

0
投稿

猜你喜欢

  • SQL触发器实例1 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一
  • 先装 MYSQL 的 ODBC 驱动然后'connect to MySQL server&n
  • 给浏览器绑定事件有时候是非常痛苦的事情,不同的浏览器提供不尽相同的功能的同时,也提供了不同的事件。例如,IE 系列的浏览器支持 mousee
  • 这些导航菜单来自于Dribbble网站,出自于世界各地的优秀设计师之手,涵盖了各种不同的风格,个个都非常精美。这里我将这些导航菜单展示出来,
  • 小编语:小编我最早使用的网页制作工作就是FrontPage啦,FrongPage方便简单,会用Word就能做网页。如果你对网页制作要求不高,
  •  <% Function FileCounter(counter_file) Dim fs,txt,fi
  • 许多服务器管理员都知道,MySQL数据库管理系统(RDBMS)是高度灵活的软件块,带有范围广阔的启动选项,可以用来修改相关行为。然而,大部分
  • (一) 常用的CSS命名规则:头:header内容:content/container尾:footer导航:nav侧栏:sidebar栏目:
  • 所谓天赋(左脑和右脑)也就是你是否有艺术天赋,天赋也许是存在的,这主要在于人类左右脑的分工。左脑主要负责逻辑理解、语言、判断、分类、分析、推
  • 在使用DB2以来,碰到了几次出现提示SQL1032N错误,每次出错时出错信息大概如下:11/21/2004 22:15:33 0 0 SQL
  • 如何做一个自己的QQ?这不是什么新鲜的东西,看看代码:refresh.htm<HTML><HEAD><titl
  • 随着PHP4.0和JSP技术的推出以及IIS中不断出现的重大的安全问题,MicroSoft的ASP的市场仿佛是变的狭窄了,但是 MicroS
  • 在使用mysql视图是出现问题: The user specified as a definer ('root'@'
  • 深底色风格的页面设计很受欢迎,它可以创造出别致优雅、极富创造力的效果。深底色设计适用于许多网站类型,但并非所有。这种风格应该在恰当的条件下使
  • 近日在学习C++,看到函数指针,由于之前一直搞ASP,所以想ASP里面是否也有这个函数指针的东西,于是翻了翻VBScript手册,没让我失望
  • kelon 问:格式如下:s="地,在要,大,奇功,不知,但是,不示"我想把它split分出來,变成数组來循环,但是不知
  • 1. 首先,你需要安装最新的服务包为了提高服务器安全性,最有效的一个方法就是升级到SQL Server 2000 Service Pack
  • DB2 存储过程:基础知识您在客户端工作站上对远程服务器和位于该服务器上的数据库进行分类的任何时候,都存在一个简单的 DB2 客户端/服务器
  • 另:@会影响效率如:@mysql_connect()    可以导出错误,但会影响效率。mysql与mysqli的区别:
  • 最近看到好多人说到tns或者数据库不能登录等问题,就索性总结了下面的文档。首先来说Oracle的网络结构,往复杂处说能加上加密、LDAP等等
手机版 网络编程 asp之家 www.aspxhome.com