Servletproblem

Status
Nicht offen für weitere Antworten.
G

Gast1

Gast
Hai. Ich versuche aus einem Servlet mit dem Befehl "System.out.println("Datenbank-connect erfolgreich!");" eine Info in die Java-Console zu schreiben. Das will einfach nicht klappen.

Das Servlet wird aus einem Applet heraus aufgerufen und öffnet in der init-Methode eine mysql-DB. Auch die SQL-Anweisungen werden nicht ausgeführt. Durchlaufen werden alle Anweisungen, dass habe ich mit Info-Strings an das Applet zurückgeben lassen. Wenn ich den Treiber absichtlich falsch schreibe geht er zwar in den catch-Block, ab es wird nicht die Exception angezeigt. Das verstehe ich nicht.

Muss ich dem Servlet noch irgendwas erlauben. Das Applet schreibt in die Konsole und verändert auch die Daten in der DB. HILFE :shock:

Was mache ich nur falsch? :(
 

WieselAc

Top Contributor
Wie rufst du denn aus einem Applet ein Servlet auf??


Kenn mich mit Applets zwar nicht wirklich gut aus, aber mit Servlets hab ich schon einiges gemacht. Von daher kann ich dir sagen mit Servlets sind Ausgaben und Datenbankanbindungen kein Problem. Allerdings werden sie normalerweise direkt über einen request mit doGet() oder doPost() angesprochen.

Etwas Code wäre hilfreich glaub ich.
 

meez

Top Contributor
Naja, System.out schreibt halt in den stdout, was nicht unbedingt die Console sein muss...Schau halt mal, was im Startscript des Containers steht...
 
G

Gast1

Gast
Also, ich habe den Tomcat von XAMPP als Dienst unter WIN2000 installiert. Zum Testen benutze ich das Beispiel unter www.frank-buss.de/echoservlet. Selbst wenn ich an irgendeiner Stelle im Servlet ein System.out mache passiert nix.

In welcher Datei kann ich das denn nachschauen @meez?[/code]
 

thomator

Bekanntes Mitglied
wenn Du den Tomcat als Dienst laufen hast gibt es keine Konsole. Wo bitte soll er denn in die Konsole schreiben, wenn es keine gibt?
Schau mal die Dateien im Logs-Ordner durch. Die Standard-Streams werden in die Log-Dateien umgeleitet, wenn der Tomcat als Diest läuft.
 

Leroy42

Top Contributor
Gast1 hat gesagt.:
Hai. Ich versuche aus einem Servlet mit dem Befehl "System.out.println("Datenbank-connect erfolgreich!");" eine Info in die Java-Console zu schreiben. Das will einfach nicht klappen.

Mal wieder das grundsätzliche Verständnisproblem
wie ein Servlet funktioniert. :(

Ein Servlet kann überhaupt nicht in die Java Konsole schreiben.
Alles Anweisungen werden ausschließlich auf dem Server ausgeführt und
dienen nur dazu eine HTML-Seite (Bild, ...) zu generieren und dann
an den User (Browser) zu schicken.

Zu dem Zeitpunkt wo der Browser die Seite empfängt, gibt
es keinerlei Java-Code mehr, der zur Ausführung kommt.

Alles Verstanden? :lol:
 

thomator

Bekanntes Mitglied
@Leroy42
Einspruch, euer Ehren. Ein Servlet kann selbstverständlich in die Konsole schreiben. Und zwar, wenn der Servletcontainer als Applikation gestartet ist.
Das diese Konsole nichts mit dem Applet zu tun hat sei mal dahingestellt...
Aber hier war glaube ich auch nicht davon die Rede, dass das Servlet in die Konsole des Browsers schreiben soll.
 
G

Gast1

Gast
Jau, das habe ich kapiert :D (Leuchtet auch irgendwie ein :oops: ) Na, ja. Bin halt noch nicht so lange dabei. Aber warum kann das Servlet keine DB-Änderungen durchführen?

Gruß
 

Leroy42

Top Contributor
@Thomator: Dann habe ich ihn wohl falsch verstanden. :oops:

Gast1 hat gesagt.:
Jau, das habe ich kapiert :D (Leuchtet auch irgendwie ein :oops: ) Na, ja. Bin halt noch nicht so lange dabei. Aber warum kann das Servlet keine DB-Änderungen durchführen?

Gruß

:shock: Na sicher datt! DB-Zugriffe sind so ziemlich das zweitwichtigste was Servlets machen.
 

thomator

Bekanntes Mitglied
Hast Du die Log-Dateien im Tomcat mal durchgesehen? Irgendwo dort müssen die SysOuts ankomen, es sei denn, die Streams werden noch explizit umgeleitet...

Warum die DB-Änderungen nicht funzen? Für die Diagnose sind Deine Infos ein bisschen zu dürftig. Schau mal in die Logs, ob ein Fehler geworfen wird.
 
G

Gast1

Gast
NEEEEEIIIIINNNNN, ich Rindvieh.

Es war ein Syntaxfehler in meinem SQL-Code. Ich schäme mich ja so :oops:

Trotzdem vielen Dank für die Hilfe. Ich habe bestimmt bald wieder eine Frage :lol:

Gruß
 

Leroy42

Top Contributor
Gast1 hat gesagt.:
Es war ein Syntaxfehler in meinem SQL-Code. Ich schäme mich ja so :oops:

Wenn ich mich jedesmal, wenn ich solch einen Fehler produziert habe,
geschämt hätte, hätte ich mit dem Programmieren schon vor Jahren
aufhören müssen. :cool:
 
G

Gast1

Gast
Ich habe noch eine weitere kurze Frage. Passt eigentlich auch hierher und ich muss keinen neuen Thread auf machen. Und zwar geht es um das Beenden eines Servlets, wenn ich es aus einem Applet aufgerufen habe.

Ich weiß, dass der Container das Servlet mit destroy entfernt. Nun zu meiner Frage. Kann ich die Methode auch aus dem Applet aufrufen. Wenn z.B. das Applet beendet wird, möchte ich natürlich auch das Servlet beenden und aus dem Speicher nehmen. Wie mache ich das denn nun wieder.

Ist bestimmt für Euch nur eine kleine Aufgabe :D
 

thomator

Bekanntes Mitglied
Das is logisch nicht so richtig durchdacht, oder? So ein Servlet ist doch ein Service, der nicht nur einem Applet zur Verfügung stehen soll. Du startest das Servlet doch auch nicht aus dem Applet.
 
G

Gast1

Gast
So für heute meine letzter Fragenkatalog :cool:

Ich möchte mit einem PC über das www auf eine DB zugreifen. Dazu möchte ich eine Applet-Servlet-Kommunikation benutzen (oder gibt es dafür was schlaueres?). Über den PC sollen Kundendaten gepflegt werden.

Muss ich dann von jedem PC eine DB-Verbindung aufbauen oder reicht es eine über das Servlet. Das wäre doch aber nicht so schlau oder? Dann wäre ja die DB-Verbindung ständig offen. Auch wenn sich ein PC wieder abmeldet. Es ist doch richtig, dass die Init-Methode nur einmal aufgerufen wird. D.h. Wenn der erste Client auf das Applet zugreift, wird diese Methode durchlaufen. Wenn sich gleichzeitig ein zweiter Client mit dem Servlet verbindet, wird die Init-Methode doch nicht mehr aufgerufen, oder ??? :shock:

Langsam komme ich ein bischen durcheinander. Ich hoffe Ihr könnt ein Klarheit in meine vielen Probleme bringen :?

Ich werde mich morgen noch einmal melden. Es wäre super, wenn ihr dann auch wieder mit mir "sprecht".

Bis denne

Dirk
 
G

Gast1

Gast
Moin, Moin, da bin ich wieder.

Kann sich bitte mal jemand mit meinem letzten Posting beschäftigen. Langsam kommen mir Zweifel, ob für mein Vorhaben diese Vorgehensweise die richtige ist.

Danke im voraus.
 
G

Gast1

Gast
Ich noch mal. Langsam komme ich durcheinander :?

Ich möchte eigentlich das jeder Client eine eigene DB-Verbindung herstellt. Sonst würde ja bei jeder Transaktion gewartet. Diese DB-Verbindung soll, wenn das Applet beendet wird, auch wieder geschlossen werden. Kann ich das mit HttpSession lösen. Wenn ja, wie? Wenn nein, bitte zeigt mir einen anderen Weg, wie ich meine Problemstellung lösen kann.

Dirk
 

HLX

Top Contributor
Du kannst HTTP-Session verwenden. Du hängst einfach die Connection als Attribut an die Session. Dann fragst du bei Bedarf ab, ob das Attribut existiert... und natürlich ob die Connection noch offen ist :wink:
 
G

Gast1

Gast
Endlich einer, der sich um mich kümmert :wink:
So richtig, weiß ich nicht wie Du das meinst. Ich möchte die DB-Verbindung pro Client einmal öffnen und beim Appletbeenden wieder schließen. Hier mal ein Code-Ausschnitt:
Code:
public class TestServlet extends HttpServlet  {

         private Connection database = null;

         //---------------------------------------------------------------------------
         //
         // Servlet initialisieren
         //
         public void init() throws ServletException
         {
           String DBhost = "IP";
           String DBport = "3306";
           String DBname = "test";

           // Connect-String bereitstellen
           String url = "jdbc:mysql://"
                         + DBhost
                         + "/"
                         + DBname
                         + "?user=user"
                         + "&password=pw"
                         + "&autoReconnect=false";


           try
           {
              // Datenbank-Treiber initialisieren
              Class.forName("com.mysql.jdbc.Driver").newInstance();

              // Datenbankanmeldung durchführen
              database=DriverManager.getConnection(url);

              System.out.println("Datenbank-Connect erfolgreich!");
           }
           catch (Exception ex)
           {
              System.out.println("Fehler beim Öffnen der DB!\n");
              ex.printStackTrace();

           }
         }
         //---------------------------------------------------------------------------
         //
         // DB schliessen
         //
         public void dbclose()
         {
             // Nur schliessen, wenn Verbindung offen ist
             if (database != null)
             {
                 // Verbindung zur Datenbank schliessen
                 try
                 {
                     database.close();
                     database = null;
                     System.out.println("Datenbank erfolgreich geschlossen!");
                 }
                 catch (Exception dberr)
                 {
                     System.out.println("Fehler beim Schliessen der DB!\n");
                     dberr.printStackTrace();
                 }
             }
         }
        //---------------------------------------------------------------------------
        //
        // Funktion zum Empfangen aus dem Applet
        //
        public void service(HttpServletRequest request,HttpServletResponse response)
                throws ServletException, IOException
        {

                try {
                        response.setContentType("application/x-java-serialized-object");
                        // read a String-object from applet
                        // instead of a String-object, you can transmit any object, which
                        // is known to the servlet and to the applet
                        InputStream in = request.getInputStream();
                        ObjectInputStream inputFromApplet = new ObjectInputStream(in);
                        String echo = (String) inputFromApplet.readObject() ;

                        int w = Integer.parseInt(echo.substring(0,echo.indexOf(';',1)));

                        // Hier reagiere ich auf den Aufruf aus dem Applet
                        switch(w) {
                           case 1: AddDB();
                                   break;
                           case 2: ResetDB();
                                   break;
                           case 3: StartSerververbindung();
                                   break;
                           case 4: StopSerververbindung();
                                   break;
                           case 5: dws++;
                                   break;
                        }
                      
                        // echo it to the applet
                        OutputStream outstr = response.getOutputStream();
                        ObjectOutputStream oos = new ObjectOutputStream(response.getOutputStream());
                        oos.writeObject(echo);
                        oos.flush();
                        oos.close();

                } catch (Exception e) {
                        ObjectOutputStream oos = new ObjectOutputStream(response.getOutputStream());
                        oos.writeObject(e);
                        oos.flush();
                        oos.close();
                        e.printStackTrace();
                }

        }
        //---------------------------------------------------------------------------
Das ganze dient als Einarbeitung. Im Applet habe ich ein Textfeld für die Eingabe und eins für die Ausgabe zur Kontrolle. Wenn ich in der Init-Methode die DB öffne, gilt diese DB-Session doch für alle, die sich mit dem Servlet verbinden. Oder???

Was muss ich denn machen, damit jeder Client eine eigene DB-Session bekommt.

Danke für die Hilfe :D
 

HLX

Top Contributor
1. Die Init-Methode wird nur 1x beim Erzeugen des Servlets aufgerufen, nicht je Benutzer

2. Die service()-Methode sollte nicht überschrieben werden. Sie dient dazu die verschiedenen HTTP-Methoden zu unterscheiden und ruft die entsprechende Java-Methode (z.B. doGet) auf. Überschreibe doGet() und doPost().

3. Über request.getSession() kommst du an die Session des derzeitigen Benutzers des Servlets. In der Session kannst du überprüfen ob ein Attribut mit der DB-Verbindung existiert. Wenn nicht erzeuge es und setze es als Attribut an die Session.
 
G

Guest

Gast
Äh HLX, könntest Du mir bitte ein einigermaßen anschauliches Beispiel posten (kann auch im www sein), bei dem ich sehe, wie das mit der DB-Verbindung gemeint ist. Bitte nicht maulen, bin doch noch Anfänger :roll:
 

HLX

Top Contributor
Code:
public void doGet(HttpServletRequest request,HttpServletResponse response) {
    
    // schaue nach DB-Verbindung
    java.sql.Connection con = request.getSession().getAttribute("connection");
    
    // falls keine Verbindung vorhanden oder Verbindung geschlossen (Timeout...)
    if(con == null || con.isClosed()) {
        con = .... // Erzeuge DB-Verbindung
    }

    // benutze DB-Verbindung

    // speichere Verbindung an Session
    // damit sie beim nächsten Aufruf von getAttribute("connection") gefunden wird
    request.getSession.setAttribute("connection",con);
}
 
G

Gast1

Gast
Jau, dass klappt schon mal :D :D :D

Wie lange bleibt denn diese Session dem Client zu geordnet? Wenn ich den IE beende und mich wieder anmelde, habe ich eine neue. Wenn ich die Seite Seite mit dem Applet beende und dann erneut auf die Seite gehe, ohne den IE zu beenden, bleibt die Session-ID gleich. Ich überlege gerade, wie ich die DB-Session beende, wenn das Applet beendet wird.
 
G

Gast1

Gast
Und noch was. Wie kann ich sicherstellen, dass wenn das Servlet entladen (destroy) wird, alle zu den Session-ID's gehörenden DB-Connects geschlossen werden? Kann ich alle Sessions durchlaufen?
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben