Ecrire des programmes CGI en Java

L'interface de passerelle commune (CGI) est une norme pour l'écriture de programmes qui peuvent interagir via un serveur Web avec un client exécutant un navigateur Web. Ces programmes permettent à un développeur Web de fournir des informations dynamiques (généralement sous forme de HTML) via le navigateur. Un programme CGI peut être écrit dans n'importe quel langage, y compris Java, qui peut être exécuté par votre serveur Web. Les programmes CGI sont couramment utilisés pour ajouter des moteurs de recherche, des applications de livre d'or, des moteurs de recherche de base de données, des forums d'utilisateurs interactifs et d'autres applications interactives sur des sites Web.

En termes très basiques, un programme CGI doit interpréter les informations qui lui sont envoyées, traiter les informations d'une manière ou d'une autre et générer une réponse qui sera renvoyée au client.

La plupart des entrées d'un programme CGI y sont transmises via des variables d'environnement. Cet article montre comment envoyer ces variables d'environnement à un programme Java CGI. Le reste de l'entrée (le cas échéant) est passé dans un programme CGI en tant qu'entrée standard qui peut être lue directement par votre programme.

Le traitement peut être aussi simple que l'ajout d'informations à un fichier ou aussi complexe que la demande de données à partir d'une base de données.

Puisqu'un programme CGI peut renvoyer une myriade de types de documents, un programme CGI doit placer un court en-tête (texte ASCII) sur sa sortie afin que le client sache comment interpréter les informations qu'il génère. Le plus souvent, les programmes CGI génèrent du HTML. Ci-dessous, vous trouverez une bibliothèque de fonctions dont une qui génère l'en-tête approprié pour HTML. Après l'en-tête, un programme CGI génère simplement le corps de la sortie dans sa forme native.

Passage de l'environnement CGI au programme Java

L'écriture d'un programme CGI en Java est assez facile à faire une fois que vous avez compris les problèmes. Tout d'abord, vous devez encapsuler l'exécution du programme Java dans un autre script. Ainsi, le script réel appelé sur votre serveur Web sera un script shell Unix ou un fichier batch Windows (ou équivalent) qui transmet simplement les variables d'environnement CGI à votre programme Java.

Puisque Java ne fournit plus de méthode pour accéder directement aux variables d'environnement (la System.getenv()méthode a été désactivée dans la dernière version du JDK), je propose de passer chaque variable d'environnement CGI dans le programme Java en utilisant le paramètre de ligne de commande -D sur l'interpréteur Java . Je vais vous montrer comment utiliser le paramètre -D ci-dessous.

La bibliothèque de fonctions que je fournis ci-dessous suppose que vous avez utilisé l'approche décrite ci-dessus; il utilise la System.getProperty()méthode pour accéder à ces paramètres de ligne de commande. Si votre programme doit utiliser l'une des variables d'environnement CGI, vous pouvez y accéder de la même manière. Par exemple, si vous souhaitez accéder à la variable d'environnement SERVER_NAME, vous pouvez le faire comme suit:

 String nom_serveur = System.getProperty ("cgi.nom_serveur"); 

Sachez que je ne transmets pas toutes les variables d'environnement CGI à mon programme Java. Je ne fais que passer les principaux. Je laisserai l'inclusion des autres comme un exercice pour le lecteur.

L'exemple suivant montre un fichier de script Unix appelé en hello.cgiinvoquant un programme Java appelé hello. Notez que le paramètre de ligne de commande -D transmet les variables d'environnement CGI au programme Java:

#! / bin / sh java -Dcgi.content_type = $ CONTENT_TYPE -Dcgi.content_length = $ CONTENT_LENGTH -Dcgi.request_method = $ REQUEST_METHOD -Dcgi.query_string = $ QUERY_STRING -Dcgi.nom_serveur_serveur = $ SERVER_STRING -Dcgi.nom_serveur_serveur = $ SERVER_STRING -Dcgi.nom_serveur_serveur = $ SERVER_STRING - Dcgi.script_name = $ SCRIPT_NAME -Dcgi.path_info = $ PATH_INFO bonjour 

Cette solution ne fonctionne pas correctement sur les plates-formes Windows 95 et NT car il peut y avoir des limites sur le nombre de caractères autorisés sur la ligne de commande. Une autre approche pourrait être simplement d'écrire chacune des variables d'environnement et leurs valeurs associées dans un fichier temporaire (avec un nom de fichier unique, bien sûr). Ensuite, vous pouvez transmettre le nom de ce fichier à votre programme Java et lui faire lire ce fichier et analyser les paires variable / valeur d'environnement. N'oubliez pas de supprimer le fichier temporaire lorsque vous avez fini de l'utiliser! Encore une fois, cet exercice est laissé au lecteur.

Une bibliothèque Java CGI

Pour faciliter la tâche fastidieuse de traitement des entrées CGI, j'ai écrit une classe Java (vraiment une bibliothèque de fonctions) que vous pouvez utiliser pour réduire une partie du sale boulot. Cette bibliothèque tente de dupliquer les fonctionnalités de la très populaire cgi-lib.plbibliothèque Perl . J'ai documenté le code ci-dessous en utilisant des commentaires de style javadoc afin que vous puissiez générer une documentation HTML directement à partir du code. (Utilisez javadoc cgi_lib.javapour générer cgi_lib.html.)

Voici le code source et la documentation de la bibliothèque.

Écriture de votre premier programme Java CGI

Voici un exemple qui montre comment la cgi_lib.javabibliothèque peut être utilisée pour écrire un programme CGI. Nous allons écrire un programme simple qui traite mon formulaire "Hello There". Ce formulaire simple demandera à l'utilisateur un nom et une adresse e-mail. Voici le formulaire ( hello.html) que nous voulons traiter:

& ltHTML> & ltHEAD> & ltTITLE & gtBonjour et bienvenue! & ltBODY> & ltH1 ALIGN = CENTRE & gtBonjour et bienvenue & lthr> & ltFORM METHOD = "POST" ACTION = "/ cgi-bin / hello.cgi"> Quel est votre nom? & ltINPUT TYPE = "text" NAME = "name"> & ltp> Quelle est votre adresse e-mail? & ltINPUT SIZE = 40 TYPE = "text" NAME = "email"> & ltINPUT TYPE = "submit" VALUE = "Soumettre">. & ltP> & lthr>

Écrivons un programme Java pour traiter le formulaire "Hello There".

Tout d'abord, nous devons informer le client que notre programme générera du HTML. La Header()méthode in cgi_lib.javacrée la chaîne dont nous avons besoin, nous allons donc commencer par appeler cette méthode et envoyer la chaîne vers la sortie standard à l'aide de l' System.out.printlnappel système.

// // Affiche l'en-tête CGI requis. // System.out.println (cgi_lib.Header ());

Deuxièmement, nous voulons traiter les données du formulaire qui nous sont envoyées par le navigateur. La ReadParseméthode in cgi_lib.javafait tout ce qui fonctionne pour nous et renvoie le résultat dans une instance de Hashtable. Dans ce cas, la table de hachage contiendra deux valeurs de clé après l'analyse des données du formulaire. L'un sera le champ de saisie «nom» et l'autre sera le champ de saisie «e-mail». Les valeurs associées à chacune de ces clés seront celles que l'utilisateur a tapées dans ces champs de saisie sur le formulaire «Hello There».

// // Analyse les données du formulaire dans une table de hachage. // Table de hachage form_data = cgi_lib.ReadParse (System.in);

Maintenant que nous avons analysé les données du formulaire, nous pouvons effectuer le traitement que nous souhaitons avec les données qui nous sont envoyées. Ensuite, nous pouvons générer du HTML à renvoyer au navigateur de l'utilisateur. Dans ce programme simple, nous n'allons pas faire de traitement avec les données; nous allons simplement renvoyer les informations fournies par l'utilisateur. Nous allons utiliser la getméthode sur l'objet Hashtable pour extraire les valeurs du formulaire en chaînes que nous pouvons utiliser dans notre programme. L'exemple suivant montre comment nous extraire le nom que l'utilisateur a tapé dans un objet String.

 String name = (String) form_data.get ("nom"); 

Maintenant, mettons tout cela ensemble dans un programme simple. Voici une application Java que nous pouvons utiliser pour traiter le formulaire "Hello There" ( hello.java):

import java.util. *; import java.io. *; class hello {public static void main (String args []) {// // Voici un programme CGI minimaliste qui utilise cgi_lib // // // Affiche l'en-tête CGI requis. // System.out.println (cgi_lib.Header ()); // // Analyse les données du formulaire dans une table de hachage. // Table de hachage form_data = cgi_lib.ReadParse (System.in); // // Crée le haut de la page HTML retournée // String name = (String) form_data.get ("name"); System.out.println (cgi_lib.HtmlTop ("Hello There" + nom + "!")); System.out.println ("& lth1 align = center & gtBonjour" + nom + "!"); System.out.println ("Voici les paires nom / valeur de la forme:"); // // Affiche les paires nom / valeur envoyées depuis le navigateur. // System.out.println (cgi_lib.Variables (form_data));// // Affiche les variables d'environnement envoyées depuis le script Unix. // System.out.println ("Voici les variables d'environnement CGI / paires de valeurs" + "transmises depuis le script UNIX:"); System.out.println (cgi_lib.Environment ()); // // Crée le bas de la page HTML retournée pour la fermer proprement. // System.out.println (cgi_lib.HtmlBot ()); }}

Conclusion

Avec cette introduction à la programmation CGI en Java, vous devriez être sur la bonne voie pour une toute nouvelle façon de programmer le côté serveur de vos applications Web. Gardez à l'esprit que le protocole CGI ne fournit qu'une seule façon de communiquer entre un navigateur client et un serveur Web. Le Jigsaw du World Wide Web Consortium (voir la section Ressources ci-dessous) et d'autres comme Sun's Jeeves, proposent de meilleures solutions, qui impliquent l'écriture de servlets Java que vous pouvez suspendre à votre serveur Web. Mais c'est un sujet pour un autre jour. S'amuser!

Pat Durante est ingénieur logiciel senior chez TASC, Inc. à Reading, MA. TASC est une société de technologie de l'information appliquée de 00 millions de dollars qui se spécialise dans le développement et l'intégration de systèmes et de services d'information avancés. Pat conçoit des applications orientées objet depuis quatre ans. Il est le chef du groupe d'intérêt spécial orienté objet de TASC et le cofondateur du groupe d'intérêt Java de TASC. L'adresse du site Web de Pat est: //members.aol.com/durante.

En savoir plus sur ce sujet

  • Des informations sur l'interface de passerelle commune (CGI) peuvent être trouvées à:

    //hoohoo.ncsa.uiuc.edu/cgi

  • Le puzzle du World Wide Web Consortium est décrit à:

    //www.w3.org/pub/WWW/Jigsaw

  • Pour en savoir plus sur les Jeeves de Sun, consultez:

    //www.javasoft.com/products/jeeves/index.html

Cette histoire, "Ecrire des programmes CGI en Java" a été initialement publiée par JavaWorld.