Introduction▲
Quoi, encore un nouveau composant de développement Web dans Delphi 7 ?▲
Après ISAPI/CGI, WebSnap, les WebServices, voici que Borland nous propose IntraWeb dans Delphi 7. Les questions que certains peuvent se poser :
- - à force de rajouter des outils de développement Web, Borland déroute ?
- - tous ces outils doivent créer sans doute une redondance ?
- - on passera plus de temps à choisir un outil plutôt que de commencer à programmer immédiatement avec un seul ?
À qui et à quoi est destiné Intraweb ?▲
Les réponses à ces questions : Intraweb n'est pas un outil comme les autres. Il ne remplace pas les autres méthodes. Borland nous offre certes une manière de plus de développer des applis Web, mais a surtout voulu rendre accessible, par une approche bien plus intuitive, le développement Web aux programmeurs Delphi habitués à développer des applications RAD standard.
Apprendre ISAPI, WebSnap ou SOAP, c'est acquérir une technique supplémentaire, une méthodologie différente, qui demande un investissement considérable en apprentissage, tâtonnements, mises au point, etc. Avec IntraWeb, c'est immédiat : vous développez comme pour une application normale à partir d'une forme ou vous déposez des composants. Et ça ne vous demandera pas plus de temps de créer une page Intraweb destinée à être posée sur un serveur Web qu'une forme Delphi standard. Vous posez sur cette nouvelle forme style Delphi les boutons, dialogues, combobox standards, etc., vous codez les événements, assignez les propriétés, compilez… ET ÇA ROULE… Le débogage ? Vous déboguez votre application là aussi comme une application normale.
L'accès à une base de données ? Plus simple tu meurs : un composant Database (ou création en runtime évidemment), un DBGrid, un DBNavigator, un datasource et pof… l'appli est prête à être portée sur le Web avec navigation, insertion, suppression, modification immédiate. Génial non? :-)
Vous pouvez en plus, bien évidemment, comme tout composant Delphi, créer vos propres composants Intraweb dérivés des composants de base.
Intraweb rend caduques les autres techniques ?▲
La réponse est claire : c'est non ?
WebSnap, pour des applications relativement simples, avait déjà considérablement accéléré le processus de développement RAD par rapport à ISAPI ou il fallait mettre la mimine dans le cambouis. Je devrais dire « il faut toujours », car WebBroker (ISAPI), loin d'être mort et enterré, reste, dans la majorité des cas, un outil extrêmement souple et efficace.
Quant à WebSnap, il est d'une telle richesse, voire complexité parfois, que l'on ne peut simplement le ramener à un outil de développement RAD. Intraweb déjà plus, car plus immédiat. Pas besoin de connaître le HTML, les actions d'une ISAPI, les paramètres, le Jscript, les Adapter…X, etc. Toutes ces techniques qui déroutent quelque peu le débutant. Mais malgré tout, si vous désirez aller plus loin, Intraweb vous le permet : il s'intègre parfaitement à une appli WebSnap ou WebBroker. Vous travaillez soit en Application mode, développement RAD, soit en Page mode ou les apprentis sorciers de l'ISAPI (WebBroker) traditionnel se retrouveront parfaitement.
Intraweb gère enfin automatiquement la persistance et l'unicité d'une session lors d'une connexion client avec réglage du timeout. À chaque création de module Intraweb, une session avec ou sans paramètres utilisateur est créée. En mémoire ou par cookies. Et gère également les templates. Et pour terminer, pour déployer vos applications, vous n'avez besoin d'aucun serveur Web. Tout est dans Intraweb, prêt à l'emploi. Ou alors, vous utilisez IIS ou Apache. Que demander de plus ?
Enjoy…
I. Créer l'application▲
Nous allons nous amuser à faire une application légère de gestion de Delphinautes. La base de données est une base Firebird 6 qui est en ligne sur mon serveur Ngscan. Vous pourrez à tout moment tester les étapes en ligne.
Créons une application Intraweb (ci-après IW), en utilisant le module Standalone application with Datamodule (j'ai D7 en anglais). Vous voyez immédiatement qu'Intraweb vous permet de créer des exécutables « standalone », des DSO pour serveurs Apache et des ISAPI's pour IIS.
Delphi nous demande le répertoire dans lequel nous allons mettre notre projet. Créez un répertoire nommé IWDnautes. Sauvez votre projet sous IWDnautes.dpr.
Dans le datamodule, nous allons ajouter les compos IB (référez-vous aux divers didacticiels sur www.developpez.com ou à l'aide d'IB pour configurer les divers composants). Voilà le résultat :
Notre base est maintenant prête à être utilisée par notre application.
II. Créer notre première forme▲
Peuplez votre forme des différents composants Intraweb pour aboutir à l'exemple iwtest. (TIWDBGrid, TIWDBEdit, TIWDBImage, TIWDBMemo). Ajoutez également un composant TIWMenu que nous connecterons plus tard. Nous affinerons également l'affichage un peu plus loin.
Reliez les composants DB au datasource du datamodule. Ouvrez votre base et votre query dans l'événement OnCreate du Datamodule et… lancez l'application. Ce run va lancer le serveur web Intraweb intégré. Vous n'avez pas besoin d'avoir d'autre serveur Web que celui-ci pour développer vos applications avec Intraweb.
Vous sélectionnez le browser que vous désirez (celui par défaut ou Internet Explorer), et lancez l'application par F9. (À noter qu'Intraweb ne fonctionne pas avec Netscape 4.x) ET C'EST TOUT… :-)
Évidemment, vous n'obtenez pas tout de suite la disposition telle que dans l'exemple, mais votre grille et vos dialogues de données doivent afficher les valeurs de votre base.
III. Affiner la grille▲
Nous allons nous attacher maintenant à créer une grille cliquable, qui nous permettra de nous positionner directement sur un enregistrement. Pour ce faire, nous allons définir les colonnes de notre grille. Cliquez sur la propriété Columns du IWDBGrid et ajoutez les champs de votre requête que vous désirez afficher :
Afin que l'utilisateur puisse cliquer sur une colonne, c'est ici que vous choisissez laquelle. Dans notre exemple, nous choisissons de cliquer sur la clé primaire de notre base (ID). Sélectionnez donc dans l'éditieur de colonne le champ ID, et dans ces propriétés, il suffit de mettre sous « linkfield », le nom de la colonne que vous voulez être cliquable.
Afin qu'une action réponde au clic sur le lien, il suffit, dans l'événement OnClick de cette colonne ID de mettre un code du style :
If
not
DataModule1.IbQuery.Locate('id'
,StrToInt(AValue),[]) then
Webapplication.ShowMessage('N''existe pas'
);
Vous pouvez également, dans les propriétés de la grille, choisir diverses options intéressantes, par exemple RollOver, RollOverColor, RowAlternateColor qui vous permettent d'alterner la couleur pour chaque ligne, de définir une couleur lorsque la souris passe sur le champ, etc., et donneront à vos applications un caractère pro sans une seule ligne de Jscript. Vous pouvez également définir quelle est la couleur de la cellule de l'enregistrement sélectionné.
Autre élément important des propriétés, le FromStart. En le mettant à false, la grille affichera uniquement les enregistrements suivant celui qui a été sélectionné. À true, tous les enregistrements depuis le premier sont affichés.
La propriété UseFrame vous permet de choisir soit un affichage dans une grille avec scrolling, soit alors simplement un affichage de style tableau HTML simple.
IV. Charger et sauver une image, créer un menu, afficher une nouvelle fenêtre▲
Pour le chargement d'une image, il est difficile de faire plus simple. Le composant TIWDBFile affichera automatiquement la boîte de dialogue « parcourir » afin de peupler le champ BLOB de votre base. Il faut simplement noter que le format GIF, pour les raisons légales que l'on connaît, n'est pas pris en charge par Intraweb. Vous pouvez par contre très bien utiliser des composants GIF pour Delphi, qu'Intraweb utilisera ensuite pour la conversion.
Concernant le menu, c'est tout aussi simple. En plus du TIWMenu, vous ajoutez un composant TMenu Delphi standard et vous l'assignez à la propriété AttachedMenu du TIWMenu. C'est tout. Et c'est par le composant TMenu standard que vous définissez les valeurs et les actions de votre menu.
Voici à quoi devrait ressembler votre forme principale :
Pour montrer à quel point le codage est identique à une appli normale, voici le code OnClick du bouton de tri :
procedure
TformMain.IWButton1Click(Sender: TObject);
begin
With
DataModule1.IbQuery do
Begin
Close;
Case
rTri.ItemIndex of
0
: SQL.Text:='Select * from NAME order by NOM, PRENOM'
;
1
: SQL.Text:='Select * from Name order by ID'
;
end
;
Open;
end
;
end
;
Vous voulez une nouvelle page ? Vous choisissez, dans fichier->nouveau->autre->Intraweb de D7, une applicationForm que vous créez comme une forme normale (je l'ai appelée TfWindow2), et dans l'événement OnClick de votre TMenuItem vous mettez tout simplement :
TfWindow2.Create(WebApplication).Show;
Pour retourner à la page principale, vous ajoutez dans la nouvelle fenêtre un bouton libellé « fermer » par exemple, ou vous codez le OnClick par :
Release;
Je me répète : plus simple, tu meurs…
À noter qu'Intraweb, pour des raisons évidentes de rafraîchissement et pertinence des données, annihile les actions « back » et « forward » du navigateur. Seules des actions définies dans les pages permettent la navigation.
V. Déploiement de l'application▲
Sous la forme d'exécutable, Intraweb, ne nécessite aucun serveur Web. Il suffit de lancer l'exécutable dans le répertoire de votre choix (ou de le lancer en tant que service) et de l'appeler ensuite par http://127.0.0.1:4002/, soit le n° IP local de votre machine (ou IP fixe si vous en avez un), et le n° de port que vous avez attribué à votre application. Ce numéro de port est défini dans la propriété port de TIWServerController+. C'est tout.
Pour un déploiement sur IIS ou Apache, la transformation de votre exécutable en ISAPI ou DSO est obligatoire. Mais là aussi , c'est extrêmement simple. Il suffit en fait de changer le source de votre projet. Les unités restent absolument les mêmes. Voici d'abord le fichier source de l'exécutable que j'ai appelé DNautes.
program
DNautes;
{PUBDIST}
uses
IWInitStandAlone,
ServerController in
'ServerController.pas'
{IWServerController: TDataModule}
,
IWUnit1 in
'IWUnit1.pas'
{formMain: TIWForm1}
,
DatamoduleUnit in
'DatamoduleUnit.pas'
{DataModule1: TDataModule}
,
uWin2 in
'uWin2.pas'
{fWindow2: TIWPageForm}
;
{$R *.res}
begin
IWRun(TFormMain, TIWServerController);
end
.
Et voici à quoi doit ressembler le code source de l'ISAPI:
library
iwtest;
uses
IWInitISAPI,
ServerController in
'ServerController.pas'
{IWServerController: TDataModule}
,
IWUnit1 in
'IWUnit1.pas'
{formMain: TIWForm1}
,
DatamoduleUnit in
'DatamoduleUnit.pas'
{DataModule1: TDataModule}
,
uWin2 in
'uWin2.pas'
{fWindow2: TIWPageForm}
;
{$R *.res}
begin
IWRun(TFormMain, TIWServerController);
end
.
Vous créez ainsi tout simplement deux DPR, un pour l'exécutable, l'autre pour l'ISAPI. Vous évitez ainsi, tous les problèmes assez épineux soulevés par le débogage d'ISAPI.
VI. Les sessions▲
Pour comprendre le mécanisme des sessions, il nous faut prendre le code de l'unité ServerController. Nous y trouvons la classe :
TUserSession = class
(TComponent)
public
DataModule1: TDataModule1;
TimeOut:Integer
;
UserName:String
;
constructor
Create(AOwner: TComponent); override
;
end
;
Cet objet est créé à chaque nouvel appel à votre module. Vous constatez que le Datamodule fait partie de cet objet. C'est lui qui nous garantit l'unicité d'une session. Tout comme dans les ISAPI, vous devez donc absolument éviter de déclarer des variables globales. C'est dans cette classe que vous ajoutez toutes les variables que vous voulez assigner à un user précis (nom, prénom, adresses, etc.). Vous pouvez ainsi très facilement ajouter des objets caddies par exemple dans un TStringList. Toutes ces variables sont stockées dans .data de TIWApplication. Le développement d'un module de e-commerce par exemple devient d'une facilité déconcertante
procedure
TIWServerController.IWServerControllerBaseNewSession(ASession: TIWApplication; var
VMainForm: TIWAppForm);
begin
ASession.Data := TUserSession.Create(ASession);
end
;
Vous y accédez par : UserSession.NomDeVariable (ex. : UserSession.UserName). Intraweb gère ceci par la fonction UserSession :
function
UserSession: TUserSession;
begin
Result := TUserSession(RWebApplication.Data);
end
;
Pour un Login automatique, vous utilisez la propriété AuthList de IWServerController. Authlist est un StringList. Vous devez y insérer les noms et mot de passe des utilisateurs acceptés sous la forme username=password. Vous pouvez ainsi, par un AuthList.LoadFromFile('myusers.txt') charger la liste à partir d'un fichier externe à l'appli où vous ajoutez ou supprimez les users. Dès qu'une valeur est ajoutée à AuthList, la procédure de login est lancée automatiquement, à savoir qu'un dialogue demandera le username et password lors du lancement de l'appli. Quite easy :-)
Intraweb gère également le Timeout d'une session. Vous réglez cette valeur dans la propriété SessionTimeOut de TIWServerController. La valeur par défaut est de dix minutes.
Enjoy… hope it helps :-)))
VII. Liens▲
Le source du projet Définautes
Les fichiers d'aide originaux (en anglais)
Vous cherchez un hébergeur pour vos applis IntraWeb ? Tout est là, et ce n’est pas cher :-))))
Mon moteur de recherche Ngscan: http://www.ngscan.com
Newsgroup nzn sur Internet : news://news.vienneinfo.org/nzn.fr.delphi.Internet