4. Autres techniques de collaboration entre Servlets
La collaboration entre Servlets comme on l' a vue dans les précédents articles se fait par échange d'informations directement entre Servlets via leurs méthodes publiques (façon abandonnée pour des raisons de sécurité) ou en s'appuyant sur d'autres techniques comme "le partage d'informations" ou le "Partage de contrôle".
4.1. Collaboration via le système de liste de propriétés de la Servlet
Une des plus simples façon qui permet l'échange d'informations entre Servlets est l'utilisation du système de liste des propriétés de Java qui se trouve dans la classe "java.lang.System". Dans ce système de liste de propriétés se trouvent des propriétés standard comme " java.version" et "path.separator" mais aussi les propriétés les plus spécifiques d'une application. Chaque Servlet peut ajouter ou modifier une propriété en procédant comme suit:
System.getProperties().put("key", "value");
Toutes les Servlets qui se trouvent sur le même serveur dans la même JVM peuvent accéder à la valeur d'une quelconque propriété de n'importe quelle Servlet qui s'y trouve en procédant comme suit:
String value = System.getProperty("key");
On peut aussi changer la valeur ou l'enlever par:
System.getProperties().remove("key");
Il est beaucoup plus facile de manipuler un couple (clé, valeur) de la liste de propriétés si la clé du couple propriété (Properties) a un préfixe qui contient le nom du package de la Servlet et le nom de du groupe de collaboration.
La classe Properties est une classe persistante qui représente les propriétés (properties) d'une application sous forme de couple de chaînes de caractères; chaque couple (clé, valeur) est donc un couple de "String"; cette limitation (le fait que ce soit un couple de String) est parfois contournée par des Servlets qui veulent stocker ou retirer des Objets qui ne sont pas de type String. Ces Servlets peuvent tirer avantage du faite que la classe Properties étend la classe Hashtable; la liste des propriétés peut donc être considérée comme un objet Hashtable quand on traite un couple (clé, valeur); Par exemple, une Servlet peut ajouter ou changer un objet Properties en procédant comme suit:
System.getProperties().put(keyObject, valueObject); // hack
On peut récupérer les propriétés d'un objet par l'instruction ci-dessous:
SomeObject valueObject = (SomeObject)System.getProperties().get(keyObject);
On peut retirer une propriété en procédant de la façon suivante:
System.getProperties().remove(keyObject);
Le détournement de l'utilisation du système de liste des propriétés comme on l' a dit ci-dessus, provoque, de la part des méthodes "getProperty()", "list()" et "save()" de la classe Properties, une levée d'exception de type ClassCastException car ces méthodes s'attendent à avoir à faire à des String. Pour cette raison, il faut éviter de se servir de ces méthodes mais plutôt utiliser d'autres techniques de collaboration entre Servlets; il faut aussi se souvenir que les fichiers contenant les classes de keyObject et de valueObject doivent se trouver dans la classPath du Serveur et non dans le répertoire où est chargée la Servlet sinon on peut avoir des erreurs.
On a aussi plus de trois raisons qui nous dissuadent d’utiliser les méthodes de collaboration entre Servlet; en effet, entre deux recharges d'une Servlet, d'autre Servlet peuvent modifier les propriétés de certaines Servlets car les informations présentes dans les propriétés ne sont pas naturellement persistantes entre deux recharges d'une Servlet.
Exemple d'utilisations de propriétés
Malgré les avertissements ci-dessus pour l'utilisation du système de liste des propriétés des Servlets pour la collaboration entre Servlets se trouvant dans une même JVM, on peut s'en servir si on traite des informations non critiques; prenons l'exemple d'une Servlet utilisée pour la vente de produits et qui partage "une vente spéciale du jour" avec d'autres Servlets sur le même serveur . La Servlet qui gère cette vente peut procéder comme suit:
System.getProperties().put("com.LaCostena.special.burrito", "Pollo Adobado");
System.getProperties().put("com.LaCostena.special.day", new Date());
Par la suite les autres Servlets sur le Server peuvent accéder à la vente spéciale du jour en procédant comme suit:
String burrito = System.getProperty("com.LaCostena.special.burrito"); Date day = (Date)System.getProperties().get("com.LaCostena.special.day"); DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT); String today = df.format(day); out.println("Our burrito special today (" + today + ") is: " + burrito);
4.2. Chaînage rapide des images
On peut accélérer la transmission d'une image dans une Servlet à une autre Servlet dans un ensemble de Servlets présentes dans une JVM en utilisant le système de liste de propriétés de la Servlet émettrice ou réceptrice. Dans un autre chapitre on a vu comment deux Servlets peuvent s'échanger une image de manière classique; la première Servlet prend un Objet image, l'encode en un flux de bytes et envoie le flux de bytes à l'autre Servlet; la Servlet qui reçoit le flux de bytes issu de l'objet image le décode et récupère ainsi l'objet image. Cette façon de faire est très lente. Pour aller plus vite, ici on va se servir du système de liste des propriétés des Servlets issues d'un même JVM. Dans l'exemple que nous traiterons on montre exactement comment une Servlet transmet la clé de l'objet image sauvegardée dans le système de liste des propriétés de l'application et comment une autre Servlet récupère cette clé pour afficher ou traiter l'image sans la télécharger mais en la laissant au même endroit.
4.3. Exemple: échanger une image via la liste des propriétés
(à suivre)