Introduction▲
Pour créer une application web en Delphi, on peut utiliser les technologies suivantes : WebBroker, WebSnap, IntraWeb ou bien ASP.NET. XMLRAD est un substitut à ces technologies avec l'avantage d'être un framework qui se base sur la technologie standard XML/XSL pour générer les pages HTML.
La technologie XML/XSL permet une séparation des données (XML) de leur représentation (XSL). Cela facilite le développement et la maintenance de l'application. Le code de gestion est lui placé dans une classe Java enregistrée dans la servlet. L'accès aux données est par contre pris en charge par le framework XMLRAD et les requêtes SQL sont décrites dans des fichiers XML, facilitant là aussi le développement.
Nous allons voir dans cet article comment développer notre application web avec XMLRAD : création du projet, connexion à la base de données, génération des premiers écrans et l'implémentation de règles de gestion. La création d'une application, quel que soit votre environnement est décrite en détail dans l'article XMLRAD : premiers pas. Je vous invite à le parcourir avant de commencer celui-là.
Création du projet▲
Lancez XMLRAD, et cliquez sur Create a new project. Sélectionnez Simple project.
Nommez votre projet MyDelphiProject et sélectionnez l'IDE Delphi, la version (4, 5, 6, 7, 2005 ou 2006) et le serveur web (IIS, apache 1.3 ou 2.0).
Créez votre projet avec des XMLModules normalisés. Votre projet est alors généré sur disque dans le répertoire C:\Program Files\Delos\Projects\MyDelphiProject.
Dans le répertoire du projet, vous avez un répertoire Bin dans lequel se trouve toute l'application. Un répertoire Data sera automatiquement créé pour toutes les traces, logs d'erreur, profiles, etc.
Dans ce répertoire Bin se trouvent tous les fichiers de configuration XML :
- Config.xml : fichier principal de l'application. Importe les fichiers InitParams.xml, GlobalParams.xml, XMLModules.xml, DataSources.xml, Aliases.xml et Pools.xml ;
- InitParams.xml : fichier de paramétrage de l'application et du framework. Voir Appendix 14 : InitParams and GlobalParams description ;
- GlobalParams.xml : fichier de constantes de l'application et du framework. Voir Appendix 14 : InitParams and GlobalParams description ;
- XMLModules.xml : fichier de description des modules de l'application et du framework ;
- DataSources.xml : fichier de configuration de l'accès aux bases de données. Voir Appendix 3: Configuring DataSources ;
- Aliases.xml : fichier de configuration de l'alias de l'application utilisé dans les fichiers XSL ;
- Pools.xml : fichier de configuration des pools ;
- ApplicationMessages.xml : fichier contenant tous les messages d'applications traduits ;
- ByPass.xml : fichier de configuration des actions et des adresses IP qui ne sont pas soumises à la sécurité ;
- Config.Infos.xml : fichier stockant les informations du projet ;
- Cultures.xml : fichier de configuration des cultures (formats de dates, heures, nombres) ;
- dmdXMLAdm.XMLServices.xml : fichier de description des XMLServices du module dmdXMLAdm. Voir Appendix 9 : XMLCLX reserved keywords and reserved actions ;
- EventLog.xml : fichier de configuration des traces ;
- Generators.xml : fichier de configuration des générateurs d'identifiants ;
- Hooks.xml: fichier de configuration des hooks ;
- ProfileItems.xml : fichier de description des éléments de profiles ;
- Profiles.xml : fichier des profiles par défaut ;
- Security.xml : fichier de configuration de la sécurité intégrée ;
- XMLDesignWM.XMLServices.xml : fichier de description des XMLServices du module XMLDesignWM. Voir Appendix 9 : XMLCLX reserved keywords and reserved actions ;
- XMLMailWM.XMLServices.xml : fichier de description des XMLServices du module XMLMailWM. Voir Appendix 9 : XMLCLX reserved keywords and reserved actions ;
- XMLMessengerWM.XMLServices.xml : fichier de description des XMLServices du module XMLMessengerWM. Voir Appendix 9 : XMLCLX reserved keywords and reserved actions ;
- XMLProfileWM.XMLServices.xml : fichier de description des XMLServices du module XMLProfileWM. Voir Appendix 9 : XMLCLX reserved keywords and reserved actions ;
- XMLSecurityWM.XMLServices.xml : fichier de description des XMLServices du module XMLSecurityWM. voir Appendix 9 : XMLCLX reserved keywords and reserved actions ;
- XMLUtilsWM.XMLServices.xml : fichier de description des XMLServices du module XMLUtilsWM. voir Appendix 9 : XMLCLX reserved keywords and reserved actions.
On y trouve aussi les fichiers source.
Dans le sous-répertoire bin se trouve une dll : MyDelphiProject.dll qui est la dll de l'application proprement dite, contenant également le framework.
Le sous-répertoire XML contient tous les fichiers XML décrivant les actions (XMLServices) et les fichiers XSL.
Connexion à une base de données▲
Après avoir généré le projet sur disque, on tombe sur un assistant de connexion à une base de données.
Vous avez le choix entre six bases de données principales (Access, Interbase/Firebird, MySQL, Oracle PostgreSQL et SQLServer). Si vous utilisez une autre base de données ou si vous voulez configurer manuellement l'accès à votre base de données, choisissez Other. Pour plus d'informations sur la configuration manuelle, reportez-vous à l'Appendix 3 : Configuring DataSources. Nous allons ici nous connecter à une base MySQL qui est fournie avec le produit : Training.
Pour vous connecter à une base MySQL, XMLRAD fournit un driver d'accès natif à MySQL : rien de besoin de plus que la bibliothèque cliente libmysql.dll.
Le setup XMLRAD installe normalement la base Training pour MySQL dans le répertoire data du serveur de bases de données. La base devrait donc être directement disponible. Si ce n'est pas le cas, vous avez la base dans le répertoire C:\Program Files\Delos\Demos\Data\training.
Une fois que vous avez choisi MySQL, vous allez rentrer les informations d'authentification pour vous connecter au serveur.
Si les informations sont correctes, l'application essaye de s'y connecter et récupère la liste des bases installées sur le serveur.
Nous allons choisir la base training et valider. Si la connexion s'est bien passée, on tombe sur l'assistant de création de la première action. Sinon on se retrouve devant l'écran de configuration manuelle de l'accès aux données.
Création des écrans▲
Créons nos premiers écrans visuels. Il nous faut tout d'abord une liste des ORGANIZATIONS. Sélectionnez dans l'assistant de création des XMLServices Data Table qui permet de générer une liste de données d'une table.
Suivez les étapes de l'assistant pour générer la liste sur la table ORGANIZATION. Reportez-vous au tutoriel XMLRADš: premiers pas pour plus de détails.
De même maintenant, avec le formulaire de modification d'une ORGANIZATION. Sélectionnez Simple Form dans l'assistant.
Suivez à nouveau les étapes de l'assistant pour générer le formulaire sur la table ORGANIZATION. Assurez-vous que l'Update statement est généré automatiquement avec le formulaire sur le dernier écran de l'assistant. Reportez-vous au tutoriel XMLRAD : premiers pas pour plus de détails.
L'application est invoquée avec l'URL suivante : http://localhost/ProjectsBin/MyDelphiProject/Bin/MyDelphiProject.dll/Formorganization&ORG_ID=101. ProjectBin est un répertoire virtuel IIS créé automatiquement à l'install pointant vers le répertoire des projets. MyDelphiProject.dll est la dll ISAPI. Formorganization est le nom de l'action ou XMLService à exécuter.
Ajout de règles de gestion▲
Architecture des XMLServices▲
Chaque écran ou XMLService est composé d'un fichier XMLGram décrivant les actions à effectuer par l'intermédiaire d'instruction et d'un fichier XSL qui sera appliqué au document XML résultant de l'exécution du XMLGram.
L'écran de la liste des ORGANIZATIONS a le XMLGram suivant :
<xmlgram
name
=
"Listorganization"
>
<DBExtract
Name
=
"organization"
>
<DataSource>
Database</DataSource>
<Kind>
Multiple</Kind>
<MaxRows>
10</MaxRows>
<MultipleContainerName>
organizationS</MultipleContainerName>
<RecordName>
organization</RecordName>
<Fields/>
<Params/>
<Statement>
<![CDATA[
SELECT organization.ORG_ID,
organization.ORG_NAME
FROM organization organization
]]>
</Statement>
</DBExtract>
</xmlgram>
L'extraction y est décrite par l'instruction DBExtract : quelle DataSource utiliser, extraction multienregistrement, 10 enregistrements par page, requête SQL… Les enregistrements extraits seront ajoutés dans un document XML appelé OutputDoc (document de sortie) avant d'être traité par le XSL pour produire la page HTML.
Pour le formulaire, le XMLGram est similaire, mais avec l'extraction d'un seul enregistrement. Pour le XMLService UpdateORGANIZATION qui ne fait qu'une mise à jour vers la base de données, le XMLGram est différent :
<xmlgram
name
=
"Updateorganization"
>
<Match
Name
=
"Matchorganization"
>
<FillContext>
True</FillContext>
<Select>
organization</Select>
<DBBatch
Name
=
"organization"
>
<DataSource>
Database</DataSource>
<Params>
<Param>
<Name>
ORG_NAME</Name><Type>
VARCHAR</Type>
</Param>
<Param>
<Name>
ORG_ADDRESS1</Name><Type>
VARCHAR</Type>
</Param>
<Param>
<Name>
ORG_ADDRESS2</Name><Type>
VARCHAR</Type>
</Param>
<Param>
<Name>
ORG_STATE</Name><Type>
VARCHAR</Type>
</Param>
<Param>
<Name>
ORG_ZIP</Name><Type>
VARCHAR</Type>
</Param>
<Param>
<Name>
ORG_CITY</Name><Type>
VARCHAR</Type>
</Param>
<Param>
<Name>
COUNTRY_ID</Name><Type>
INTEGER</Type>
</Param>
<Param>
<Name>
ORG_PHONE</Name><Type>
VARCHAR</Type>
</Param>
<Param>
<Name>
ORG_FAX</Name><Type>
VARCHAR</Type>
</Param>
<Param>
<Name>
ORG_INFO</Name><Type>
INTEGER</Type>
</Param>
<Param>
<Name>
ORG_DATA</Name><Type>
INTEGER</Type>
</Param>
<Param>
<Name>
ORG_ID</Name><Type>
INTEGER</Type>
</Param>
</Params>
<Statement>
<![CDATA[
UPDATE organization organization
SET ORG_NAME = :ORG_NAME,
ORG_ADDRESS1 = :ORG_ADDRESS1,
ORG_ADDRESS2 = :ORG_ADDRESS2,
ORG_STATE = :ORG_STATE,
ORG_ZIP = :ORG_ZIP,
ORG_CITY = :ORG_CITY,
COUNTRY_ID = :COUNTRY_ID,
ORG_PHONE = :ORG_PHONE,
ORG_FAX = :ORG_FAX,
ORG_INFO = :ORG_INFO,
ORG_DATA = :ORG_DATA
WHERE organization.ORG_ID = :ORG_ID
]]>
</Statement>
</DBBatch>
</Match>
</xmlgram>
Là le XMLGram comprend une autre instruction : DBBatch qui permet d'envoyer des ordres de mises à jour (INSERT, UPDATE, DELETE). Les paramètres de la requête SQL y sont décrits avec leurs types. Ici pas besoin de XSL puisqu’aucun enregistrement n'est extrait. À l'issue de l'exécution de ce XMLService ce sera le XMLService FormORGANIZATION qui sera appelé pour afficher à nouveau le formulaire avec les nouvelles modifications.
Pour plus d'informations sur les instructions d'un XMLGram, reportez-vous à l'Appendix 13 : XMLGram reference
Où insérer une règle de gestion ?▲
Ce que nous voulons faire ici, c'est interdire une mise à jour d'une ORGANIZATION dont le nom n'a pas été indiqué. En d'autres termes si le champ ORG_NAME est à une chaine vide, il faut refuser la mise à jour.
Pour intervenir dans le processus d'un XMLService nous avons à disposition plusieurs événements.
- BeforeXMLService ;
- BeforeXMLGram ;
- AfterXMLGram ;
- BeforeXSL ;
- AfterXSL ;
- AfterXMLService.
Nous voulons intervenir avant que la mise à jour soit effectuée, c'est-à-dire avant que le XMLGram soit exécuté. Nous allons donc ici utiliser l'événement BeforeXMLGram.
Comment insérer une règle de gestion ?▲
Nous allons utiliser le XIP (XMLRAD IDE Protocol) qui permet de connecter Delphi à XMLRAD. Ainsi, XMLRAD peut piloter l'interface Delphi pour ouvrir un fichier, insérer du code et positionner le curseur au bon endroit. Lors de l'installation de XMLRAD, un paquet de composants est installé dans Delphi et un nouveau menu XMLRAD apparait.
Dans le menu XMLRAD, cliquez sur Options. Si XMLRAD est en local sur la même machine que Delphi, vous pouvez laisser par défaut localhost sans utilisateur ni mot de passe. Validez et cliquez sur Connect.
Une fois connecté, ouvrez le projet dans Delphi. Dans XMLRAD, allez au niveau du XMLService qui nous intéresse : UpdateORGANIZATION et cliquez sur l'item Events. Faites bouton de droite, new event handler, BeforeXMLGram
Delphi est mis en avant-plan avec le gestionnaire d'événements qui est automatiquement généré et le curseur positionné prêt à insérer du code.
Dans le gestionnaire d'événements, nous allons maintenant insérer notre règle de gestion. Le formulaire FormORGANIZATION a transmis avec un input type text le champ ORG_NAME. Il se trouve donc dans les paramètres HTTP POST. Les paramètres HTTP sont accessibles via l'objet Context. Il nous suffit donc de tester que la valeur du champ ORG_NAME dans le Context est à chaine vide. Si c'est le cas nous levons une exception.
Pour plus d'informations sur l'objet Context, lisez l'article Le Context ou comment transmettre des valeurs d'une page à l'autre.
procedure
TMyDelphiProjectBM.UpdateORGANIZATION_BeforeXMLGram(XMLGram: IXMLGram; InputDoc, OutputDoc: IXMLCursor; var
Skip: Boolean
)
begin
if
Context.GetValue('ORG_NAME'
) = ''
then
XMLRequest.RaiseError('Nom d''organisation vide'
, 'UpdateORGANIZATION_BeforeXMLGram'
);
end
;
Même s'il est possible d'utiliser les exceptions du langage, il est recommandé d'utiliser la méthode XMLRequest.RaiseError disponible dans tous les langages et plateformes supportés par XMLRAD. Pour plus d'informations sur les objets et méthodes, reportez-vous à l'Appendix 12 : Programmer's reference.
Vous pouvez maintenant compiler votre application et redémarrer votre serveur web avant d'exécuter l'application à partir de XMLRAD. Essayez de mettre à jour une organization avec un nom vide, vous devez obtenir un message d'erreur.
Conclusion▲
Nous avons vu dans cet article comment créer une application web Delphi avec un framework basée sur la technologie XML/XSL. En nous connectant à une base MySQL, nous avons généré des écrans permettant de lister et de modifier des enregistrements. Nous avons aussi implémenté une règle de gestion en Delphi.
XMLRAD supporte aussi d'autres langages comme PHP, C#, J2EE, JScript et d'autres plateformes comme J2EE et Linux.
Liens▲
- le site de XMLRAD
- XMLRADB : premiers pas
- Le Context ou comment transmettre des valeurs d'une page à l'autre
- Comment se connecter à une base de données avec JDBC
- Appendix 3 : Configuring DataSources
- Appendix 7 : Debugging web application
- Appendix 9 : XMLCLX reserved keywords and reserved actions
- Appendix 12 : Programmer's reference
- Appendix 13 : XMLGram reference
- Appendix 14 : InitParams and GlobalParams description