Vollständiger Quell-Code für das Servlet "Product"


/****************************************************************************************
 *  Klasse zur Generierung der HTML-Seite mit den Detailinformationen eines Produktes   *
 *                                                                                      *
 ****************************************************************************************/

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


public class Product extends HttpServlet {

    private OraDBConnect dbcon = null;

    private PageGenerator pageGen = null;

    private String page = null;

    // globaler Fehlercode
    private String error = null;

    // globale Fehlervariable
    private boolean noError = true;

    /************************************************************************************
     *  Initialisierungsabschnitt des Servlets                                          *
     *                                                                                  *
     *  - Verbindungsaufbau zur Datenbank                                               *
     *  - Erzeugung des Objekts zur Generierung der dynamischen HTML-Seiten             *
     ************************************************************************************/
    public void init() throws ServletException {
        try {
            dbcon = new OraDBConnect("jdbc:oracle:thin:user/passwd@141.57.9.9:1521:IMNLehre");
            pageGen = new PageGenerator();
        }
        catch (SQLException e) {
            throw new UnavailableException(this, "Initialisierungsfehler: " + e);
        }
    }

    /************************************************************************************
     *  Beendigungsabschnitt des Servlets                                               *
     *                                                                                  *
     *  - Verbindungsabbau zur Datenbank                                                *
     ************************************************************************************/
    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
    {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        String pictures = "";
        String[] groupPath = {"","",""};
        Vector product = new Vector();
        int pos = 0;
        int cnt = 0;
        String button_left = null;
        String button_right = null;

        noError = true;
        // Parameter "n_group_id" der Navigationsseite abfragen
        String group_id = request.getParameter("n_group_id");
        if (group_id == null) {
            // Parameter "p_group_id" der Produktseite abfragen
            group_id = request.getParameter("p_group_id");
            if (group_id == null) group_id = "";
        }
        // Parameter "n_searchtext" der Navigationsseite abfragen
        String searchtext = request.getParameter("n_searchtext");
        if (searchtext == null) {
            // Parameter "p_searchtext" der Produktseite abfragen
            searchtext = request.getParameter("p_searchtext");
            if (searchtext == null) searchtext = "";
        }
        // Parameter "p_product_id" der Produktseite abfragen
        String product_id = request.getParameter("p_product_id");
        if (product_id == null) product_id = "";
        // Parameter "p_direction" der Produktseite abfragen
        String direction = request.getParameter("p_direction");
        if (direction == null) direction = "0";

        // Produktdaten ermitteln
        product = getProduct(product_id, group_id, searchtext, Integer.parseInt(direction));
        if (noError) {
            if (product != null) {
                if (product.size() > 1) {
                    // Produkt-ID des aktuellen Produktes merken
                    product_id = (String)product.elementAt(0);
                    // Gruppen-ID des aktuellen Produktes merken
                    group_id = (String)product.elementAt(8);
                    // Bilder zum Produkt ermitteln
                    pictures = getPicture(product_id);
                }
                else {
                    product_id = "";
                }
            }
            else product_id = "";

            if (noError) {
                // Kopfzeile der Produktseite generieren
                groupPath = getGroupPath(group_id);
                if (noError) {
                    if (groupPath != null) {
                        // wenn Anfrage über Suchfeld vorliegt
                        if (!searchtext.equals("")) {
                            groupPath[0] = "Ergebnis der Suchanfrage";
                        }
                    }

                    // Navigationsschaltflächen der Produktseite bzgl. Datensatzposition generieren
                    if (product != null) {
                        if (product.size() > 1) {
                            pos = Integer.parseInt((String)product.elementAt(11)) + 1;
                            cnt = Integer.parseInt((String)product.elementAt(10));
                        }
                        else cnt = 0;
                    }
                    else cnt = 0;
                    if (cnt == 0) pos = cnt;
                    // Schaltfläche "zurück"
                    button_left = "src=\"../images/arrow_left.jpg\"";
                    if (pos > 1) {
                        button_left = "<INPUT name=\"prev\" type=image " + button_left + " onClick=\"setDirection(document.frmProduct.prev.value);\">";
                    }
                    else {
                        button_left = "<IMG " + button_left + ">";
                    }
                    // Schaltfläche "weiter"
                    button_right = "src=\"../images/arrow_right.jpg\"";
                    if (pos < cnt) {
                        button_right = "<INPUT name=\"next\" type=image " + button_right + " onClick=\"setDirection(document.frmProduct.next.value);\">";
                    }
                    else {
                        button_right = "<IMG " + button_right + ">";
                    }
                }
            }
        }

        // Erzeugung und Ausgabe der HTML-Seite
        try {
            if (noError) {
                page = pageGen.readPage("/export/pub/jakarta-tomcat-4.0.3/webapps/adia/servlets/product.html");
                page = pageGen.replaceParam(page,groupPath[0],"@group@");
                page = pageGen.replaceParam(page,groupPath[1],"@path@");
                page = pageGen.replaceParam(page,groupPath[2],"@catalog_id@");
                if (product != null) {
                    if (product.size() > 0) {
                        page = pageGen.replaceParam(page,(String)product.elementAt(1),"@pname@");
                        page = pageGen.replaceParam(page,(String)product.elementAt(9) + " " + (String)product.elementAt(5),"@price@");
                        page = pageGen.replaceParam(page,(String)product.elementAt(2),"@description@");
                        page = pageGen.replaceParam(page,(String)product.elementAt(7),"@articlenr@");
                        page = pageGen.replaceParam(page,(String)product.elementAt(3),"@item@");
                        page = pageGen.replaceParam(page,(String)product.elementAt(4),"@itemprice@");
                        page = pageGen.replaceParam(page,(String)product.elementAt(6),"@producer_id@");
                    }
                }
                else {
                    page = pageGen.replaceParam(page,"","@pname@");
                    page = pageGen.replaceParam(page,"","@price@");
                    page = pageGen.replaceParam(page,"","@description@");
                    page = pageGen.replaceParam(page,"","@articlenr@");
                    page = pageGen.replaceParam(page,"","@item@");
                    page = pageGen.replaceParam(page,"","@itemprice@");
                    page = pageGen.replaceParam(page,"","@producer_id@");
                }
                page = pageGen.replaceParam(page,pictures,"@picture@");
                page = pageGen.replaceParam(page,product_id,"@product_id@");
                page = pageGen.replaceParam(page,group_id,"@group_id@");
                page = pageGen.replaceParam(page,searchtext,"@searchtext@");
                page = pageGen.replaceParam(page,button_left,"@button_left@");
                page = pageGen.replaceParam(page,button_right,"@button_right@");
                page = pageGen.replaceParam(page,String.valueOf(pos),"@position@");
                page = pageGen.replaceParam(page,String.valueOf(cnt),"@count@");
            }
            else {
                page = pageGen.readPage("/export/pub/jakarta-tomcat-4.0.3/webapps/adia/servlets/error.html");
                page = pageGen.replaceParam(page,error,"@error@");
            }
        }
        catch (Exception e) {
            page = e.toString();
        }
        out.println(page);
    }

    /************************************************************************************
     *  Verarbeitungsabschnitt des Servlets für Request mittels HTTP-POST-Operation     *
     *                                                                                  *
     ************************************************************************************/
    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
    {
        doGet(request, response);
    }

    /************************************************************************************
     *  Produktpfad und Untergruppe anhand der Gruppen-ID ermitteln                     *
     *                                                                                  *
     *  @group_id : Gruppen-ID des aktuellen Produktes                                  *
     *  @groupPath: 1. Eintrag -> Gruppe/Untergruppe; 2. Eintrag -> Produktpfad         *
     ************************************************************************************/
    private String[] getGroupPath(String group_id) {
        String[] groupPath = {"","",""};
        String tmp_id = group_id;
        String arrow = "";
        int typnr = 0;
        // Pfad zur Wurzel hin verfolgen und Abspeichern sowie untersten Gruppennamen merken
        if (!group_id.equals("")) {
            try {
                do {
                    String[] param = {"NAME","MUTTERGRUPPE_ID","TYPNR","CID"};
                    Vector result = dbcon.OraDBgetResult("SELECT name,muttergruppe_id,typnr,cid FROM struktur WHERE gid=" + tmp_id, param, 0);
                    if (result != null) {
                        tmp_id = (String)result.elementAt(1);
                        typnr = Integer.parseInt((String)result.elementAt(2));
                        if (typnr != 1 && typnr != 4) arrow = " > "; else arrow = "";
                        groupPath[1] = arrow + "<U>" + (String)result.elementAt(0) + "</U>" + groupPath[1];
                        if (groupPath[0].equals("")) {
                            groupPath[0] = (String)result.elementAt(0);
                            groupPath[2] = (String)result.elementAt(3);
                        }
                    }
                    else {
                        typnr = 0;
                    }
                } while (typnr != 0 && typnr != 1 && typnr != 4);   // Abbruch, wenn Wurzel erreicht ist
            }
            catch (SQLException e) {
                noError = false;
                groupPath = null;
                error = e.toString();
            }
        }
        return groupPath;
    }

    /************************************************************************************
     *  Produktdaten des aktuellen Produktes ermitteln und darstellen                   *
     *                                                                                  *
     *  @product_id: Produkt-ID des aktuellen Produktes                                 *
     *  @group_id  : Gruppen-ID des aktuellen Produktes                                 *
     *  @searchtext: Teil-Zeichenfolge im Produktnamen                                  *
     *  @direction : nächstes(1)/voriges(!=1) Produkt anzeigen                          *
     *  @products  : 1. Eintrag -> Produkt-ID;                                          *
     *               2. Eintrag -> Produktbezeichnung                                   *
     *               3. Eintrag -> Produktbeschreibung                                  *
     *               4. Eintrag -> Einheit                                              *
     *               5. Eintrag -> Einheiten pro Preis                                  *
     *               6. Eintrag -> Währung                                              *
     *               7. Eintrag -> Händler-ID                                           *
     *               8. Eintrag -> händerspezifische Artikelnummer                      *
     *               9. Eintrag -> Gruppen-ID                                           *
     *               10. Eintrag -> Preis                                               *
     *               11. Eintrag -> Gesamtanzahl der Produkte dieser Gruppe/Suchanfrage *
     *               12. Eintrag -> aktuelle Produktposition                            *
     ************************************************************************************/
    private Vector getProduct(String product_id, String group_id, String searchtext, int direction) {
        Vector products = new Vector();
        Vector tmp = new Vector();
        String query1 = "";
        String query2 = "";
        String query3 = "";

        try {
            String[] param1 = {"PID","BEZEICHNUNG","BESCHREIBUNG","EINHEIT","PREIS_EINHEIT","WAEHRUNG","HID","HPNR","GID","PREIS"};
            String[] param2 = {"CNT"};

            // Abfrage zum Produkt entsprechend Benutzereingabe generieren
            if (product_id.equals("")) {  // erste Abfrage für eine Produktgruppe oder Suchabfrage
                if (searchtext.equals("")) {
                    // erstes Produkte des Gesamtbestandes
                    if (group_id.equals("")) {
                        query1 = "SELECT p.*, j.gid, j.preis FROM produkt p, join_g_p j WHERE p.pid=j.pid AND ORDER BY p.pid";
                    }
                    // erstes Produkt einer Gruppe/Untergruppe
                    else {
                        query1 = "SELECT p.*, j.gid, j.preis FROM produkt p, join_g_p j WHERE p.pid=j.pid AND j.gid=" + group_id + "  ORDER BY p.pid";
                    }
                }
                // erstes Produkt entspr. Suchanfrage
                else {
                    query1 = "SELECT p.*, j.gid, j.preis FROM produkt p, join_g_p j WHERE p.pid=j.pid AND UPPER(p.bezeichnung) LIKE UPPER('%" + searchtext + "%')  ORDER BY p.pid";
                }
            }
            else {         // nächstes/voriges Produkt
                if (searchtext.equals("")) {
                    if (group_id.equals("")) {
                        // nächstes Produkte des Gesamtbestandes
                        if (direction == 1) {
                            query1 = "SELECT p.*, j.gid, j.preis FROM produkt p, join_g_p j WHERE p.pid=j.pid AND j.pid>" + product_id + "  ORDER BY p.pid";
                        }
                        // voriges Produkte des Gesamtbestandes
                        else {
                            query1 = "SELECT p.*, j.gid, j.preis FROM produkt p, join_g_p j WHERE p.pid=j.pid AND j.pid<" + product_id + "  ORDER BY p.pid DESC";
                        }
                    }
                    else {
                        // nächstes Produkt einer Gruppe/Untergruppe
                        if (direction == 1) {
                            query1 = "SELECT p.*, j.gid, j.preis FROM produkt p, join_g_p j WHERE p.pid=j.pid AND j.gid=" + group_id + " AND j.pid>" + product_id + "  ORDER BY p.pid";
                        }
                        // voriges Produkt einer Gruppe/Untergruppe
                        else {
                            query1 = "SELECT p.*, j.gid, j.preis FROM produkt p, join_g_p j WHERE p.pid=j.pid AND j.gid=" + group_id + " AND j.pid<" + product_id + "  ORDER BY p.pid DESC";
                        }
                    }
                }
                else {
                    // nächstes Produkt entspr. Suchanfrage
                    if (direction == 1) {
                        query1 = "SELECT p.*, j.gid, j.preis FROM produkt p, join_g_p j WHERE p.pid=j.pid AND UPPER(p.bezeichnung) LIKE UPPER('%" + searchtext + "%') AND j.pid>" + product_id + "  ORDER BY p.pid";
                    }
                    // voriges Produkt entspr. Suchanfrage
                    else {
                        query1 = "SELECT p.*, j.gid, j.preis FROM produkt p, join_g_p j WHERE p.pid=j.pid AND UPPER(p.bezeichnung) LIKE UPPER('%" + searchtext + "%') AND j.pid<" + product_id + "  ORDER BY p.pid DESC";
                    }
                }
            }
            // Abfragen zum Zählen der Datensätze und der aktuellen Datensatznummer generieren
            if (searchtext.equals("")) {
                if (group_id.equals("")) {
                    query2 = "SELECT COUNT(pid) cnt FROM produkt";
                    query3 = "SELECT COUNT(pid) cnt FROM produkt WHERE pid<";
                }
                else {
                    query2 = "SELECT COUNT(j.pid) cnt FROM produkt p, join_g_p j WHERE p.pid=j.pid AND j.gid=" + group_id;
                    query3 = "SELECT COUNT(j.pid) cnt FROM produkt p, join_g_p j WHERE p.pid=j.pid AND j.gid=" + group_id + " AND j.pid<";
                }
            }
            else {
                query2 = "SELECT COUNT(pid) cnt FROM produkt WHERE UPPER(bezeichnung) LIKE UPPER('%" + searchtext + "%')";
                query3 = "SELECT COUNT(pid) cnt FROM produkt WHERE UPPER(bezeichnung) LIKE UPPER('%" + searchtext + "%') AND pid<";
            }
            // Abfragen ausführen
            products = dbcon.OraDBgetResult(query1, param1, 1);
            if (products != null) {
                tmp = dbcon.OraDBgetResult(query2, param2, 1);
                if (tmp != null) {
                    products.addElement(tmp.elementAt(0));
                    if (!((String)products.elementAt(0)).equals("")) {
                        query3 += (String)products.elementAt(0); // aktuelle Produkt-ID hinzufügen
                        tmp = dbcon.OraDBgetResult(query3, param2, 1);
                        if (tmp != null) {
                            products.addElement(tmp.elementAt(0));
                        }
                        else products.addElement("0");
                    }
                    else products.addElement("0");
                }
            }
        }
        catch (SQLException e) {
            noError = false;
            products = null;
            error = e.toString();  // Fehlercode
        }

        return products;
    }

    /************************************************************************************
     *  Bilder eines Produktes ermitteln und tabellarisch im HTML-Format zurückgeben    *
     *                                                                                  *
     *  @product_id : Produkt-ID des aktuellen Produktes                                *
     ************************************************************************************/
    private String getPicture(String product_id) {
        Vector pictures = new Vector();
        Vector tmp = new Vector();
        String result = "";

        try {
            String[] param1 = {"QUELLE"};
            tmp = dbcon.OraDBgetResult("SELECT quelle FROM bilder WHERE pid=" + product_id, param1, 0);
            // falls kein Bild vorhanden ist
            if (tmp == null) {
                pictures.addElement("../images/no_pic.jpg");
            }
            else {
                pictures = tmp;
            }
            // Ergebnismenge ins HTML-Tabellenformat umwandeln
            String[] param2 = {"","","<IMG src=\"","\" width=300>"};
            result = pageGen.formatTable(pictures, 1, param2);
        }
        catch (SQLException e) {
            noError = false;
            error = e.toString();
            result = null;
        }
        return result;
    }
}