Une Introduction à WebObjects
On décrit souvent WebObjects comme un serveur d’applications ; cependant, il est beaucoup plus que cela. WebObjects est constitué d’un ensemble de frameworks qui vous permettent d’écrire des applications serveur distribuées, indépendantes de la plate-forme, ainsi que d’un ensemble d’outils vous permettant de les écrire. Les outils inclus sont WebObjects Builder, EOModeler, un éditeur de règles de gestion et un assistant de WebServices. Vous utiliserez également Project Builder et parfois Interface Builder.
Les applications doivent être écrites en Java, mais peuvent être distribuées sous différentes formes y compris HTML, client Java ou même Services Web. Comme WebObject s’appuie sur Java, vous pouvez également utiliser d’autres outils pour créer vos applications WO, tel que Eclipse, un éditeur Java open source soutenu par IBM. Mais je vais me concentrer sur les outils Apple pour la création et la distribution d’applications HTML.
Pourquoi Utiliser WO ?
WebObjects vous permet de créer une large variété d’applications. Il s’agit d’une suite de frameworks et d’outils qui ont fait leurs preuves et qu’Apple a récupérés lors de l’acquisition de NeXT.
WebObjects était le joyau de la couronne de NeXT. Des sociétés comme Disney, Deutch Bank et AAA utilisent (ou ont utilisé) WebObjects pour créer des applications Web dernier cri (hé ! même Dell l’a utilisé). Même aujourd’hui, WebObjects est utilisé pour créer de nouvelles applications, comme le Music Store d’Apple.
Pour 700 dollars, vous avez la suite WebObjects au complet. Celle-ci inclut une licence développeurs et une licence de déploiement ainsi que quelques manuels. Vous pourrez déployer sur n’importe quel serveur d’application J2EE ou tout système ayant J2SE (version 1.3.1 ou supérieure). Cependant, Apple ne supporte que le déploiement sur Mac OS X Server, Windows 2000 ou Solaris 8. Comme vous allez le découvrir, WebObjects réprésente une solution incroyable pour ce prix (La licence de déploiement coutait environ 50 000 dollars il y a encore trois ans !).
Que sont les EnterpriseObjects ?
Si vous avez déjà lu des articles concernant WO, vous avez dû voir les termes EnterpriseObjects (EOs), EOF et EOModel. Je suis sûr que vous vous demandez “Qu’est-ce-que c’est que ce EO machin ?”. A mon avis, EO est ce qui a été inventé de mieux depuis le fil à couper le beurre. Mais puisque mes lecteurs ont une culture technologique avancée, je me dois d’entrer plus loin dans les détails. De plus il serait mal venu de ne pas parler de EOF alors que je parle de WO (il s’agit même d’un crime dans certaines parties du monde).
Enterprise Objects Framework (EOF) permet de gérer la persistance des objets. Le plus souvent, cette persistance s’appuie sur une base de données. EOF est merveilleusement indépendant des bases de données, c’est pourquoi il importe peu si vous démarrer un projet avec MySQL, puis plus tard, si vous gagnez au loto, passez sur Oracle. Bien sûr, un autre scénario plus probable est que votre société utilise MySQL pour le développement et utilise Oracle pour le déploiement. Dans tous les cas, une simple modification au niveau de JDBC et votre application a été migrée de MySQL vers Oracle.
Pourquoi Utiliser EOs
EOF vous permet de stocker et récupérer l’information dans une base de données de manière objet. EOF offre une couche de persistance pour conserver les informations sur une période indéfinie, même si vous éteignez votre serveur. Il existe peu de produits comparables à EOF sur le marché, et ils se classent dans la catégorie des mappeurs objet-relationnel.
Travaillons un peu : Création d’une Simple Page de Login
Pour pouvoir créer la prochaine Merveille du Monde, vous devrez maîtriser WebObjects. La première étape est de récupérer une copie de WO. Si vous êtes un membre de Apple Developer Connection, vous devriez pouvoir télécharger une version démo. Si vous n’êtes pas membre, vous pouvez soit vous inscrire à ADC ou acheter une copie de WO. Par la suite, je vais vous décrire les étapes pour créer cette simple page de login
En remarque, je voudrais préciser que j’ai utilisé WO/EOF depuis la fin 1999 et que je découvre encore de nouvelles fonctionnalités. L’ensemble des frameworks est riche et dense, alors ne soyez pas surpris de découvrir de nouvelles fonctionnalités après plusieurs années d’utilisation du produit. En tant que développeur, j’adore ça.
Une Fenêtre de Login avec WebObjects
Créer un Nouveau Projet
Lancez Project Builder et créez un nouveau projet. Vous remarquerez que WO vous propose des modèles pour neuf types de projets différents. Sélectionnez le modèle WebObjects Application

Vous aurez besoin de donner un nom à votre projet puis passer par une série d’options de configuration. Pour l’instant, vous pouvez cliquer sur le bouton Next chaque fois, sans vous préoccuper des options.
Dans votre projet, vous trouverez un groupe appelé Web Components. Quand vous ouvrez ce groupe, vous trouvez un autre groupe appelé Main. Dans ce Main, vous trouverez :
- Main.wo : la Vue présentée au client ; ne vous en inquiétez pas pour le moment.
- Main.java : le code source du composant.
- Main.api : un fichier de configuration. Ne vous en inquiétez pas pour le moment.

Utiliser WebObjects Builder
En double cliquant sur Main.wo, l’application WebObjects Builder (WOB) est lancée. WOB, vous permet de définir votre page web. Il vous permettra également de générer le code Java associé à cette page, qui sera placé dans le fichier Main.java de votre projet.
Bien, maintenant, nous avons une page vierge. Passons à la suite.
Ajoutez un tableau, pour donner un aspect plus fini à votre zone de login. Le bouton tableau
se trouve sur le coté droit dans la barre outils ; il ressemble une vieille fenêtre. Configurez votre tableau de façon à avoir trois lignes et deux colonnes.
Comme il s’agit d’une page de login, vous pouvez fusionner les cellules de la ligne du haut et taper “Veuillez vous authentifier…” pour indiquer à l’utilisateur qu’il s’agit d’une zone de login. Vous devez permettre à l’utilisateur d’entrer son authentifiant (username) et son mot de passe (password). Pour fusionner les cellules, sélectionnez les deux cellules en cliquant-glissant sur celles-ci…

…et cliquez sur le bouton Fusion des Cellules (Merge Cells), situé dans le panneau d’Inspection. Il ressemble à un X. Si votre panneau d’Inspection n’est pas visible, cliquez sur le bouton
dans la barre outils.

Une fois que les cellules ont été fusionnées, vous devez mettre en forme votre table pour indiquez à l’utilisateur où entrer son authentifiant et son mot de passe. Vous devrez également ajouter des champs WOTextFields dans ce tableau.

Sans quelques variables, votre page est inutile. Vous devez donc les ajouter. Sur le coté inférieur gauche de votre Main, vous verrez deux objets, application et session, apparaissant dans le navigateur d’objets. Si vous control-cliquez (ou cliquez avec le bouton droit), dans cette zone, un menu d’options apparaitra. Les deux éléments importants sont “Add Key to…” (Ajouter la clé / variable) et “Add Action to…” (Ajouter l’action / méthode).
Sélectionnez “Add Key to Main” et nommez la variable username. Sélectionnez String pour le Type et cochez les options pour que WOB génère le code pour vous (cf image ci-dessous). Les puristes Java peuvent choisir l’option qui force à préfixer les méthodes d’accès par get.

Faites de même pour password.
Maintenant que nous avons quelques variables, vous pouvez les lier à votre Vue, simplement en cliquant-glissant depuis le nom de la variable du composant à lier. Liez votre variable à l’attribut valeur du WOTextField. Faites ceci pour username et password.

Changez également le WOTextField pour le password en Password Field. Vous pouvez faire ceci en sélectionnant le WOTextField et modifiant le panneau d’Inspection pour afficher l’inspecteur Statique.

Ceci permettra de cacher le mot de passe tapé par l’utilisateur.
NOTE : En utilisant le PasswordField, les données ne sont pas pour autant encryptées. Le tag HTML textfield est simplement remplacé par le tag HTML password. Et donc, à moins que la connexion entre le client et le serveur soit encryptée, le texte du champ sera envoyé en clair sur le réseau.
Les trois dernières étapes dans la création de la page sont d’ajouter un bouton Submit, ajouter une action Submit et placer le tableau à l’intérieur d’une WOForm.
- Pour ajouter le bouton Submit, cliquez sur le bouton WOSubmit
dans la barre outils. - Pour ajouter une action Submit, control-cliquez (ou cliquez sur le bouton droit) dans le navigateur d’objets et sélectionnez l’option “Add Action to Main”. Nommez l’action submit et sélectionnez null pour la page retournée.

Liez l’action submit au bouton Submit. Pour cela, comme précédemment, cliquez-glissez depuis l’action submit jusqu’au bouton Submit. Liez l’attribut action.

- Enfin, vous devez “envelopper” le panneau de login et le bouton Submit dans une WOForm. Le bouton WOForm se trouve à gauche du bouton WOTextField. Sélectionnez la section de la page que vous souhaitez “envelopper” (le tableau et le bouton Submit) et cliquez sur le bouton WOForm. Si vous n’utilisez pas de WOForm, le bouton Sumbit ne fonctionnera pas correctement.
Je suis certain que certains d’entre vous se demandent, “Où se trouve le EOF machin ?”. Patience, nous y arrivons, mais vous devez savoir marcher avant d’essayer de courir. Maintenant, retournez à Project Builder pour entrer du code.
Utiliser Project Builder
Dans votre fichier Main.java, nous allons ajouter du code. Tout d’abord, vous aurez besoin de pouvoir stocker l’authentifiant et le mot de passe de vos utilisateurs. Pour cet exemple, vous utiliserez NSMutableDictionary.
protected NSMutableDictionary userDictionary;
Vous aurez également besoin d’initialiser ce dictionnaire. Ici, nous l’initialisons avec quelques variables, dans le constructeur.
public Main(WOContext context)
{
super(context);
String users[] = new String[] {"Andy","Beth"};
String passwords[] = new String[] {"alpha", "beta"};
userDictionary = new NSMutableDictionary(passwords, users);
}
NSMutableDictionary est un objet qui vous permet de stocker et retrouver des “valeurs” en utilisant des “clés”, d’après le modèle Clé-Valeur.
Vous y êtes presque, mais vous devez encore mettre une action sur le bouton Submit (qui est lié à notre méthode submit). Dans votre fichier Main.java, rendez vous à la méthode submit que WOB a créé pour vous. Quand l’utilisateur clique sur le bouton Submit, vous effectuerez un rapide recherche dans userDictionary pour vérifier si l’information est correcte.
public WOComponent submit()
{
String s;
s = (String) userDictionary.valueForKey(username);
if (s != null && s.equals(password))
{
System.out.println("correct");
}
else
{
System.out.println("incorrect");
}
return null;
}
Quand l’utilisateur clique sur le bouton, WO agira comme par magie pour appeler la méthode submit. Il va également “envoyer” les valeurs que l’utilisateur à entré aux variables username et password. C’est ainsi que vous pourrez comparer les valeurs tapées aux valeurs de votre userDictionary.
Problème : ajoutez une variable à votre page Main, liez le à un WOString
, et fournir un retour à l’utilisateur au lieu de l’afficher sur la console.
Comme vous le découvrirez rapidement, conserver, en dur dans le code, les informations utilisateurs dans un NSMutableDictionary n’est pas très utile. Si vous considérez que l’objet userDictionary est seulement valide durant la vie du programme, vous ne pouvez même pas conserver les changements d’un mot de passe utilisateur. A la seconde où vous stoppez votre application, les modifications sont perdues. Vous pourriez déplacer le code dans le projet en créant des composants de stockage spécifiques, dans l’objet Session ou même Application, mais c’est un peu comme mettre des boucles d’oreilles à un cochon.
Exemple Simple de “Fenêtre Login” Utilisant WO/EOF
Créer un EOModel pour un Utilisateur
Ouvrez EOModeler et créez un nouveau Modèle. il vous sera demandé si vous souhaitez créer une connexion par JDBC, JNDI ou aucune. Sélectionnez l’option JDBC et entrez les informations relatives à votre base de données. J’ai choisi d’utiliser OpenBase, mais vous êtes libre d’utiliser toute autre base de données ayant des pilotes JDBC disponibles.

Une des plus belles fonctionnalités de EOModeler est qu’il est indépendant des base de données utilisées. EOF générera les requêtes SQL pour vous, ce qui vous permettra de passer d’une base de données à l’autre sans trop d’effort. Cette atout vous permet de vous concentrer sur la logique métier de votre application et pas sur les appels à la base de données.
J’ai eu récemment une expérience personnelle avec cette fonctionnalité en migrant un site fonctionnant avec MySQL vers OpenBase. J’ai pu effectuer le portage en 15 minutes. Cela a pris un peu plus de temps que ce que j’avais prévu, parce que je faisais appel à deux appels SQL spécifiques à MySQL utilisant la fonctionnalité de recherche IN BOOLEAN MODE.
Allez, assez de petites histoires, revenons au travail. Créez une nouvelle Entité
et nommez la User. Une Entité est comparable à une Table de base de données, excepté le fait que l’Entité deviendra un Objet ; un EOEnterpriseObject pour être plus précis.
Une fois que vous avez créé votre Entité, vous devrez fournir des informations à EOModeler pour créer le mapping objet-relationnel. Assurez vous que le panneau d’Inspection est ouvert. Vous aurez besoin de fournir un nom de Table que vous souhaiterez mettre en relation avec l’Entité. Ne vous souciez pas du nom de classe (Class Name), EOGenericRecord est suffisant pour le moment. Les puristes en base de données sont libres de nommer leur Tables en majuscule.

Ajoutez quelques Attributs
à votre Entité. En ajoutant les Attributs, vous devriez les lier aux colonnes de votre base de données. Ajoutez (les types externes / “External Types” dépendent de votre base de données) :
- username Value Class - String / External Type - varchar
- password Value Class - String / External Type - varchar
- pk Value Class - Number / External Type - integer
Vous utiliserez l’Attribut pk comme votre clé primaire. EOF s’occupera de sa génération à votre place ; cependant, vous devez lui indiquer qu’il fera office de clé primaire. Pour cela, cliquez sur la colonne avec le symbole de clé
.

Après avoir modelé les Entités, vérifiez que le type externe (le type selon lequel la base de données stocke l’information) et le type interne (le type utilisé par l’objet EO) pour chaque Attribut sont compatibles. Cela peu paraitre fastidieux, spécialement si vous construisez de larges modèles, mais l’attention que vous portez aux détails ici paiera plus tard. Une fois que vous êtes satisfait avec votre Modèle, vous pouvez demander à EOModeler de créer la base de données pour vous. Cliquez simplement sur le bouton SQL
puis sur Execute SQL. Si tout se passe bien, votre base de données sera créée.
Je dois également mentionner que EOModeler peut faire du reverse-engineering, créer un modèle à partir d’une base de données existante. WO possède une belle technologie appelée Direct To Web (D2W) qui peut vous créer un accès web à une base de données en quelques minutes. Au premier coup d’oeil, D2W peut ressembler à un jouer, mais faites moi confiance, ce n’en est pas un.
Stocker les Variables dans la Base de Données
Pour pouvoir allez plus loin dans cet article, vous avez besoin d’ajouter des informations dans la base de données. Il existe différentes façons de le faire, mais puisqu’il s’agit d’un article WO/EOF, je me suis dis que je pourrais faire un petit détour.
Dans Project Buider, créer un nouveau fichier. L’assistant apparait. Sélectionnez l’élément “Display Group Component” situé dans la section WebObjects. Nommez votre nouveau composant UserGroup. Après avoir nommé votre composant, il vous sera proposé de choisir une Entité, ce qui devrait être simple puisque vous n’en avez qu’une seule.
L’assistant vous posera ensuite un certain nombre de questions. A la question “Choose a Layout”, sélectionnez “Selected Record” et “Matching Records” pour la configuration.

Ce que vous êtes en train de faire ici, c’est de créer une simple page pour Rechercher, Editer, Créer et Supprimer des informations stockées dans la table User de votre base de données. L’assistant vous posera d’autres questions. Une fois que vous avez terminé, cliquez sur Finished.
Vous pouvez effectuer cette partie de l’article plusieurs fois, chaque fois en choisissant différentes options. Cela devrait se révéler très enrichissant.
Maintenant vous allez ajouter un hyperlien sur la page Main et le liez à la nouvelle page UserGroup. Ceci vous permettra d’ajouter de nouveau utilisateurs à la base de données. Bien évidemment, seul l’administrateur du site doit pouvoir accéder à cette page étant donné qu’il n’y a pas de limite dans son utilisation.
Quand vous avez créez la page UserGroup, un WODisplayGroup a été créé et configuré pour vous. WebObjects fourni une classe WODisplayGroup, qui est utilisé dans la page UserGroup. Vous utiliserez WODisplayGroup pour votre page Main également.
Il existe trois façons d’obtenir un WODisplayGroup dans une page existante. Vous pouvez l’ajouter en :
- Ecrivant le code directement dans le fichier .java
- Ajoutant une “Key” (attribut) dans WOBuilder.
- Glissant l’Entité de EOModeler vers WOBuilder.
J’utilise régulièrement les méthodes (2) et (3). Pour cet article, vous utiliserez l’option (3) vu que c’est la plus fun.
Depuis la fenêtre EOModel, cliquez et glissez votre Entité User vers la fenêtre WOBuilder de votre page Main. Il vous sera demandé d’ “Ajouter & Configurer” / “Add & Configure” le nouveau DisplayGroup en cours de création. La configuration par défaut est suffisante.

Vous pouvez maintenant lier les WOTextFields username et password de votre panneau Login au userDisplayGroup. Pour le username, vous devez traverser toute la hiérarchie dans le navigateur d’objets : userDisplayGroup>queryMatch>username. Vous ferez de même pour password.

Ensuite, vous devriez lier le bouton Submit. Connectez le à la méthode userDisplayGroup>qualifyDataSource. Quand un utilisateur clique sur Submit, le WODisplayGroup utilisera l’authentifiant/mot de passe pour essayer de le retrouver dans la base de données.
Ensuite, ajoutez un WOHyperlink
. Nommez le “Créer” et liez le à la page UserGroup. Vous pouvez effectuer ceci en utilisant le menu pop-up à droite de la clé pageName dans le panneau d’Inspection.

Dans la page Main.wo, ajoutez deux éléments WOConditional
. Vous remarquerez qu’ils ont un signe plus. Cliquez sur l’un des signes plus, il se changera en signe moins. A l’intérieur du WOConditional ayant un plus, tapez “Veuillez vous connecter…” Dans l’autre, celui avec le signe moins, tapez “Merci, ” puis ajoutez un WOString
. Liez le WOString à userDisplayGroup>selectedObject>username. Votre panneau de login au complet devrait ressembler à ceci :

Maintenant que vous avez bien profité de la générosité d’Apple, vous pouvez considérablement réduire le code. Votre fichier Main.java au complet devrait ressembler à ça :
import com.webobjects.foundation.*;
import com.webobjects.appserver.*;
import com.webobjects.eocontrol.*;
import com.webobjects.eoaccess.*;
public class Main extends WOComponent
{
public WODisplayGroup userDisplayGroup;
public Main(WOContext context)
{
super(context);
}
}
Poursuivez en compilant et exécutant (”Build and Run”) votre application. Au départ, vous n’aurez aucune donnée dans votre base. Pour ajouter quelques données, utilisez le lien “Créer”. La page UserGroup vous permettra de créer un nouvel utilisateur et sauvegarder les informations.
Comme vous êtes connectés à une base de données, les informations sont persistantes. Essayer de stopper et relancer votre application. Utilisez maintenant le panneau login. Les informations entrées pour les utilisateurs devraient être les mêmes que quand vous avez arrêté l’application.
Apple fournit des exemples de code avec WebObjects pour créer une panneau de login, en utilisant le protocole d’authentification basique. A vous de voir si ce protocole est suffisant pour votre projet.
Conclusion
Comme je l’ai dit précédemment, l’Apple Store Music est une application WebObjects. Quand vous y accédez, vous remarquerez que vous pouvez voir les titres achetés par d’autres personnes, que ce soit au niveau de la liste du Top 10 ou “…other people bought” suggestion (ce que d’autres ont acheté). Bien évidemment, vous pouvez aussi effectuer une simple recherche. Il est évident qu’Apple ne devine pas cette information, donc vous pouvez en conclure que l’information est conservée dans une base de données. La suite de frameworks WebObjects rend tout cela possible.

Textes originaux en anglais sur O’Reilly : An introduction to WebObjects par Josh Paul
Chargement
Commentaires récents