Comment démarrer avec Java côté serveur

Java côté serveur (SSJ), parfois appelé servlets ou applets côté serveur, est un puissant hybride de la Common Gateway Interface (CGI) et de la programmation d'API serveur de niveau inférieur - comme NSAPI de Netscape et ISAPI de Microsoft.

Cet article fournit une introduction et des instructions pas à pas pour l'implémentation Netscape de Java côté serveur, que Netscape appelle les applets côté serveur (SSA).

Les SSA peuvent agir comme un script CGI. Il reçoit getet postdemande et renvoie une page Web (généralement sous forme de HTML), mais SSJ est chargé dynamiquement dans le serveur comme NSAPI / ISAPI. Cela élimine les délais de démarrage auxquels nous nous attendons de CGI. Cela permet également au SSJ de conserver une partie de son état entre les exécutions, par exemple en gardant une connexion ouverte à une base de données.

Les SSA s'exécutent dans leur propre sandbox, qui fournit la sécurité attendue de Java. Par exemple, une applet qui plante ne plante pas le serveur entier comme cela peut arriver avec la programmation NSAPI / ISAPI. Cette sécurité supplémentaire permet également aux applets d'être téléchargées pour exécution sur le serveur - tout comme les applets Java côté client sont téléchargées pour être exécutées sur le client.

L'aspect le plus important des SSA est peut-être que, écrits en Java, ils sont intrinsèquement indépendants de la plate-forme et orientés objet.

L'histoire

Un nombre croissant de serveurs prennent en charge Java côté serveur, y compris les serveurs Netscape FastTrack 2.0 et Enterprise 2.0, Java Web Server de JavaSoft (anciennement appelé Jeeves), Jigsaw du World Wide Web Consortium, T3Server de WebLogic, Webserver d'Oracle et ExpressO de Peak Technologies. Chacun de ces serveurs utilise une API Java côté serveur différente, ce qui oblige les développeurs à écrire différents programmes pour chaque serveur qu'ils utiliseront.

Détails de Netscape: préparez votre serveur

Avant de créer votre première applet côté serveur pour les serveurs Netscape, vous devez préparer le serveur. Les serveurs Enterprise et FastTrack sont identiques dans leur prise en charge SSA.

Commencez par activer l'interpréteur Java du serveur. Cela peut être fait à partir du gestionnaire de serveur sous «Programmes -> Java». Cliquez sur le bouton Oui pour activer l'interpréteur Java. Le gestionnaire de serveur vous demandera un «répertoire d'applet Java», qui est l'endroit où placer les fichiers de support SSA ainsi que l'emplacement de tous les fichiers de classe SSA. Il fournit un emplacement par défaut. Sur les machines Unix, il s'agit de / usr / ns-home / plugins / java / applets . Sur les machines Windows, il s'agit de C: \ Program Files \ Netscape \ Server \ plugins \ Java \ applets(Remarque: Dans ce champ de saisie, Netscape a tendance à mélanger et à faire correspondre ses barres obliques inverses et ses barres obliques. Ne vous inquiétez pas, Netscape traite les deux types de barres obliques de la même manière.) Prenez le répertoire d'applet par défaut si possible. Si vous décidez de personnaliser plutôt que d'utiliser la valeur par défaut, assurez-vous de choisir un répertoire quelque part sous la racine de votre serveur et de copier tous les fichiers de l'emplacement par défaut vers votre emplacement personnalisé. Enregistrez et appliquez vos modifications, en veillant à arrêter le serveur et à le redémarrer pour que les modifications prennent effet.

Il est temps d'expérimenter!

À ce stade, vous devriez être en mesure d'expérimenter les applets fournies par Netscape. Pointez votre navigateur sur // servername / server-java / FormApplet? Abc = xyz & 123 = 789. Vous devriez voir les données "get" traitées et renvoyées en HTML par l'applet Form.

Si vous obtenez une erreur de serveur, vérifiez le journal des erreurs de votre serveur ( / usr / ns-home / httpd-hostname / logs / errors ou C: \ Program Files \ Netscape \ Server \ httpd-hostname \ logs \ errors ). S'il indique qu'il ne peut pas démarrer l'interpréteur Java, une cause probable est que votre CLASSPATH confond Netscape. Essayez de démarrer le serveur dans un environnement sans CLASSPATH.

Une autre applet à essayer est à // servername / server-java / Connect; il devrait charger et afficher //www.meer.net/barn/index.html. L'applet Connect établit une connexion socket afin de récupérer la page, ce qui peut générer une erreur de serveur si votre serveur est derrière un pare-feu. Pour l'étape suivante, supposons qu'un pare-feu a bloqué le socket. Nous modifierons le code de l'applet Connect pour accéder à une page différente sur un autre serveur Web.

Le fichier Connect.java est disponible dans le «répertoire de l'applet Java». (On le trouve également ci-dessous.) Il importe d'abord netscape.server.applet. *.

import netscape.server.applet. *; 

Ce package contient les classes de base pour développer des applets côté serveur. La classe la plus importante de ce package est HttpAppletla superclasse de toutes les applets côté serveur. Comme vous pouvez le voir dans Connect (ci-dessous), la seule méthode qu'une applet côté serveur doit implémenter est la runméthode. Cette méthode est invoquée chaque fois que l'applet reçoit un "hit". La runméthode de connexion ouvre une socket vers «l'hôte» et récupère la «requête» avant de rediriger la sortie vers le client. Nous voulons changer la variable "hôte" pour qu'elle référence une machine visible depuis notre serveur Web. Nous souhaitons également modifier la variable «request» afin qu'elle référence une page sur le nouvel «hôte».

import netscape.server.applet. *; import java.io.PrintStream; import java.io.InputStream; import java.io.OutputStream; import java.io.DataInputStream; import java.net.Socket; class Connect étend HttpApplet {public void run () lève Exception {String host = "www.meer.net"; // changez ce port int = 80; String request = "GET /barn/index.html HTTP / 1.0 \ n"; // ceci aussi Socket s = new Socket (hôte, port); OutputStream os = s.getOutputStream (); PrintStream op = nouveau PrintStream (os); op.println (demande); InputStream est = sam (); DataInputStream di = new DataInputStream (est); Ligne de chaîne; if (returnNormalResponse ("text / html")) {PrintStream out = getOutputStream (); out.println ("& lth1 & gtData sur" + hôte + "port" + port + ""); out.println ("demande:" + demande + "
   
"); while ((ligne = di.readLine ())! = null) out.println (ligne);}}}

Une fois que vous avez effectué les modifications "hôte" et "demande", l'étape suivante consiste à recompiler Connect.

Sous Windows, utilisez votre compilateur javac standard avec le chemin de classe défini pour inclure serv2_0.zip. javac -classpath ..\classes\serv2_0.zip Connect.java.

Sous Unix, Netscape fournit un compilateur Java (javac) dans le répertoire au-dessus du répertoire de l'applet Java. Ce javac est en fait un script qui appelle java sun.tools.javac.Mainà faire la compilation. Sur certains systèmes, le sun.tools.javac.Maincompilateur utilise de nouvelles méthodes JDK 1.1 telles que java.lang.Character.isJavaLetterOrDigit(), ce qui peut poser un problème pour les développeurs sans le JDK 1.1. Une alternative parfaitement bien est d'utiliser le compilateur standard javac que vous avez toujours utilisé, javac -classpath ../classes/serv2_0.zip Connect.java. Si vous souhaitez utiliser le script javac fourni, remplacez simplement " javac" par " ../javac."

Vous pouvez voir une erreur lors de cette compilation qui dit:

Connect.java:1: Package netscape.server.applet introuvable dans l'importation. import netscape.server.applet. *; ^ 1 erreur

Cette erreur n'est pas à craindre. Le fichier de classe est créé normalement et fonctionnera correctement. Vous pouvez éviter cette erreur si vous supprimez les caractères génériques dans vos instructions d'importation.

Sous Unix, Netscape fournit un makefile dans le répertoire de l'applet Java pour gérer la compilation de l'applet. Malheureusement, le makefile utilise le joker '%', qui est une extension mk / nmake et n'est pas toujours disponible. Le code du problème est indiqué ci-dessous.

% .class:% .java ../javac -classpath ../classes/serv2_0.zip $ *. java 

Une alternative consiste à utiliser une règle .suffixes. Modifiez la première ligne du makefile comme suit:

.SUFFIXES: .java .class et remplacez les lignes cibles% .class par .java.class: javac -classpath ../classes/serv2_0.zip $ < 

Vous remarquerez peut-être que j'ai supprimé le ../pour que le makefile appelle le compilateur javac standard. Pour tester ce nouveau fichier Make, réenregistrez le fichier Connect.java et essayez un "make".

Si vous deviez recharger la page // servername / server-java / Connect maintenant, vous verriez toujours la page "Barn". En effet, les classes Java sont chargées sur le serveur au moment du démarrage via une fonction init dans le fichier obj.conf. Pour charger les nouvelles modifications, vous devez arrêter le serveur, puis le redémarrer. Sur certains systèmes, vous devez utiliser le gestionnaire de serveur pour effectuer l'arrêt et le démarrage. Les redémarrages de la ligne de commande entraînent parfois une "erreur de serveur" pour les demandes d'applet suivantes. Une fois que vous avez arrêté et démarré le serveur, essayez à nouveau l'applet Connect. Netscape doit avoir chargé le nouveau code Connect pour afficher la page que vous avez sélectionnée.

Let's get serious about API

Congratulations! You`ve just compiled and tested your first server-side Java code. Now to give a few of the methods available to you.

With the following methods you can do the majority of your work:

PrintStream getOutputStream() throws IOException; 

returns a PrintStream, which you can use to print your response to the client. It replaces System.out.

Hashtable getFormData() throws IOException; 

returns a Hashtable storing the name-value pairs of the HTTP request. The value strings are decoded from their URI-encoded form. It throws an IOException if there is no form data.

String getFormField(String fieldName) throws IOException; 

You can use getFormField for retrieving just one field. It too throws an IOException if there is no form data.

boolean returnNormalResponse(String contentType) throws IOException; 

starts an HTTP response with the content type set as you specify with its parameter. It returns true if this was a "get" or "post" request and false if it was a "head" request.

public boolean returnErrorResponse(String contentType, int status, String reason) throws IOException public boolean returnErrorResponse(String contentType, int status) throws IOException 

starts an HTTP response to report an error. It takes a content type, a status (such as HttpApplet.BAD_REQUEST, which represents the standard error code 400), and an optional string giving the reason for the error.

There are dozens of other methods you can use in the development of your server-side applets. Netscape installs an API guide with its servers. You can find the guide at /usr/ns-home/bin/httpd/admin/html/manual/pg/javapi.htm under Unix or at C:\Program Files\Netscape\Server\bin\httpd\admin\html\manual\pg\javapi.htm under Windows.

Hello World!

Now let's use everything we've learned to write the (you guessed it!) Hello World server-side applet. The following applet says hello to World unless a target field is given -- in which case it says hello to the target instead.

import netscape.server.applet.HttpApplet; import java.io.IOException; import java.io.PrintStream; class Hello extends HttpApplet { /* By default, we say hello to "World" */ String helloTarget = "World"; /* run() is invoked to handle the request */ public void run() throws Exception { /* getOutputStream() allows us to talk to the client */ PrintStream out = getOutputStream(); /* Use getFormField() to find out if we are to say hello to * someone other than "World". */ String formTarget = null; try { formTarget = getFormField("target"); if (formTarget != null) { helloTarget = formTarget; } } catch (IOException e) { /* We'll ignore exceptions caused by a "missing query string" */ if (! e.getMessage().startsWith("missing query string")) { handleException(e, out); } } /* Say the hello */ if (returnNormalResponse("text/html")) { try { out.println("Hello, " + helloTarget + "!"); } catch (Exception e) { handleException(e, out); } } } private void handleException(Exception e, PrintStream out) { try { returnErrorResponse("text/html", SERVER_ERROR, "Exception thrown"); } catch (IOException ioe) {} // try to print original exception out.print("&lth1>"); out.print(e); out.print("\n"); out.print("&ltpre>"); e.printStackTrace(out); // alternative PrintStream must be specified out.print("
"); revenir; } }

Cette applet côté serveur sous-classe de netscape.server.applet.HttpApplet et remplace la run()méthode comme toutes les applets côté serveur sous Netscape. Il obtient rapidement son flux de sortie avec un appel à getOutputStream, qu'il utilisera pour imprimer le "Hello" (ou utiliser pour imprimer la raison d'un échec). Il appelle getFormFieldpour vérifier s'il existe une autre cible à utiliser, puis renvoie une réponse "text / html" normale et effectue enfin le travail réel d'impression de "Hello". Notez qu'il vérifie la valeur de retour de l' returnNormalResponse()appel et ne fait rien s'il renvoie false. Si vous ne le faites pas, vous retournerez des données même pour les headdemandes.