Java™ Servlet Technologie
zurück weiter
Java™ Servlet Technologie

Anwendungsbeispiel


Das Servlet Catalog

Nachdem nun die beiden Hilfsklassen OraDBConnect und PageGenerator beschrieben wurden, soll jetzt die praktische Anwendung der Java™ Servlet Technologie anhand der zum elektronischen Produktkatalog gehöhrenden Servlets gezeigt werden. Begonnen wird dabei mit dem Servlet Catalog.

Zielstellung

Das Servlet Catalog hat die Aufgabe, das Navigations-Fenster am rechten Bildschirmrand dynamisch zu generieren. Hierbei soll bei Auswahl eines Kataloges beziehungsweise Unterkataloges aus einer Auswahlbox ein neues Navigationsfenster generiert werden, welches gegebenfalls um eine weitere Auswahlbox erweitert wird, die eine weitergehende Auswahl von Unterkatalogen gestattet. Dies soll so lange wiederholt werden, bis es für die bisher getroffene Auswahl keine Unterkataloge mehr gibt. In diesem Fall sollen dann durch Betätigen des Buttons unterhalb der letzten Auswahlbox die zum Katalog gehörigen Produkte im Hauptfenster des Browsers angezeigt werden.

Außerdem stellt das Navigations-Fenster noch eine Funktion bereit, welche die Produktansicht auch über die Angabe eines Suchbegriffs gestattet. Dieser Suchbegriff kann sowohl einen Teil der Produktbezeichnung als auch den vollständigen Produktnamen beinhalten.

Umsetzung

Zur Umsetzung der angesprochenen Funktionalitäten muß zunächst das Servlet Catalog generiert werden. Hierzu wird die Klasse HttpServlet erweitert. Außerdem werden die Objekte dbcon, pageGen und page deklariert, deren Verwendungszweck im nachfolgenden Quell-Code noch beschrieben wird.

Die im Kapitel Grundlagen beschriebenen Methoden zur Initialisierung eines Servlets und Beendigung eines Servlets werden hier benutzt, um Objekte zum Datenbankzugriff und zur Seitengenerierung zu erzeugen beziehungsweise um die Verbindung zur Datenbank abzubauen. Im nachfolgenden Quell-Code wird dies dargestellt und entsprechend kommentiert.


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

    // Deklaration der Servlet-Klasse Catalog
    public class Catalog extends HttpServlet {
        // Deklaration eines OraDBConnect-Objektes zum Datenbankzugriff
        private OraDBConnect dbcon = null;
        // Deklaration eines PageGenerator-Objektes zur Seitengenerierung
        private PageGenerator pageGen = null;
        // Deklaration eines String-Objektes zur globalen Bereitstellung des zu generierenden HTML-Codes
        private String page = null;


        // Initialsierungsoperationen des Servlets
        public void init() throws ServletException {
            try {
                // Erzeugung eines OraDBConnect-Objektes zum Datenbankzugriff
                // muß an die verwendete Datenbank angepaßt werden
                dbcon = new OraDBConnect("jdbc:oracle:thin:user/passwd@141.57.9.9:1521:IMNLehre");
                // Erzeugung eines PageGenerator-Objektes zur Seitengenerierung
                pageGen = new PageGenerator();
            }
            catch (SQLException e) {
                throw new UnavailableException(this, "Initialisierungsfehler: " + e);
            }
        }

        // Verbindungsabbau zur Datenbank bei Beendigung des Servlets
        public void destroy() {
            try {
                dbcon.OraDBClose();
            }
            catch (SQLException e) {
                // sollte nicht vorkommen
            }
        }

        // Verarbeitungsabschnitt des Servlets für Request mittels HTTP-GET-Operation
        public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException
        {
            ...
            // wird im Folgenden noch ausführlich beschrieben
        }

        //Verarbeitungsabschnitt des Servlets für Request mittels HTTP-POST-Operation
        public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException
        {
            // Ausführen des Verarbeitungsabschnitts für die GET-Operation
            doGet(request, response);
        }
    }
    
Die eigentliche Verarbeitung der Client-Anfrage erfolgt innerhalb der Methode doGet(HttpServletRequest request, HttpServletResponse response). Hierbei wird nach der Deklaration beziehungsweise Initialisierung einiger Variablen zunächst mittels der Methode getParameter(String name) der Formular-Paramter n_group_id vom Request des Client ermittelt, welcher die Gruppen-ID gid der Datenbank-Tabelle Struktur und damit einen Katalog sowie seine Anordnung in der hierarchischen Gliederung beschreibt. Sollte dieser Parameter den Wert null besitzen, so bedeutet dies, daß im Navigationsfenster eine einzige Auswahlbox, die sämtliche "Wurzel"-Katalogen zur Auswahl anbietet, dargestellt werden muß. Ansonsten wurde bereits ein Katalog ausgewählt und nun muß das bisherige Auswahlmenü rekonstruiert und gegebenenfalls eine Erweiterung um eine Auswahlbox mit allen zur gid gehörenden Unterkatalogen realisiert werden. Solche Unterkataloge müssen für die Muttergruppen-ID muttergruppe_id denselben Wert wie die aktuell betrachtete Gruppen-ID gid aufweisen. Im nachfolgenden Auszug des Quell-Codes wird die gesamte Abarbeitung dargestellt und kommentiert.

Im Quell-Code vorkommende Parameter, die mittels der Methode getParameter(String name) abgefragt werden, sind vor Aufruf des Servlets vom Client mit Hilfe von JavaScript den entsprechenden Formularfeldern zugewiesen worden. Häufig werden in den Formularen auch versteckte Felder verwendet, die zum Beispiel Aktionen bezeichnen, welche dann vom Servlets zur Fallunterscheidung verschiedener Aufrufe herangezogen werden. Dieses Vorgehen gilt im übrigen für alle hier vorkommenden Servlets.


    // Verarbeitung der Client-Anfrage
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
    {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        String selected_id = null;
        String options = "";
        // zum Abspeichern der Gruppen-ID
        String gid = null;
        // zum Abspeichern der übergeordneten Gruppen-ID
        String mgid = null;
        // Parameter für Datenbankabfrage
        String[] param1 = {"MUTTERGRUPPE_ID"};
        String[] param2 = {"GID","NAME"};
        // Parameter für SELECT-Objekt
        String[] args = {"name=\"level1\"","width=\"200\"","style=\"width:200px\"",
                         "onChange=\"changeMenu(document.frmCatalog.level1);\""};
        // dient der Entgegennahme der Ergebnismenge einer Datenbankabfrage
        Vector result = null;
        // kennzeichnet Erreichen der Blattebene einer Kataloghierarchie
        boolean stop = false;
        // Zählvariable zur Anpassung des SELECT-Box-Namens an die entsprechende Schachtelungstiefe
        int level = 1;

        try {
            // selektierten Wert der Auswahlbox abspeichern
            selected_id = request.getParameter("n_group_id");
            if (selected_id == null) selected_id = "";

            // Ebene 1 ... Ebene n-1 (0 ist die Blattebene, n-1 die Wurzelebene)
            // Gruppen-ID und Muttergruppen-ID initialisieren
            gid = selected_id;
            mgid = gid;
            // wenn bereits ein Katalog ausgewählt wurde, dann das Auswahlmenü
            // beginnend von der aktuellen Ebene bis hin zur Wurzelebene erneut 
            // aufbauen (bisheriges Menü rekonstruieren, da HTML-Seite komplett neu generiert wird)
            if (!selected_id.equals("")) {
                do {
                    // Muttergruppe ermitteln
                    result = dbcon.OraDBgetResult("SELECT muttergruppe_id FROM struktur WHERE gid=" + gid, param1, 0);
                    // wenn übergeordnete Gruppe existiert
                    if (result != null) {
                        // ID dieser übergeordneten Gruppe speichern
                        mgid = (String)result.elementAt(0);
                        // wenn nicht Wurzelebene bereits erreicht
                        if (!gid.equals(mgid)) {
                            // Aufbau anhand Muttergruppe
                            result = dbcon.OraDBgetResult("SELECT name,gid FROM struktur WHERE muttergruppe_id=" + mgid + " AND muttergruppe_id<>gid", param2, 0);
                            // Formatierung als HTML-SELECT
                            options = pageGen.formatSelect(result, args, gid, 0) + "\n" + options;
                            // Gruppen-ID für nächste Ebene neu initialisieren
                            gid = mgid;
                            // Bezeichnung des OPTION-Tags für nächste Ebene anpassen
                            level++;
                            args[0] = "name=\"level"+ level +"\"";
                            args[3] = "onChange=\"changeMenu(document.frmCatalog.level" + level + ");\"";
                        }
                        // Wurzelebene wurde erreicht, d.h. Aufbau ist abgeschlossen
                        else stop = true;
                    }
                    // übergeordnete Ebene nicht vorhanden, d.h. Aufbau ist abgeschlossen
                    else stop = true;
                // solange noch übergeordnete Ebene existiert
                } while (!stop);
            }
            // Ebene n (Wurzelebene)
            result = dbcon.OraDBgetResult("SELECT DISTINCT s.name,s.gid FROM katalog k,struktur s" + " WHERE k.aktiv=1 AND (s.typnr=1 OR s.typnr=4)", param2, 0);
            // Formatierung als HTML-SELECT
            options = pageGen.formatSelect(result, args, mgid, 0) + "\n" + options;

            // Ebene 0 aufbauen, falls Daten vorhanden (Blattebene)
            if (!selected_id.equals("")) {
                args[0] = "name=\"level0\"";
                args[3] = "onChange=\"changeMenu(document.frmCatalog.level0);\"";
                result = dbcon.OraDBgetResult("SELECT name,gid FROM struktur WHERE muttergruppe_id=" + selected_id + " AND muttergruppe_id<>gid", param2, 0);
                // Formatierung als HTML-SELECT
                options += pageGen.formatSelect(result, args, mgid, 0);
            }

            // Erzeugung der HTML-Seite
            try {
                // vorgefertigte Seite mit Platzhaltern einlesen
                // absolute Pfadangabe muß bei Verwendung angepaßt werden
                page = pageGen.readPage("/export/pub/jakarta-tomcat-4.0.3/webapps/adia/servlets/navi.html");
                // Platzhalter durch Auswahlbox(en) ersetzen
                page = pageGen.replaceParam(page,options,"@options@");
            }
            // im Fehlerfall die Fehlernachricht an Client zurückgeben
            catch (Exception e) {
                page = e.toString();
            }
        }
        // im Fehlerfall die Fehlernachricht an Client zurückgeben
        catch (SQLException e) {
            page = e.toString();
        }
        // generierte Seite an Client zurückgeben
        out.println(page);
    }
    
Die vorgefertigte HTML-Seite mit den Platzhaltern kann hier betrachtet werden.

zurück weiter