# Servlet problem



## harrycoder (6. Dez 2006)

Hi Leute, wahrscheinlich stelle ich mich ziemlich dumm an aber das liegt daran das ich noch nie ein Servlet gebaut habe, bis jetzt.

Und zwar geht es um Folgendes... Mein Servlet baut mit Hilfe auf der Startseite anzugebender Parameter (URL, Benutzername, Password) einen DB Pool auf. Das geht auch alles. Ich möchte allerdings gerne das man erst mit einer Datenbank arbeitet und dann über erneuten Aufruf der Startseite ne neue Verbindung (Pool) mit ner anderen DB (also andere Parameter(URL o. Username o. Password) herstellen kann. Und das krieg ich nich hin, jetzt im Moment ist es so das ich sobald ich mich einmal an einer DB erfolgreich angemeldet habe nicht mehr an einer anderen anmelden kann solange ich Tomcat nicht neustarte...

Liegt das an Cookies oder gespeicherter Session oder woran ? Also ich bin am verzweifeln, is zwar bestimmt irgendwas einfaches aber ich komm nich drauf 

Zur Verdeutlichung, nach einem erfolgreichen DB Login ist es momentan egal was ich dann bei weiteren Aufrufen der Startseite für Parameter (sogar falsche Logindaten werden ignoriert) angebe, er benutzt einfach weiter die bereits hergestellte verbindung, und das is genau mein Problem...

Bitte helft mir... ein Hinweis auf ne Servlet Funktion die das Problem löst hilft mir vielleicht auch schon.

Vielen Dank

MfG

Harald


----------



## SlaterB (6. Dez 2006)

hmm, benutzt du denn da allgemeine Tomcat-Funktionen oder doch eher selbsterstelle Logik?
hast du bisschen Code dazu?


----------



## harrycoder (6. Dez 2006)

```
package hall;

import db.DBConnect;
import db.DBConnectPool;

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

import output.Index;
import output.Webdata;
import output.HTMLTable;
import output.Initerror;

public class ConnectionDetails extends HttpServlet {
    public PrintWriter out;
    Vector vec;
    private DBConnectPool dbcp;
    Webdata web;
    private static boolean DEBUG = true;
    public static Properties properties;


    public void init(ServletConfig config) throws ServletException {
    super.init(config);
    //dbcp = new DBConnectPool(Index.DBDriver,Index.DBUrl,Index.DBUser,Index.DBPasswd, this);
        }


    public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
      throws ServletException, IOException {
    doPost(request, response);
    }

  public void doPost(HttpServletRequest request,
                     HttpServletResponse response)
      throws ServletException, IOException {
// extract the extra path info

      String anExtraPath,
             aRemoteAddr,
             aRemoteHost;
      anExtraPath = request.getPathInfo();
      aRemoteAddr = request.getRemoteAddr();
      aRemoteHost = request.getRemoteHost();
      System.out.println(this.getServletContext().getServletContextName());
      if (DEBUG) {
        log("doPost: extra path     = " + anExtraPath);
        log("doPost: remote address = " + aRemoteAddr);
        log("doPost: remote host    = " + aRemoteHost);
      }
    response.setHeader("Expires","Thu, 01 Dec 1994 16:00:00 GMT");
    response.setContentType("text/html");
    out = response.getWriter();
          try {
      dbcp = new DBConnectPool(Index.DBDriver,Index.DBUrl,Index.DBUser,Index.DBPasswd, this);
      }
      catch (NullPointerException ex) {
          new Initerror(this);
      }
    if (anExtraPath == null) {showSelect(request, response);}
    else if (anExtraPath.equals("/show")) {
        showTable(request, response); }
    else {
        if (DEBUG) log("doPost: unknown extra path");
        sendErrorPage(response, "Unknown Extra Path", "Unknown Extra Path");
     }
  }

    public void showTable(HttpServletRequest request, HttpServletResponse response) {
      String tabelle = null;
      tabelle = request.getParameter("tabellen");
      if (tabelle == null) { showSelect(request, response); }
      else {
      DBConnect aDBConnect = DBConnectPool.getInstance();
      aDBConnect.executeQuery("Select * from "+tabelle);
      HTMLTable tableout = new HTMLTable(this,aDBConnect);
      // release the database connection:
      DBConnectPool.putInstance(aDBConnect);
      }
    }
    public void showSelect(HttpServletRequest request, HttpServletResponse response) {
        DBConnect aDBConnect = DBConnectPool.getInstance();
        web = new Webdata(this,aDBConnect);
        DBConnectPool.putInstance(aDBConnect);
    }

    public void sendErrorPage(HttpServletResponse response, String title, String message) {
      sendPage(response, "Fehler: "+title, "Fehler: "+message);
    }

    public void sendPage(HttpServletResponse response, String title, String message) {
      if (DEBUG) log("sendPage: " + title + " " + message);

      try {
        PrintWriter _anOut = response.getWriter();

        _anOut.println("<html>");
        _anOut.println("<head><title>" + title + "</title></head>");
        _anOut.println("<body bgcolor=\"#FFFFFF\">");
        _anOut.println("<center>");
        _anOut.println("<font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"4\">");
        _anOut.println("

" + message + "

");
        _anOut.println("</font>");
        _anOut.println("</center>");
        _anOut.println("<hr noshade>");
        _anOut.println("<font face=\"Verdana, Arial,Helvetica, sans-serif\" size=\"-1\">");
        _anOut.println("<a href=\"mailto:xxx\">xxx</a></font>");
        _anOut.println("</body>");
        _anOut.println("</html>");
        _anOut.close();

      } catch (IOException e) {
        log("sendPage: Error writing reponse " + e.getMessage());
      }
    }
}
```

Das is die Klasse in der das DBConnectPool Objekt erzeugt wird... habe natürlich noch weitaus mehr aber alle hier zu zeigen sprengt glaub ich den Rahmen ... Sind fast alle eh nur zur HTML ausgabe. Und halt die 2 Klassen für die DB Verbindung, aber das Problem is ja das Servlet. Wenn du noch mehr brauchst sag Bescheid dann zeig ich dir auch noch den Rest, aber das hier is halt die "Haupt" Servlet Klasse.


----------



## padde479 (7. Dez 2006)

Kleiner Tipp: niemals, wirklich niemals eine HTML-Ausgabe in ein Servlet schreiben! Dafür gibt es die JavaServer Pages! Sowas machen nur Autoren in ihren Büchern. Die Servlets dienen nur der Verarbeitung. Für das Anzeigen von Daten etc. sind die Servlets zuständig.


----------



## SlaterB (7. Dez 2006)

ich brauch nicht mehr, ich kann das ganze eh nicht selber ausprobieren,
sondern dich nur darauf hinweisen, dass du da anscheinend sowas wie 
dbcp = new DBConnectPool(Index.DBDriver,Index.DBUrl,Index.DBUser,Index.DBPasswd, this);

machst,
wird das auch beim Wechsel auf die andere DB gemacht, oder wie oder was oder warum?
was passiert da, was nicht usw., das muss man doch alles irgendwie prüfen können,

---

in showTable() verwendest du
DBConnect aDBConnect = DBConnectPool.getInstance(); 

das sieht ja nach einer statischen Operation aus,
musst du nicht irgendwas mit dem Pool
private DBConnectPool dbcp; 
machen?


----------



## HLX (7. Dez 2006)

Sehr verwirrend! Du erzeugst bei jedem Request einen neuen ConnectionPool? Täte es nicht auch eine Connection, die du dann in deinen Pool schiebst? 

Die Variable dbcp wird nie verwendet. Überprüf das nochmal. Falls es nicht weiterhilft, dann stell hier auch mal den Code deines Pools rein. Für mich vermischen sich hier die Begriffe Pool und Connection zu sehr.


----------



## harrycoder (7. Dez 2006)

HLX hat gesagt.:
			
		

> Sehr verwirrend! Du erzeugst bei jedem Request einen neuen ConnectionPool? Täte es nicht auch eine Connection, die du dann in deinen Pool schiebst?
> 
> Die Variable dbcp wird nie verwendet. Überprüf das nochmal. Falls es nicht weiterhilft, dann stell hier auch mal den Code deines Pools rein. Für mich vermischen sich hier die Begriffe Pool und Connection zu sehr.



Na ja ich meine nicht, denn das ist ja genau das Problem, man soll ja bei Aufruf der Startseite eine neue Verbindung (neuen Pool) herstellen können, sonst benutze ich doch jedes mal das instanzierte dbcp objekt und der pool hält ja nur die bereits hergestellte Verbindung,  und erstellt gegebenenfalls mehr davon.  Allerdings nicht unter berücksichtigung der neuen Parameter, und genau das ist das Problem... also muss dieses Objekt zumindest unter der Bedingung das man die Startseite erneut aufruft abermals (mit anderen Parametern) erzeugt werden...

Der Pool macht eigentlich nichts anderes als die Anzahl der Verbindungen zu regulieren um Engpässe zu vermeiden.

Also ich bin mir nich sicher aber ich glaube eher das das ein Lifecycle Problem des Servlets ist.
Ich weiss nich wie aber rein von der Logik her würde ich sagen das der vorhandene ConnectionPool bei Aufruf der Startseite "zerstört" werden muss und dann auch wieder ein neuer erzeugt werden kann, tja nur die Umsetzung macht mir Kopfschmerzen...




Danke für den Hinweis mit HTML, das is ja kein Problem den code schmeiss ich dann woanders rein


----------



## harrycoder (7. Dez 2006)

SlaterB hat gesagt.:
			
		

> ich brauch nicht mehr, ich kann das ganze eh nicht selber ausprobieren,
> sondern dich nur darauf hinweisen, dass du da anscheinend sowas wie
> dbcp = new DBConnectPool(Index.DBDriver,Index.DBUrl,Index.DBUser,Index.DBPasswd, this);
> 
> ...



Ehm, na ja also du hast ein Formular auf dem du Benutzername, Password, URL angeben kannst. Sobald du die "abschickst" (submit) wird das Servlet aufgerufen und die im Formular angegebenen Parameter (siehe Code) an die Variablen übergeben mit denen dann der ConnectionPool instanziert wird. 

Beim ersten Mal funktioniert das ganze wunderbar. Bei Wiederholung allerdings nicht mehr, da werden dann halt die Formulare durchlaufen, das Servlet aufgerufen usw. allerdings passiert mit dem ConnectionPool rein gar nichts, der bleibt halt einfach so wie er is...


----------



## SlaterB (7. Dez 2006)

das hast du alles schon erzählt, es fällt aber (bisher) noch niemanden die Lösung aus dem nichts ein,

ich meinte dass du bisschen untersuchen sollst was da so los ist,
z.B. Ausgaben wie
System.out.println("setze Connection-Pool nun auf xy");

System.out.println("rufe nun Connection aus Connection-Pool xy auf, ansgeschlosse DB ist: yz");


usw, schau nach was dein Programm tut!

------

den von zwei Leuten erwähnten Hinweis
'private DBConnectPool dbcp; wird anscheinend nirgendwo verwendet'
willst du nicht kommentieren?


----------



## Guest (7. Dez 2006)

SlaterB hat gesagt.:
			
		

> das hast du alles schon erzählt, es fällt aber (bisher) noch niemanden die Lösung aus dem nichts ein,
> 
> ich meinte dass du bisschen untersuchen sollst was da so los ist,
> z.B. Ausgaben wie
> ...



Eh klar, da habt ihr natürlich Recht.

Es muss natürlich dbcp.getInstance() und putInstance() heissen, sorry.

Allerdings behebt das das Problem nicht


----------



## SlaterB (7. Dez 2006)

wenn getInstance() eine statische Operation ist, 
dann ändern ein Aufruf am Objekt gar nix, dann wird immer noch die statische Operation gerufen 

ich kann DBConnectPool bei google nicht finden,
ist das eine eigene Klasse von dir?
dann interessiert der Quellcode von getInstance() aber sowas von brennend


----------

