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.
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.