Java Servlets, der Client und der Server


Diese Seite enthält ausschliesslich Text und ProgrammListings, jedoch keine Servlet-Funktionalität.
Um diese Demos nachzuvollziehen ist es erforderlich einen Server und ein Servlet-Modul zu installieren und zu konfigurieren, siehe Voraussetzungen

Voraussetzungen

Ein Servlet ist eine Java-Klassendatei, die auf einem Web-Server läuft. Ein Servlet erweitert die Funktionalität des Servers ähnlich wie ein CGI-Programm in Perl oder PHP.

Ein Servlet nimmt GET- oder POST-Anfragen eines Client entgegen. Es verarbeitet dann auf dem Server die im QueryString enthaltenen Daten. Mehrere Servlets können untereinander kommunizieren. Als Output erzeugt ein Servlet Zeichenketten, die an den Client zurückgeschickt werden. Diese Zeichenketten sollten print-Befehle zur Erzeugung eines HTML-Dokument beim Client enthalten .

Servlets haben kein eigenes grafisches UserInterface

Servlets erfordern auf dem Server die Zusammenarbeit der folgenden Komponenten:

Zum Entwickeln von Servlets gibt es von Sun folgende APIs:

Apache JServ

Das Apache JServ Module implementiert die Java Servlet API von SUN und steht zum download zur Verfügung bei http://java.apache.org/jserv/dist
Eine Einführung zur Funktionsweise gibt es bei www.magiccookie.com

Unify eWave Engine

ist eine Servlet Engine und ein Application Server, und implementiert Einzelheiten zu eWave Engine siehe: Unify Produkt-Info

JSDK2.0

download von SUN
Zu Testzwecken kann das Servlet anstatt auf einem Server erst mal im Servletrunner laufen, der im JSDK2.0 enthalten ist.

Aufrufen eines Servlets

Ein Servlets wird von einem Client aufgerufen. Dabei besitzt das Servlet 2 Interfaces, über die es mit dem Client kommuniziert:

Aus Sicht des Client gibt es verschiedene Wege ein Servlet aufzurufen. Der mehr oder weniger erfolgreiche Aufruf kann nachvollzogen werden durch einen Blick in den Logfile des Servers.
Die Eintragung in den Logfile bzgl. des Starts von SimpleServlet sieht so aus:

127.0.0.1 [27/Jun/2000] "GET /servlet/SimpleServlet HTTP/1.1" 200 250
Die vorletzte Zahl sagt folgendes:

Aufruf mit URL

Servlets werden vom Client im Web-Browser mit der URL des Servlets aufgerufen:
http://localhost/servlet/SimpleServlet
Der Client schickt standardmässig eine GET-Anfrage an den Server. Falls der Server mit einer Location-Direktive entsprechend konfiguriert worden ist, reicht er die Anfrage weiter an die ServletEngine. Das Servlet startet dann und es wird die Servlet-Methode doGet() aufgerufen.

Aufruf mit HTML-Form

Servlets werden aus HTML-Seiten heraus mit FORM ACTION aufgerufen:
<FORM ACTION="http//localhost/servlet/ServletGet METHOD=GET>
oder
<FORM ACTION="http//localhost/servlet/ServletPost METHOD=POST>

Nach dem ersten Aufruf läuft das Servlet weiter und muss daher bei erneuten Aufrufen nicht neu gestartet werden.

Header

Das interface HttpServletRequest stellt die Verbindung vom Client zum Servlet dar und enthält u.a. den Request-Header:

     Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, */*
     Accept-Encoding: gzip, deflate
     Accept-Language: de
     Connection: Keep-Alive
     Content-Length: 39
     Content-Type: application/x-www-form-urlencoded
     Cookie: 963733934540=meier; 963733946730=mueller
     Extension: Security/Remote-Passphrase
     Host: localhost
     Referer: http://localhost/Servlet_Lektion1/src/ServletPost.html
     User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)

Ausser dem Header bietet HttpServletRequest Zugriff auf die üblichen CGI-Variablen, insbesondere auf den QueryString

Klassen und interfaces

Die Servlet-API von SUN enthält verschiedene Klassen und interfaces, von denen der/die ProgrammiererIn seine/ihre Servlet-Klassen ableiten kann. Alle Servlets implementieren das interface Servlet. Man kann dieses zum Ausgangspunkt der Entwicklung machen. Komfortabler ist es aber, Servlet-Klassen von der Klasse HttpServlet abzuleiten, die ihreseits das interface Servlet implementiert.

interface Servlet

Alle Servlets implementieren das Interface Servlet. Das kleinstmögliche Servlet der Welt sieht also so aus: Servlet1.

Das Interface Servlet definiert die folgenden Methoden:

class GenericServlet

implementiert das interface Servlet und besitzt ebenfalls die service()-Methode.
GenericServlet wird in der Praxis selten verwenedet.
Es ist die Superklasse von HttpServlet

class HttpServlet

wird in der Praxis als Superklasse aller Servlets benutzt

Als Hauptmethoden ist eine der folgenden 3 Methoden zu benutzen, je nach dem ob das Servlet vom Client mit GET, POST oder mit beiden aufgerufen werden soll :

Servlets und andere Klassen

Ein Servlet kann auf dem Server Methoden anderer Klassen aufrufen. Das folgende Servlet ruft eine Methode einer Klasse, die für das Servlet eine Zeichenkette umwandelt.
Die Klein.class muss im CLASSPATH auf dem Server liegen
















nach oben
hier folgen die Quell-Codes
// implementiert das interface Servlet und sonst nichts
//
import javax.servlet.*;

public class Servlet1 implements Servlet
{
public void init(ServletConfig config)
{}
public ServletConfig getServletConfig()
{
        ServletConfig SG = null;
        return SG;
}
public java.lang.String getServletInfo()
{
        return("Servlet1 implements Servlet");
}
public void service(ServletRequest req, ServletResponse res)
{}
public void destroy()
{}

}


/* Demo init
dieses Servlet schreibt folgende 3 Zeilen in den log-File:
[Tue Jul 11 11:02:31 GMT+02:00 2000] Init Parameters:
[Tue Jul 11 11:02:31 GMT+02:00 2000] ServletContext(auszugsweise):
[Tue Jul 11 11:02:31 GMT+02:00 2000] ServerInfo: Apache/1.3.12 (Win32) ServletExecAS/3.0
*/

import javax.servlet.*;
import java.util.Enumeration;

public class Servlet2 implements Servlet
{
public void init(ServletConfig config) throws ServletException
{
        Enumeration IPN = config.getInitParameterNames();
        System.out.println("Init Parameters:");
        while (IPN.hasMoreElements())
        {
                String param = (String) IPN.nextElement();
                System.out.println(" "+param+": "+config.getInitParameter(param));
        }
        ServletContext SC = config.getServletContext();
        System.out.println("ServletContext(auszugsweise):");
        System.out.println("ServerInfo: " + SC.getServerInfo());
}
public ServletConfig getServletConfig()
{
        ServletConfig SG = null;
        return SG;
}
public java.lang.String getServletInfo()
{
        return("Erste Klasse Implementierung interface Servlet");
}
public void service(ServletRequest req, ServletResponse res)
             throws ServletException,java.io.IOException
{}
public void destroy()
{}

}



/* Demo ServletRequest ServletResponse
Aufruf mit:
http://localhost/servlet/Servlet3?Anfrage=wasistdennhierlos
der Aufruf von
req.getParameterValues("Anfrage")
bringt einen Array der Client-Inputs
*/
import java.io.PrintWriter;
import javax.servlet.*;

public class Servlet3 implements Servlet
{
public void init(ServletConfig config) throws ServletException
{

}
public ServletConfig getServletConfig()
{
        ServletConfig SG = null;
        return SG;
}
public java.lang.String getServletInfo()
{
        return("Erste Klasse Implementierung interface Servlet");
}
public void service(ServletRequest req, ServletResponse res)
             throws ServletException,java.io.IOException
{
        PrintWriter        out;
        String Anfrage;

        res.setContentType("text/html");
        out = res.getWriter ();

        Anfrage = req.getParameterValues("Anfrage")[0];

        out.println("<html>");
        out.println("<head><title>Servlet3</title></head>");
        out.println("<body>");

        out.println("Die Anfrage war: " + Anfrage );

        out.println("</body>\n</html>");

}
public void destroy()
{}

}

/* Demo GenericServlet
Aufruf mit:
http://localhost/servlet/ServletG1?Anfrage=wasistdennhierlos
*/
import java.io.PrintWriter;
import javax.servlet.*;

public class ServletG1 extends GenericServlet
{


public void service(ServletRequest req, ServletResponse res)
             throws ServletException,java.io.IOException
{
        PrintWriter        out;
        String Anfrage;

        res.setContentType("text/html");
        out = res.getWriter ();

        Anfrage = req.getParameterValues("Anfrage")[0];

        out.println("<html>");
        out.println("<head><title>ServletG1</title></head>");
        out.println("<body>");

        out.println("Die Anfrage war: " + Anfrage );

        out.println("</body>\n</html>");

}

}




<HTML>
<head><title>FORM ACTION ruft ServletGet  </title></head>
<body>
<FORM METHOD=GET
ACTION="http://localhost/servlet/ServletGet"
>
Feld1: <br><input size=40 maxlength=40 name="Feld1"><br>
Feld2: <br><textarea rows=5 cols=70 name="Feld2"></textarea><p>
<INPUT TYPE=SUBMIT>
</Form>

<body>
</HTML>


import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ServletGet extends HttpServlet
{
public void doGet(HttpServletRequest req, HttpServletResponse res)
                      throws ServletException, IOException
{
        res.setContentType("text/html");
        PrintWriter out = res.getWriter();

        out.println("<HTML>");
        out.println("<HEAD>");
        out.println("<TITLE>doGet(HttpServletRequest, HttpServletResponse): ServletGet");
        out.println("</TITLE></HEAD>");
        out.println("<BODY>");

        out.println("<h2 align=\"center\"><font color=\"#FF0000\">");
        out.println("doGet: Methoden von interface HttpServletRequest");
        out.println("</font></h2>");

        out.println("getContentLength(): "+ req.getContentLength() +"<br>");
        out.println("getCharacterEncoding(): "+ req.getCharacterEncoding() + "<br>");
        out.println("getContentType(): "+ req.getContentType() + "<br>");
        out.println("getMethod(): "+ req.getMethod() + "<br>");
        out.println("getPathInfo(): "+ req.getPathInfo() + "<br>");
        out.println("getPathTranslated(): "+ req.getPathTranslated() + "
"); out.println("getQueryString(): "+ req.getQueryString() + "
"); out.println("<br>\n"); Enumeration IPN = req.getParameterNames(); out.println("Init Parameter aus FORM INPUT:<br>\n"); while (IPN.hasMoreElements()) { String param = (String) IPN.nextElement(); out.println("     " +param +": " +req.getParameter(param) +"<br>\n"); } out.println("
\n"); Enumeration HN = req.getHeaderNames(); out.println("Header aus der Request:<br>\n"); while (HN.hasMoreElements()) { String param = (String) HN.nextElement(); out.println("     " +param +": " +req.getHeader(param) +"<br>\n"); } out.println("<br>\n"); out.println("getProtocol(): "+ req.getProtocol() + "<br>"); out.println("getRemoteAddr(): "+ req.getRemoteAddr() + "<br>"); out.println("getScheme(): "+ req.getScheme() + "<br>"); out.println("getServerName(): "+ req.getServerName() + "<br>"); out.println("getServerPort(): "+ req.getServerPort() + "<br>"); out.println("</BODY></HTML>"); } }


import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import klein.Klein;

public class ServletEA extends HttpServlet
{
public void doGet(HttpServletRequest req, HttpServletResponse res)
                      throws ServletException, IOException
{
        res.setContentType("text/html");
        PrintWriter out = res.getWriter();

        out.println("<HTML>");
        out.println("<HEAD>");
        out.println("<TITLE> Servlet ruft Methode einer Klasse");
        out.println("</TITLE></HEAD>");
        out.println("<BODY>");

        out.println("<h1 align=\"center\"><font color=\"#Fedcba\">");
        out.println("Eingabe Ausgabe");
        out.println("</font></h1>");

        out.println("<FORM METHOD=GET ACTION="
           + "\"http://localhost/Servlet_Lektion1/servlet/ServletEA\">");
        out.println("Text-Eingabe:<P>");
        out.println("<INPUT TYPE=TEXT NAME=Eing ><P>");
        out.println("<INPUT TYPE=submit VALUE= \"machs klein\">");
        String Eing = req.getQueryString();
        if( Eing != null )
        {
                String Ausg = new Klein().klein( Eing );
                out.println("<h2 align=\"center\"><font color=\"#abcdef\">");
                out.println( Ausg );
                out.println("</font></h2>");
        }
        out.println("</BODY></HTML>");
}
}


/* Demo Klein.java
Aufruf durch Servlet ServletEA
stellt eine Utility-Funktion klein( String ) bereit
*/

package klein;

public class Klein
{
public String klein( String Eing )
{
        return Eing.toUpperCase();
}
}














nach oben