[Java] GWT Verbindung zu MySQL

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von alt-mich, 20. Dezember 2011 .

  1. 20. Dezember 2011
    GWT Verbindung zu MySQL

    Hallo!

    Ich möchte gerne mit GWT eine Verbindung zu einem lokalen MySQL-Server (xampp) aufnehmen.
    Mein jetziger Ansatz sieht so aus, dass ich einen RPC-Service erstellt habe.

    Die Klasse 'ConnectionService' im Package 'de.test.database.client' sieht so aus:
    Code:
    package de.test.database.client;
    
    import com.google.gwt.user.client.rpc.RemoteService;
    import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
    
    
    @RemoteServiceRelativePath("ConnectionService")
    public interface ConnectionService extends RemoteService {
     
     boolean connect();
     
    }
    Die Klasse 'ConnectionServiceAsync' im selben Package:
    Code:
    [package de.test.database.client;
    
    import com.google.gwt.user.client.rpc.AsyncCallback;
    
    
    public interface ConnectionServiceAsync {
     
     void connect(AsyncCallback<Boolean> callback);
     
    }
    Interessant wird es in 'ConnectionServiceImpl' im Package 'de.test.database.server':
    Code:
    package de.test.database.server;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import de.test.database.client.ConnectionService;
    import com.google.gwt.user.server.rpc.RemoteServiceServlet;
    
    
    @SuppressWarnings("serial")
    public class ConnectionServiceImpl extends RemoteServiceServlet
     implements ConnectionService {
    
     @Override
     public boolean connect() {
     /*
     * Versuchen, die Verbindung mit MySQL aufzubauen
     */
     try {
     Class.forName("com.mysql.jdbc.Driver");
     Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/" +
     "mysql?user=rootVertreter&pass=rootVertreter");
     Statement stat = conn.createStatement();
     ResultSet res = stat.executeQuery("SHOW TABLES");
     return true;
     /*
     * Im Fehlerfall nur 'false' zurueckgeben
     */
     } catch (Exception ex) {
     return false;
     } 
     }
     
    }
    In der Entry-Point-Klasse werte ich den Klick auf einen Button aus, der die Verbindung zu MySQL herstellen soll:
    Code:
    public void onModuleLoad() {
     /*
     * Button erzeugen
     */
     Button btn = new Button("Verbindung herstellen");
     RootPanel.get("inhalt").add(btn);
     /*
     * Beim Klick auf den Button versuchen, eine Verbindung mit MySQL aufzubauen
     */
     btn.addClickHandler(new ClickHandler() {
     @Override
     public void onClick(ClickEvent event) {
     ConnectionServiceAsync proxy = (ConnectionServiceAsync)
     GWT.create(ConnectionService.class);
     AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {
     @Override
     public void onSuccess(Boolean result) {
     Window.alert("Die Verbindung zu MySQL konnte erfolgreich " +
     "hergestellt werden!");
     }
     @Override
     public void onFailure(Throwable caught) {
     Window.alert("Fehler aufgetreten:\n" +
     caught.toString());
     }
     };
     proxy.connect(callback);
     }
     });
     }
    Jetzt stoße ich aber immer folgenden Fehler:
    Code:
    com.google.gwt.user.client.rpc.StatusCodeException: 500 <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
    <title>Error 500 Expecting a stackmap frame at branch target 30 in method de.test.database.server.ConnectionServiceImpl.connect()Z at offset 0</title>
    </head>
    <body><h2>HTTP ERROR 500</h2>
    <p>Problem accessing /database/ConnectionService. Reason:
    <pre> Expecting a stackmap frame at branch target 30 in method de.test.database.server.ConnectionServiceImpl.connect()Z at offset 0</pre></p><h3>Caused by:</h3><pre>java.lang.VerifyError: Expecting a stackmap frame at branch target 30 in method de.test.database.server.ConnectionServiceImpl.connect()Z at offset 0
     at java.lang.Class.getDeclaredConstructors0(Native Method)
     at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
     at java.lang.Class.getConstructor0(Unknown Source)
     at java.lang.Class.newInstance0(Unknown Source)
     at java.lang.Class.newInstance(Unknown Source)
     at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153)
     at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:428)
     at org.mortbay.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:339)
     at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
     at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35)
     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
     at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58)
     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
     at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
     at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
     at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)
     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
     at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
     at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
     at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
     at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
     at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
     at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
     at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
     at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:351)
     at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
     at org.mortbay.jetty.Server.handle(Server.java:326)
     at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
     at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
     at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
     at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
     at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
     at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
     at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 
    
    </body>
    </html>
    Jetzt meine Frage: Woran liegt es? Wahrscheinlich am Ansatz.
    Der Client kann ja nicht direkt mit der Datenbank kommunizieren. So wie ich das verstanden habe, muss man das Paket in ein war-Verzeichnis umwandeln und auf einen Tomcat laden. Nur: Ich bin ja noch am entwickeln, ich will nicht permanent umwandeln, auf ein Tomcat laden, die Webseite anschauen und das Ganze wieder von vorne. Hier ein Tutorial, wo es so beschrieben wird:
    Database Access in GWT

    Ist denn solch ein Service der richtige Weg?

    Hier auch nochmal ein Bild zur Projekt-Struktur in eclipse.

    Wenn noch Informationen benötigt werden, liefere ich diese gerne.
     
  2. 25. Dezember 2011
    AW: GWT Verbindung zu MySQL

    Hat keiner eine Idee?
    Ich bin bisher nicht weitergekommen ... Es würde schon helfen, wenn jemand einen neuen Lösungsansatz hätte!
     
  3. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.