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;
}
}