麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > XML > 正文

怎樣使用XML實現多渠道接入網站的構架

2024-09-05 20:54:37
字體:
來源:轉載
供稿:網友

一.背景

在現在的網站中,接入的渠道是越來越多了,技術也是越來越先進,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模式

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的模式設計的,實現異步交易也是可以擴展的,這里不做詳細分析.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美视频在线观看一区 | 91九色免费视频 | 黑人一区二区 | 久久手机在线视频 | 成人羞羞视频在线观看免费 | 国毛片| 国产99久久久久久免费看农村 | 日韩黄色一级视频 | av免费在线观看国产 | 成人三级电影网站 | 欧美91看片特黄aaaa | 成人在线不卡 | 欧洲成人在线视频 | 成人短视频在线观看免费 | 欧美大胆xxxx肉体摄影 | 日日综合| 欧美一级黑人 | 暖暖免费观看高清完整版电影 | 欧美精品日日鲁夜夜添 | 亚洲成人高清在线观看 | 国产亚洲精品久久久久久久 | 国产99久久精品一区二区 | 国产精品视频导航 | 在线播放中文 | 国色天香综合网 | 国产精品午夜未成人免费观看 | 91在线视频播放 | 亚洲午夜一区二区三区 | 激情小说色 | 涩涩激情网 | 国产精品成人免费一区久久羞羞 | 撅高 自己扒开 调教 | 精品无吗乱吗av国产爱色 | 在线播放免费人成毛片乱码 | 国产一级αv片免费观看 | 斗罗破苍穹在线观看免费完整观看 | 妇子乱av一区二区三区 | 在线观看av国产一区二区 | 欧美 videos粗暴 | 久久探花| 免费淫视频|