# Datenbankabfrage mit Applet



## schlaubi (20. Feb 2009)

Hallo liebe Javagemeinde,

kleines Vorwort:

Ich habe mich 2005 näher mit Java beschäftigt und war eigentlich auch schon recht fit was einfach Sachen anging. Damals habe ich allerdings alles nur als Applikation laufen lassen. Wie ich jetzt merke, ist in den 4 Jahren, die ich garnichts mit Java gemacht habe sehr viel verloren gegangen.

nun zu meinem Problem:

Ich möchte ein Applet machen, mit dem ich nach Eingabe von Username und Passwort auf eine MySql Datenbank zugreifen kann um dort entsprechende Abfragen zu starten. Das eigentliche Applet mit den Eingabefeldern und dem Eventhandler ist auch kein Problem. Mein Problem ist die Verbindung zu Datenbank und die daraus resultierende Abfrage.

Ich habe also in mein Applet folgendes eingebaut:

[HIGHLIGHT="Java"]       public static synchronized Connection holeVerbindung(String RechnerName,String dbName,String userName, String passwort)
        throws Exception {
            System.out.println("methode hole verbindung");
            if (dieConnection == null) {
                Class.forName( "org.gjt.mm.mysql.Driver" );
                String  connectionURL ="jdbc:mysql://localhost:3306/"+dbName;
                System.out.println("connection url");
                Connection result = DriverManager.getConnection(connectionURL, userName, passwort);
                System.out.println("connection result");
                return result;
            } else {
                Connection conn = dieConnection;
                dieConnection = null;
                return conn;
            }
        }[/HIGHLIGHT]


Wenn ich nun auf die Methode zugreife bekommen ich die Meldung:



> Exception in thread "AWT-EventQueue-1" java.lang.ClassFormatError: Duplicate method name&signature in class file com/mysql/jdbc/Connection
> at java.lang.ClassLoader.defineClass1(Native Method)
> at java.lang.ClassLoader.defineClass(Unknown Source)
> at java.security.SecureClassLoader.defineClass(Unknown Source)
> ...



Viele von euch werden jetzt vieleicht sagen, "ist doch alles klar, der Fehler steht doch da". Ich habe aber irgendwie ein Brett vor´m Kopf. Für einen Tip oder eine einfachere Möglichkeit zum Ziel zu kommen, wäre ich sehr dankbar.


----------



## L-ectron-X (21. Feb 2009)

Kompiliere mal dein gesamtes Projekt neu. Hilft das?


----------



## schlaubi (21. Feb 2009)

hi, leider nein. beim ablauf wird das programm bis einschließlich

String  connectionURL ="jdbc:mysql://localhost:3306/"+dbName;

alles abgearbeitet und beim nächsten Punkt tritt der Fehler auf. Habe schon gedacht, dass es an der Nichterreichbarkeit der DB liegt aber dann sollte normal eine andere Meldung kommen.


----------



## L-ectron-X (21. Feb 2009)

Wie heißt denn deine Klasse, in der du diese Methode definiert hast?


----------



## Gast2 (22. Feb 2009)

Moin,



schlaubi hat gesagt.:


> String  connectionURL ="jdbc:mysql://localhost:3306/"+dbName;



wenn Du versuchst mit dem Applet auf die lokalen DB zuzugreifen wird das nicht funktionieren ... ein Applet darf nur eine Netzwerkkommunikation zum Server herstellen ... wenn Du genau das möchtest ist localhost die falsche Server-Adresse ... mal abgesehen davon lausch der MySQL-Server ebenfalls nur auf localhost ... Du musst ihm also in der Config noch beibringen auf 0.0.0.0 bzw. einer anderen IP zu lauschen.


----------



## L-ectron-X (22. Feb 2009)

schlaubi hat gesagt.:


> wenn Du genau das möchtest ist _localhost_ die falsche Server-Adresse ...


Nicht, wenn er bspw. einen Apache auf seiner Kiste laufen hat.



schlaubi hat gesagt.:


> mal abgesehen davon lausch der MySQL-Server ebenfalls nur auf _localhost_ ...


Wird das nicht mit der Portnummer unterschieden?


----------



## Gast2 (22. Feb 2009)

Moin,



L-ectron-X hat gesagt.:


> Nicht, wenn er bspw. einen Apache auf seiner Kiste laufen hat.


wenn er auf 192.168.0.3 den Apache hat und sich vom dem das Applet ausliefern lässt ... darf das Applet nur 192.168.0.3 via Netzwerk zugreifen ... es ist quasi egal ob Apache oder welcher Server auch immer ... will er immer auf die lokale Datenbank zugreifen, dann machen sich MySQL-Tools besser 



> Wird das nicht mit der Portnummer unterschieden?


nicht das ich wüsste ... die Portnummer ist 3306 ... auf meinem Root-Server musste ich ihm erstmal sagen "nimm 0.0.0.0" und mit der Firewall alles aus dem Internet blocken (Rest läuft via OpenVPN)

hand, mogel


----------



## schlaubi (23. Feb 2009)

hallo,

danke für die Antworten.

Die Klasse heitß im moment einfach nur Test. Es ist so, dass das ganze im Endergebnis auf einer Linux Maschine liegt, auf welcher dann auch ein Apache läuft.

@mogel, ich kann dir nicht ganz folgen. Du meinst ich soll nicht localhost angeben sondern die volle IP? Was meinst Du mit einem MySql Tool - phpmyadmin o.ä.? Die Datenbankabfragen sollen ja aus dem Programm heraus geschehen.


----------



## Gast2 (23. Feb 2009)

Moin,

wenn Du jetzt 2 Rechner hast ... Server (Datenbank/Apache/Applet) und Client (Browser/Java) ... wirst Du vom Client aus nicht auf die DB zugreifen können wenn Du dem Applet sagst das die DB auf 'localhost' liegt ... macht sie ja nicht ... liegt die DB doch auf 'localhost' - dann versuch mal Dein Glück mit dem MySQL GUI Tools

ansonsten poste mal bitte Deine Server/Client Konstallation

hand, mogel


----------



## Ebenius (24. Feb 2009)

mogel hat gesagt.:


> wenn Du versuchst mit dem Applet auf die lokalen DB zuzugreifen wird das nicht funktionieren ... ein Applet darf nur eine Netzwerkkommunikation zum Server herstellen ...


Wollte nur mal noch erwähnen, dass signierte Applets in der Regel zu jedem Host Netzwerkverbindungen öffnen können.

Ebenius


----------



## L-ectron-X (24. Feb 2009)

Normalerweise muss das Applet auch beim Einsatz mit einer Datenbank signiert werden, meines Wissens gehts auch gar nicht anders.


----------



## schlaubi (25. Feb 2009)

Hallo und Danke für die Anmerkungen.

Ich gebe mal mehr Informationen preis . Es soll ein kleines Applet werden mit dem ich auf eine Datenbank zugreifen kann ( über login mit user id und Passwort) um mir dann gespeicherte Informationen abzurufen. Im Moment sieht meine Klasse wie folgt aus:

[HIGHLIGHT="Java"]import java.awt.*;
import java.applet.*;
import java.awt.Button;
import java.awt.Graphics;
import java.awt.Font;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.sql.Connection;
import java.sql.DriverManager;

public class  Test extends Applet {

    public static  Connection dieConnection=null;
        String dbName = "konsole";
        String dbPasswort = "konsole";
        String userName = "konsole";
        String RechnerName = "localhost";

        Label labSuche1, labSuche2, labSuche3;
        Label labText1, labText2;

        TextField tfId, tfPasswort, tfPlz;

        Button bInfo, bAbbrechen, bLogin;

        TextArea taInfo;

        Font fntFett, fntHead, fntAusgabe;

        public void init(){
            setLayout(null);

            fntFett = new Font("SansSerif", 1, 14);
            fntHead = new Font("SansSerif", 1, 20);
            fntAusgabe = new Font("Monospaced",0, 12);

            labText1 = new Label ("Datenbankzugriff");
            labText1.setBounds(20,25,600,25);
            labText1.setFont(fntHead);
            add(labText1);

            labText2 = new Label ("");
            labText2.setBounds(20,70,80,25);
            labText2.setFont(fntFett);
            add(labText2);

            labSuche1 = new Label("ID");
            labSuche1.setBounds(100,70,200,25);
            labSuche1.setFont(fntHead);
            add(labSuche1);

            labSuche2 = new Label ("Passwort");
            labSuche2.setBounds(350,70,100,25);
            labSuche2.setFont(fntHead);
            add(labSuche2);

            labSuche3 = new Label ("PLZ");
            labSuche3.setBounds(500,70,100,25);
            labSuche3.setFont(fntHead);
            add(labSuche3);

            tfId=new TextField("");
            tfId.setBounds(100,110,160,25);
            tfId.setFont(fntFett);
            add(tfId);

            tfPasswort=new TextField("");
            tfPasswort.setBounds(350,110,100,25);
            tfPasswort.setFont(fntFett);
            add(tfPasswort);

            tfPlz=new TextField("");
            tfPlz.setBounds(500,110,100,25);
            tfPlz.setFont(fntFett);
            add(tfPlz);

            bAbbrechen=new Button("Abbrechen");
            bAbbrechen.setBounds(150,160,80,25);
            bAbbrechen.setFont(fntFett);
            add(bAbbrechen);

            bInfo=new Button("Info");
            bInfo.setBounds(300,160,100,25);
            bInfo.setFont(fntFett);
            add(bInfo);

            bLogin=new Button("Login");
            bLogin.setBounds(450,160,100,25);
            bLogin.setFont(fntFett);
            add(bLogin);

            taInfo=new TextArea();
            taInfo.setBounds(20,210,600,400);
            taInfo.setFont(fntAusgabe);
            add(taInfo);


            }


        public boolean handleEvent (Event e){
            if (e.target == bInfo && e.id == Event.ACTION_EVENT){
                infoClicked();
            }

            if (e.target == bAbbrechen && e.id == Event.ACTION_EVENT){
                abbrechenClicked();
            }

            if (e.target == bLogin && e.id == Event.ACTION_EVENT){
                try {
                    loginClicked();
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }

            return false;

        }
/*
        public void actionPerformed(ActionEvent e){
            if (e.getSource() == bInfo){
                infoClicked();
            }
            if (e.getSource() == bAbbrechen){
                    abbrechenClicked();
                }
            if (e.getSource() == bLogin){
                    loginClicked();
                }


        }*/

        private void infoClicked() {

            taInfo.append("Info Feld\n");

        }

        private void abbrechenClicked() {
            taInfo.append("Abbrechen angeklickt\n");

        }

        private void loginClicked() throws Exception {
            System.out.println("methode login");
            taInfo.append("Login angeklickt\n");
            holeVerbindung ( RechnerName, dbName, userName, dbPasswort);

        }
        public static synchronized Connection holeVerbindung(String RechnerName,String dbName,String userName, String passwort)
        throws Exception {
            System.out.println("methode hole verbindung");
            if (dieConnection == null) {
                Class.forName( "org.gjt.mm.mysql.Driver" );
                String  connectionURL ="jdbc:mysql://localhost:3306/"+"konsole";
                System.out.println("connection url");
                Connection result = DriverManager.getConnection(connectionURL, userName, passwort);
                System.out.println("connection result");
                return result;
            } else {
                Connection conn = dieConnection;
                dieConnection = null;
                return conn;
            }
        }

}[/HIGHLIGHT]


und beim Login bekomme ich besagten Fehler. Steht momentan ein wenig mehr drin als gebraucht wird aber das sind die "Schnipsel" von meinem rumtesten.


----------



## L-ectron-X (25. Feb 2009)

Also die Fehlermeldung

java.lang.ClassFormatError: Duplicate method name&signature in class file com/mysql/jdbc/Connection

deutet in erster Linie auf eine nicht lesbare, kaputte oder nicht als Class-Datei erkannte Bytecode-Datei.

Was mich aber eigentlich irritiert ist das Anhängsel: Duplicate method name&signature in class file com/mysql/jdbc/Connection

Scheinbar gibts eine gleiche Methode, also ein Namenskonflikt.

Versuche mal, die Connection-Klasse, die du benutzt mit Paket anzugeben und dann neu zu kompilieren/auszuführen.


----------



## schlaubi (2. Mrz 2009)

Hi, ok werde es mal probieren.


----------

