Maison > développement back-end > Tutoriel XML/RSS > Comment utiliser XML pour réaliser la structure d'un site Web à accès multicanal

Comment utiliser XML pour réaliser la structure d'un site Web à accès multicanal

黄舟
Libérer: 2017-02-27 16:22:18
original
1846 Les gens l'ont consulté

1. Contexte

Dans les sites Web d'aujourd'hui, les canaux d'accès sont de plus en plus nombreux et la technologie est de plus en plus avancée, comme le WAP, le SMS, l'EMAIL, le Web traditionnel, Socket, etc. même la base de données et LDAP sont considérés comme connectés, alors l'espace qui doit être étendu dans la conception doit être très bon pour garantir que lors de l'ajout de nouveaux canaux, il n'est pas nécessaire de modifier davantage le code ou même de changer le code du tout . Mais est-ce possible ? Je ne pense pas que ce soit possible, mais existe-t-il un moyen de mieux résoudre la perfection de ce cadre d'accès multicanal ?

2.

【Image 1】Comment utiliser XML pour réaliser la structure dun site Web à accès multicanal

Comme le montre la figure 1, lorsque tous les accès existants ont été utilisés, les concepteurs sont éblouis. Si c'est pour obtenir une part, vous pouvez écrire ces programmes dedans. de toute façon, et ils peuvent certainement être mis en œuvre, mais ce sera plus pénible à maintenir. Revenons à la question, comment pouvons-nous atteindre plus de perfection comme le montre la figure 2 :

[Image 2]

Comment utiliser XML pour réaliser la structure dun site Web à accès multicanal L'image 2 ressemble à une pieuvre à huit griffes. Les pattes de la pieuvre sont respectivement connectées à tous les canaux d'accès. Le cœur de la connexion de tous ces canaux est la tête de pieuvre xmlRouter. L'objectif du routeur est ici de communiquer sur tous les canaux, de mettre en œuvre le routage des données et d'améliorer l'évolutivité et la flexibilité de l'architecture du système. Les avantages seront nombreux. Il est appelé XMLRouter car si XML, un langage flexible et standardisé, n'est pas utilisé comme support de transmission de données, la charge de travail du routeur augmentera également de façon exponentielle. La définition de la spécification XML entraînera une expansion future.

3. Idées et modèles

L'idée originale de XMLRouter est venue du modèle Builder de la carte mère de l'ordinateur et . Tant que la carte que vous produisez est conforme à la norme PCI, vous pouvez alors la brancher sur la carte mère et elle fonctionnera. Quant à son fonctionnement intérieur, il a été encapsulé. Le Builder Pattern propose de séparer la construction complexe et de la mettre en œuvre. étape par étape. .XMLRouter sépare ces canaux complexes et les exécute un par un

Idée de services : Afin de communiquer avec le routeur, une interface unifiée doit être définie lors de l'accès à ces canaux, appelée Services. tant que le programme est conforme à la spécification des services, il peut accéder aux données du routeur et du routage

Mode usine et mode composite

XMLRouter sera généré en utilisant le mode Usine dans la conception réelle, et le routeur est généré par RouterFactory Production, une fois mis en service, sera placé dans la file d'attente. Le routeur correspondant pour transmettre des données, recevoir des données et renvoyer des données est appelé depuis la file d'attente et le mode composite est appliqué

<.> 4. Fichier de configuration XML

Le fichier XML est divisé en deux parties pour une utilisation dans le Routeur La première est la configuration du Routeur, telle que :

Ce qui suit est un fragment de référence :




Il s'agit du fichier de configuration du routeur. Le nœud de service représente le canal auquel il faut accéder. Le nœud de service contient des sous-nœuds de connecteur. La configuration des sous-nœuds est distinguée selon le type. Si c'est le cas, la base de données contient des attributs tels que l'URL, l'utilisateur, le mot de passe, le pilote, etc. S'il s'agit d'un socket, il contient des attributs tels que port, maxthread, etc. Les valeurs d'attribut​​peuvent être configurées selon votre propre définition

<?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>
Copier après la connexion
Un autre fichier XML est le fichier de données de transaction XML, utilisé pour transférer des données dans tous les services. Fichier XML. Par exemple, le format de webtrans.xml est le suivant :


Ce qui suit est un fragment de référence :




Le format dbtrans.xml correspondant est le suivant

<?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>
Copier après la connexion



Ce qui suit est un fragment de citation:



Le reste du XML peut être personnalisé selon ces règles
<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>
Copier après la connexion

5. Implémentation technique

RouterFactory


Ce qui suit est un fragment de citation :



🎜>

Ce qui suit sont des fragments de citation :

package com.web.router; 
import com.web.platform.Exception.RouterException; 
import java.util.java/util/Hashtable.java.html" target="_blank">Hashtable;
Copier après la connexion



Ce qui suit est un fragment de citation :



/** 
 * 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; 
  } 
}
Copier après la connexion


Classe de service



ci-dessous Il s'agit d'un fragment de citation :


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;     
   } 
}
Copier après la connexion

Ensuite, vous devez mettre en œuvre toutes les classes de services, qui ne seront pas présentées ici.

6. Description


Ce routeur ne peut jusqu'à présent implémenter que des transactions synchrones et ne prend pas en charge les transactions asynchrones pour le moment. Étant donné que le routeur est conçu à l'aide du modèle composite, les transactions asynchrones peuvent également être étendues. Ce n'est pas le cas ici

Ce qui précède explique comment utiliser XML pour obtenir un mode multicanal. accès à la structure du site Web Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal