搜尋
首頁後端開發XML/RSS教程如何使用XML實現多通路接取網站的架構

一.背景

  在現在的網站中,存取的管道是越來越多了,技術也是越來越先進,WAP, SMS,EMAIL, 傳統的Web, Socket等等,如果連資料庫和LDAP也算是存取的話,那在設計之中需要擴充的空間要做到很好很好,才保證在新增新的管道情況下不需要更多的修改程式碼甚至不改程式碼的情況。但可能嗎?我想也不可能,但有什麼方式可以更好的解決這種多渠道接入的框架的完美性呢?

二.構架

如何使用XML實現多通路接取網站的架構

## 【圖一】

 如圖一所顯示,在現有的所有接入都已經使用上的時候,設計者看的都眼花繚亂了,如果是為了湊份子,那這些程式怎麼寫都可以,而且也肯定可以實現,但維護起來就會比較痛苦,還是回到那個問題,怎麼可以實現更完美呢?如圖二顯示:

如何使用XML實現多通路接取網站的架構##【圖二】

 圖二看起來像八爪的章魚,章魚腿分別連接所有的接入渠道,進行連接所有這些渠道的核心就是這個章魚的頭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的模式設計的,實現異步交易也是可以擴展的,這裡不做詳細分析.###### 以上就是如何使用XML實現多通路接取網站的架構的內容,更多相關內容請關注PHP中文網(www.php.cn)! ################
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
從XML到可讀的內容:揭開RSS feed的神秘面紗從XML到可讀的內容:揭開RSS feed的神秘面紗Apr 11, 2025 am 12:03 AM

rssfeedsarexmldocuments usedforcontentAggregation and distribution.totransformthemintoreadableContent:1)parsethethexmlusinglibrarieslibrariesliblarieslikeparserinparserinpython.2)andledifferentifferentrssssssssssssssssssssssssssssssssssssssssssssssersions andpotentionparsingrorS.3)

是否有基於JSON的RSS替代方案?是否有基於JSON的RSS替代方案?Apr 10, 2025 am 09:31 AM

JSONFeed是一種基於JSON的RSS替代方案,其優勢在於簡潔性和易用性。 1)JSONFeed使用JSON格式,易於生成和解析。 2)它支持動態生成,適用於現代Web開發。 3)使用JSONFeed可以提升內容管理效率和用戶體驗。

RSS文檔工具:構建,驗證和發布提要RSS文檔工具:構建,驗證和發布提要Apr 09, 2025 am 12:10 AM

如何構建、驗證和發布RSSfeeds? 1.構建:使用Python腳本生成RSSfeed,包含標題、鏈接、描述和發布日期。 2.驗證:使用FeedValidator.org或Python腳本檢查RSSfeed是否符合RSS2.0標準。 3.發布:將RSS文件上傳到服務器,或使用Flask動態生成並發布RSSfeed。通過這些步驟,你可以有效管理和分享內容。

確保您的XML/RSS提要:全面的安全清單確保您的XML/RSS提要:全面的安全清單Apr 08, 2025 am 12:06 AM

確保XML/RSSfeeds安全性的方法包括:1.數據驗證,2.加密傳輸,3.訪問控制,4.日誌和監控。這些措施通過網絡安全協議、數據加密算法和訪問控制機制來保護數據的完整性和機密性。

XML/RSS面試問題和答案:提高您的專業知識XML/RSS面試問題和答案:提高您的專業知識Apr 07, 2025 am 12:19 AM

XML是一種標記語言,用於存儲和傳輸數據,RSS是一種基於XML的格式,用於發布頻繁更新的內容。 1)XML通過標籤和屬性描述數據結構,2)RSS定義特定標籤發布和訂閱內容,3)使用Python的xml.etree.ElementTree模塊可以創建和解析XML,4)XPath表達式可查詢XML節點,5)feedparser庫可解析RSSfeed,6)常見錯誤包括標籤不匹配和編碼問題,可用xmllint驗證,7)使用SAX解析器處理大型XML文件可優化性能。

高級XML/RSS教程:ACE您的下一次技術採訪高級XML/RSS教程:ACE您的下一次技術採訪Apr 06, 2025 am 12:12 AM

XML是一種用於數據存儲和交換的標記語言,RSS是基於XML的格式,用於發布更新內容。 1.XML定義數據結構,適合數據交換和存儲。 2.RSS用於內容訂閱,解析時使用專門庫。 3.解析XML可使用DOM或SAX,生成XML和RSS需正確設置元素和屬性。

從XML/RSS到JSON:現代數據轉換策略從XML/RSS到JSON:現代數據轉換策略Apr 05, 2025 am 12:08 AM

使用Python可以從XML/RSS轉換到JSON。 1)解析源數據,2)提取字段,3)轉換為JSON,4)輸出JSON。使用xml.etree.ElementTree和feedparser庫解析XML/RSS,使用json庫生成JSON數據。

XML/RSS和REST API:現代網絡開發的最佳實踐XML/RSS和REST API:現代網絡開發的最佳實踐Apr 04, 2025 am 12:08 AM

XML/RSS和RESTAPI在現代網絡開發中協同工作,通過以下方式:1)XML/RSS用於內容髮布和訂閱,2)RESTAPI用於設計和操作網絡服務。結合使用這兩者可以實現高效的內容管理和動態更新。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),