Cómo empezar con Java del lado del servidor

Java del lado del servidor (SSJ), a veces llamado servlets o subprogramas del lado del servidor, es un poderoso híbrido de Common Gateway Interface (CGI) y programación de API de servidor de nivel inferior, como NSAPI de Netscape e ISAPI de Microsoft.

Este artículo proporciona una introducción e instrucciones paso a paso para la implementación de Netscape de Java del lado del servidor, que Netscape llama subprogramas del lado del servidor (SSA).

Los SSA pueden actuar como un script CGI. Se recibe gety postpeticiones y devuelve una página web (por lo general en forma de HTML), pero SSJ se carga dinámicamente en el servidor como NSAPI / ISAPI. Esto elimina los retrasos en la puesta en marcha que esperamos de CGI. También permite que la SSJ mantenga parte de su estado entre ejecuciones, como mantener una conexión abierta a una base de datos.

Los SSA se ejecutan en su propia caja de arena, lo que proporciona la seguridad que uno espera de Java. Por ejemplo, un subprograma que falla no bloqueará todo el servidor como puede suceder con la programación NSAPI / ISAPI. Esta seguridad adicional también permite cargar subprogramas para su ejecución en el servidor, al igual que los subprogramas de Java del lado del cliente se descargan para su ejecución en el cliente.

Quizás el aspecto más importante de los SSA es que, escritos en Java, son inherentemente independientes de la plataforma y están orientados a objetos.

Historia

Un número creciente de servidores admite Java del lado del servidor, incluidos los servidores Netscape FastTrack 2.0 y Enterprise 2.0, Java Web Server de JavaSoft (anteriormente llamado Jeeves), Jigsaw del World Wide Web Consortium, T3Server de WebLogic, Webserver de Oracle y ExpressO de Peak Technologies. Cada uno de estos servidores utiliza una API de Java diferente del lado del servidor, lo que requiere que los desarrolladores escriban diferentes programas para cada servidor que utilizarán.

Detalles de Netscape: prepare su servidor

Antes de crear su primer subprograma del lado del servidor para los servidores de Netscape, debe preparar el servidor. Los servidores Enterprise y FastTrack son idénticos en su compatibilidad con SSA.

Empiece por encender el intérprete de Java del servidor. Esto se puede hacer desde el Administrador del servidor en "Programas -> Java". Haga clic en el botón Sí para habilitar el intérprete de Java. El Administrador del servidor le pedirá un "directorio de subprogramas de Java", que es el lugar para colocar los archivos de soporte SSA, así como la ubicación de todos los archivos de clase SSA. Proporciona una ubicación predeterminada. En máquinas Unix, es / usr / ns-home / plugins / java / applets . En máquinas con Windows, es C: \ Archivos de programa \ Netscape \ Server \ plugins \ Java \ applets(Nota: En este campo de entrada, Netscape tiende a mezclar y hacer coincidir sus barras diagonales inversas y diagonales. No se preocupe, Netscape trata los dos tipos de barras diagonales de la misma manera). Si es posible, utilice el directorio de subprogramas predeterminado. Si decide personalizar en lugar de usar el predeterminado, asegúrese de elegir un directorio en algún lugar debajo de la raíz de su servidor y de copiar todos los archivos de la ubicación predeterminada a su ubicación personalizada. Guarde y aplique sus cambios, asegurándose de detener el servidor e iniciarlo nuevamente para que los cambios surtan efecto.

¡Es hora de experimentar!

En este punto, debería poder experimentar con los subprogramas proporcionados por Netscape. Apunte su navegador a // servername / server-java / FormApplet? Abc = xyz & 123 = 789. Debería ver los datos "get" manejados y devueltos en HTML por el subprograma Form.

Si recibe un error del servidor, verifique el registro de errores de su servidor ( / usr / ns-home / httpd-hostname / logs / errors o C: \ Program Files \ Netscape \ Server \ httpd-hostname \ logs \ errors ). Si dice que no puede iniciar el intérprete de Java, una causa probable es que su CLASSPATH confunde a Netscape. Intente iniciar el servidor en un entorno sin CLASSPATH.

Otro subprograma para probar está en // servername / server-java / Connect; debería cargar y mostrar //www.meer.net/barn/index.html. El subprograma Connect establece una conexión de socket para obtener la página, lo que puede generar un error de servidor si su servidor está detrás de un firewall. Para el siguiente paso, supongamos que un firewall bloqueó el socket. Editaremos el código del subprograma Connect para acceder a una página diferente en un servidor web diferente.

El archivo Connect.java está disponible en el "directorio de subprogramas de Java". (También se encuentra a continuación). Primero importa netscape.server.applet. *.

importar netscape.server.applet. *; 

Este paquete contiene las clases básicas para desarrollar applets del lado del servidor. La clase más importante de este paquete es HttpAppletla superclase para todos los applets del lado del servidor. Como puede ver en Connect (abajo), el único método que un subprograma del lado del servidor necesita implementar es el runmétodo. Este método se invoca cada vez que el subprograma recibe un "hit". El runmétodo de Connect abre un conector al "host" y obtiene la "solicitud" antes de redirigir la salida al cliente. Queremos cambiar la variable "host" para que haga referencia a una máquina visible desde nuestro servidor web. También queremos cambiar la variable "solicitud" para que haga referencia a una página en el nuevo "host".

importar 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 extiende HttpApplet {public void run () lanza Exception {String host = "www.meer.net"; // cambia este int port = 80; Solicitud de cadena = "GET /barn/index.html HTTP / 1.0 \ n"; // esto también Socket s = new Socket (host, puerto); OutputStream os = s.getOutputStream (); PrintStream op = new PrintStream (sistema operativo); op.println (solicitud); InputStream es = sam (); DataInputStream di = nuevo DataInputStream (es); Línea de cuerda; if (returnNormalResponse ("texto / html")) {PrintStream out = getOutputStream (); out.println ("& lth1 & gtData en" + host + "puerto" + puerto + ""); out.println ("solicitud:" + solicitud + "
   
"); while ((línea = di.readLine ())! = null) out.println (línea);}}}

Una vez que haya realizado los cambios de "host" y "solicitud", el siguiente paso es volver a compilar Connect.

En Windows, use su compilador javac estándar con el classpath configurado para incluir serv2_0.zip. javac -classpath ..\classes\serv2_0.zip Connect.java.

En Unix, Netscape proporciona un compilador de Java (javac) en el directorio sobre el directorio del subprograma de Java. Este javac es en realidad un script que llama java sun.tools.javac.Mainpara realizar la compilación. En algunos sistemas, el sun.tools.javac.Maincompilador utiliza nuevos métodos 1.1 JDK como java.lang.Character.isJavaLetterOrDigit(), que pueden causar un gran problema a los desarrolladores sin el 1.1 JDK. Una alternativa perfectamente bien es usar el compilador javac estándar que ha utilizado siempre, javac -classpath ../classes/serv2_0.zip Connect.java. Si desea utilizar el script javac proporcionado, simplemente reemplace " javac" por " ../javac."

Es posible que vea un error durante esta compilación que dice:

Connect.java:1: el paquete netscape.server.applet no se encuentra en la importación. importar netscape.server.applet. *; ^ 1 error

Este error no es motivo de preocupación. El archivo de clase se crea normalmente y funcionará bien. Puede evitar este error si elimina los comodines en sus declaraciones de importación.

En Unix, Netscape proporciona un archivo MAKE en el directorio del subprograma Java para manejar la compilación del subprograma. Desafortunadamente, el archivo MAKE usa el comodín '%', que es una extensión mk / nmake y no siempre está disponible. El código del problema se muestra a continuación.

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

Una alternativa es usar una regla .suffixes. Edite la primera línea del archivo MAKE para que sea:

.SUFIJOS: .java .class y reemplace las líneas de destino% .class con .java.class: javac -classpath ../classes/serv2_0.zip $ < 

Puede notar ../que eliminé el archivo MAKE para que invoque el compilador javac estándar. Para probar este nuevo archivo MAKE, vuelva a guardar el archivo Connect.java e intente "make".

Si tuviera que volver a cargar la página // servername / server-java / Connect en este momento, aún vería la página "Barn". Esto se debe a que las clases de Java se cargan en el servidor en el momento de inicio mediante una función init en el archivo obj.conf. Para cargar los nuevos cambios, debe detener el servidor y luego iniciarlo nuevamente. En algunos sistemas, debe utilizar el Administrador del servidor para detener e iniciar. Los reinicios de la línea de comandos a veces dan como resultado un "Error del servidor" para las solicitudes de subprograma posteriores. Una vez que haya detenido e iniciado el servidor, vuelva a intentar el subprograma Connect. Netscape debería haber cargado el nuevo código de Connect para mostrar la página que seleccionó.

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("
"); regreso; } }

Este subclases del lado del servidor de netscape.server.applet.HttpApplet y anula el run()método al igual que todos los subprogramas del lado del servidor en Netscape. Obtiene rápidamente su flujo de salida con una llamada a getOutputStream, que usará para imprimir el "Hola" (o usará para imprimir el motivo de una falla). Llama getFormFieldpara verificar si hay un destino alternativo para usar, y luego devuelve una respuesta normal de "texto / html" y finalmente realiza el trabajo real de imprimir "Hola". Observe que verifica el valor de retorno de la returnNormalResponse()llamada y no hace nada si devuelve falso. Si no lo hace, devolverá datos incluso para las headsolicitudes.