Exercice d'approfondissement du module Base de Données

Mael Nagat, mastère IDL

Le sujet du micro projet

Le sujet de l'exercice d'approfondissement du cours de Base de Données qui m'a été attribué était la réalisation d'une CGI en Java et JDBC pour offrir un service de préparation de livraison de vin qui permet à un producteur de savoir quelles quantités desquels de ses vins récoltés il doit livrer.

L'analyse et la conception

Plutôt que d'écrire une CGI classique en java pour réaliser la passerelle entre le serveur HTTP et la base de données Oracle, j'ai choisi de m'intéresser à l'API des servlets JAVA. J'ai ainsi implémenté deux servlets : ConnectionAuthenticationServlet.java et RequestServlet.java. La première est chargée de se connecter à la base de données et d'authentifier le producteur de vins. La seconde émet des requêtes SQL pour obtenir les récoltes de ce producteur et les ventes réalisées sur ces récoltes.

Pour interroger la base de données, les servlets utilise l'API JDBC. L'accès se fait à l'aide du driver thin de Oracle.

D'autre part, il m'a paru intéressant de cloisonner les vues des producteurs. Un producteur quelconque ne doit normalement pas pouvoir consulter les récoltes d'un autre producteur. Pour cela j'ai créé une nouvelle table passwordp comportant deux colonnes :

On peut remarquer que la relation qui lie la table des producteurs à celle des mots de passe est de cardinalité 1 pour 1. J'aurai pu rajouter une colonne pour les mots de passe dans la table des producteurs mais j'ai préféré isoler les informations concernant l'authentification des producteurs du reste de la base de données. De plus on peut noter que ce mécanisme d'authentification est bien trop simple : le mot de passe du producteur circule en clair entre le navigateur et le serveur HTTP et entre la servlet chargée de l'authentification et la base de données. Il est évident qu'un autre mécanisme devrait être adopté en pratique mais cette considération sort du sujet de l'approfondissement.

Les Servlets

Les servlets sont des modules qui étendent les serveurs orientés requêtes/réponse tels que les serveurs web utilisant java. Les servlets sont aux serveurs ce que les applets sont aux navigateurs. De nombreux serveurs HTTP supportent les servlets. Pour ma part j'ai utilisé Tomcat sur le port 8080 en local. Ecrire des servlets est relativement simple grace à l'API qui leur est dédiée. Il suffit de créer une classe qui hérite de la classe HttpServlet. On peut ensuite implémenter la méthode service qui prend en paramètres une HttpServletRequest qui est la requête du client HTTP et une HttpServletResponse qui représente la réponse du serveur : une page HTML par exemple.

Le cycle de vie d'une servlet

Toutes les servlets ont le même cycle de vie :

La notion de session

La poursuite de session est un mécanisme qui permet aux serveurs de maintenir un état pour une série de requêtes provenant du même client durant une certaine période. Les traitements de plusieurs requêtes d'un même client peuvent ainsi partager des données. Ce mécanisme fonctionne à l'aide des cookies ou bien en encodant l'URL.

La servlet ConnectionAuthenticationServlet

Un producteur qui souhaite consulter ses récoltes et les ventes s'y rapportant ouvre son navigateur et charge la page exo2.html. Cette page contient un formulaire dans lequel le producteur doit consigner son numéro identifiant et son mot de passe. Ses informations sont envoyées à la première servlet. Celle-ci ouvre une connection à la base de données Oracle grace à l'API JDBC. Si le client est bien un producteur et si son mot de passe est correct alors ConnectionAuthenticationServlet crée une session pour ce producteur. Elle y attache la connection ouverte, le numéro identifiant du producteur ainsi que son nom et son prénom et redirige la requête vers la seconde servlet. Pour vérifier le mot de passe du producteur, la servlet interroge la base de données en lui soumettant la requête SQL suivante :

select p.prenomp, p.nomp, p.np, passwordp.np
from p, passwordp
where passwordp.np = numero_producteur
and passwordp.pwd = le_mot_de_passe_propose
and p.np = passwordp.np

Si le résultat ne contient aucun t-uple alors l'accès est refusé.

La servlet RequestServlet

La seconde servlet recupère la session créée par la première. A partir de cette session, elle obtient le numéro du producteur, son nom et son prénom ainsi que la connection à la base de données. Elle soumet ensuite deux requêtes SQL au serveur Oracle en utilisant cette connection :

select v.cru, v.mill, v.degre, r.qte
from p, r, v
where p.np = numero_producteur
and p.np = r.np
and r.nv = v.nv

Pour connaitre les récoltes de ce producteur,

select v.cru, v.mill, v.degre, a.qte, a.dat, b.nomb
from p, r, v, a, b
where p.np = numero_producteur
and p.np = r.np
and r.nv = v.nv
and v.nv = a.nv
and a.nb = b.nb

Pour connaitre les ventes réalisées par ce producteur.

Les résultats de ces requêtes sont formatés en tableaux HTML et insérés dans une page renvoyée au producteur.

On peut remarquer que là où j'ai conçu deux servlets, une seule aurait suffi. En fait J'ai préféré répartir l'application sur plusieurs servlets afin d'entrevoir les possibilités offertes par le mécanisme des sessions.

L'installation de l'application de préparation de livraison de vin

Pour développer et tester les deux servlets, j'ai utilisé Tomcat 3.2.1 Release Build en local sur le port 8080.

Voici les étapes à suivre pour mettre en place l'application de préparation de livraison :

Pour arrêter Tomcat :

Si vous avez des questions, des remarques ou des problèmes, vous pouvez m'envoyer un e-mail à mael.nagat@enst.fr.