# Fehler beim ausgeben von Tabellen Inhalt



## Tatze64 (14. Nov 2012)

Erstmal möchte ich alle Lesenden Herzlich wilkommen heißen.
Habe vor kurzem mit java angefangen und nun soll ich über eine JSP den inhalt einer tabelle aus einer datenbank ausgeben.
Mein Code:

```
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<%@ page language="java" %>
<%@ page import="java.io.*"%>
<%@ page import="javax.servlet.*"%>
<%@ page import="javax.servlet.http.*"%>
<%@ page import="java.sql.*"%>

<HTML>
<head>
		<title>Nutzerverwaltung</title>
	</head>
<BODY>
<%if(session.getAttribute("theName").equals("user")&&session.getAttribute("thePass").equals("test")){%>
<%
  String url = "C:\\xampp\\mysql\\data\\filme\\";  // <-Frage 1
  String uid = "root";
  String pwd = "";

Connection con = null;
try {
    //Register the JDBC driver
    Class.forName("oracle.jdbc.driver.OracleDriver"); <-Frage 2
  } catch( Exception e ) {
    e.printStackTrace();
  }//end catch
  
   //Get a connection to the database
  try {
    con = DriverManager.getConnection(url, uid, pwd);
  } catch( Exception e ) {
    e.printStackTrace();
  }//end catch
  

                           
    Connection cn = DriverManager.getConnection( url, uid, pwd );
    java.sql.Statement st   = cn.createStatement();
    ResultSet          rs   = st.executeQuery( "");
    ResultSetMetaData  rsmd = rs.getMetaData();
    int n = rsmd.getColumnCount();
    out.println( "<table border=1 cellspacing=0><tr>" );
    for( int i=1; i<=n; i++ )    // Achtung: erste Spalte mit 1 statt 0
    out.println( "<th>" + rsmd.getColumnName( i ) + "</th>" );
    while( rs.next() )
        {
        out.println( "</tr><tr>" );
        for( int i=1; i<=n; i++ )  // Achtung: erste Spalte mit 1 statt 0
        out.println( "<td>" + rs.getString( i ) + "</td>" );
        }
    out.println( "</tr></table>" );
    rs.close();
    st.close();
    cn.close();
                         
  
%>
<%}else{%>
Zugriff verweigert!
<%}%>
</BODY>
</HTML>
```

Fehlercode:


```
org.apache.jasper.JasperException: An exception occurred processing JSP page /NextPage.jsp at line 36

36:                            Connection cn = DriverManager.getConnection( url, uid, pwd );
37:                            java.sql.Statement st   = cn.createStatement();
38:                            ResultSet          rs   = st.executeQuery( "");
39:                            ResultSetMetaData  rsmd = rs.getMetaData();


Stacktrace:
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:455)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

root cause

javax.servlet.ServletException: java.sql.SQLException: No suitable driver found for C:\xampp\mysql\data\filme\
	org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:912)
	org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:841)
	org.apache.jsp.NextPage_jsp._jspService(NextPage_jsp.java:138)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

root cause

java.sql.SQLException: No suitable driver found for C:\xampp\mysql\data\filme\
	java.sql.DriverManager.getConnection(Unknown Source)
	java.sql.DriverManager.getConnection(Unknown Source)
	org.apache.jsp.NextPage_jsp._jspService(NextPage_jsp.java:103)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
```
Fragen aus meinem code:
Frage 1: ist dies so ein gültiger Pfade (habe nur mal vor knapp 2 jahren ne datenbank mit php eingebunden und da sind irgendwie etliche Errinerungslücken)
Frage 2: sind das ebenfalls Pfade oder was muss ich damit machen? Habe dazu schon mehrere google versuche bzw hier Forum interne suche betrieben aber konnte nichts finden, was mir weiterhelfen konnte, bzw wo ich durchblickte. 

Allgemeine Frage: No Suitable Driver found For C:\xammp\... liegt wahrscheinlich daran das der pfad so nicht in ordnung ist oder?


----------



## nillehammer (14. Nov 2012)

Du schreibst nicht, welche Datenbank Du benutzt, Dein Pfad aus Frage 1 lässt auf MySQL schließen, die Treiberklasse aus Frage 2 wiederum auf eine Oracle DB. Ich gehe jetzt mal davon aus, dass es MySQL ist und schreibe meine Antworten entsprechend.


> ```
> String url = "C:\\xampp\\mysql\\data\\filme\\";  // <-Frage 1
> ```
> Frage 1: ist dies so ein gültiger Pfade (habe nur mal vor knapp 2 jahren ne datenbank mit php eingebunden und da sind irgendwie etliche Errinerungslücken)


Leider überhaupt nicht. Du willst Dich per jdbc über Netzwerk auf eine MySql-DB verbinden, nicht direkt auf die Datenfiles des DBMS zugreifen. Korrekte JDBC-Urls für MySql findest Du hier: https://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-configuration-properties.html



> ```
> //Register the JDBC driver
> Class.forName("oracle.jdbc.driver.OracleDriver");
> ```
> Frage 2: sind das ebenfalls Pfade oder was muss ich damit machen?


Das ist ein sog. voll qualifizerter Klassenname. Damit weist Du die Java an, eine Klasse zu laden. Das braucht man aber bei modernen JDBC-Treibern überhaupt nicht mehr zu machen. Es schadet aber nichts. Nur, wenn man es macht, dann muss man natürlich den Namen der Klasse angeben, die zum Treiber gehört:

```
//Register the JDBC driver
Class.forName("com.mysql.jdbc.Driver");
```



> Allgemeine Frage: No Suitable Driver found For C:\xammp\... liegt wahrscheinlich daran das der pfad so nicht in ordnung ist oder?


Ja, siehe Antwort Frage 1.


----------



## Tatze64 (14. Nov 2012)

Erstmal danke für die antwort.
Ja hatte vergessen zu erwähnen das es eine Mysql-DB ist.
also zu meiner Frage1:
das wäre dann vom pfad her so oder?:

```
String url = "jdbc:mysql://127.0.0.1:3306/filme";
```

zur Frage 2:
okay das ist schonmal gut zu wissen was ichda überhaupt tuhe und ja war der falsche hatte ihn selber auf:

```
org.gjt.mm.mysql.Driver
```
geändert nun ist die frage: soll ich lieber den von dir angegbenen nehmen oder meinen?

nachdem ich dies nun auch geänder habe kommt die fehlermeldung:

```
java.lang.NullPointerException
	org.apache.jsp.NextPage_jsp._jspService(NextPage_jsp.java:105)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
```
bezogen auf zeile 37.
Also das wirft bei mir nun die Frage auf: muss ich die Datenbank irgendwo hinzufügen etc. Habe hier des öfteren im Forum gelesen das etwas in die .xml Datein vom tomcat server geschrieben werden muss, verstehe davon aber leider garnichts und würde mich über hilfe sehr freuen.
Sollten irgendwelche Informationen fehlen, nicht zögern diese anzufordern.


----------



## nillehammer (14. Nov 2012)

> Ja hatte vergessen zu erwähnen das es eine Mysql-DB ist.
> also zu meiner Frage1:
> das wäre dann vom pfad her so oder?:
> 
> ...


Ja, wenn MySql auf dem selben Rechner läuft, wie Dein Webcontainer und es dort eine DB namens 'filme' gibt. Schaue Dir (evtl später, wenn der Rest läuft) auch ruhig nochmal die Properties an, die man entweder an den Connectionstring dranhängen oder in einem extra Objekt übergeben kann.


> zur Frage 2:
> okay das ist schonmal gut zu wissen was ichda überhaupt tuhe und ja war der falsche hatte ihn selber auf:
> 
> ```
> ...


Laut MySQL-Doku gibt es die von Dir verwendete Klasse nur noch aus Gründen der Abwärtskompatibilität. Verwende also lieber, den ich genannt habe.

Und zur NullpointerException:
Ich sehe jetzt zwar nicht, wie man vom StacTrace der Exception auf die Zeile 37 in Deiner JSP kommt, aber wenn Du es sagst, wird es stimmen. In Zeile 37 machst Du ja das hier:
[JAVA=37]
        java.sql.Statement st   = cn.createStatement();
[/code]
Eine NullpointerException fliegt ja, wenn man auf Werte/Methoden von etwas zugreifen will, das leider null ist. Was wäre hier also null? Und warum könnte das null sein? Wo wird dem, was da null ist ein Wert zugewiesen (Tipp: bei Deinem Code merkwürdigerweise drei mal)? Klappt diese Wertzuweisung? Fliegen an den entsprechenden Stellen evtl. Exceptions, die Du verschluckst, statt sie zu loggen?


----------



## Tatze64 (15. Nov 2012)

okay nochmals danke für deine hilfe.

Habe um deiner aussage nachzugehen mal geschaut was ich machen kann und einfach mal ne verzweigung mit der Connection als bedingung gemacht und tada, keine verbindung da-,-
Mysql läuft auf dem rechner und die db filme ist ebenfalls vorhanden.
Was nun aber meine Frage wäre: Vorhanden bedeutet ja recht wenig.
Diese liegt bei mir in dem standart ordner von mysql. Muss diese wo anders hinpacken oder bzw da noch was bei tomcat einstellen?

Hier Erstmal mein Aktuallisierter Code

```
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<%@ page language="java" %>
<%@ page import="java.io.*"%>
<%@ page import="javax.servlet.*"%>
<%@ page import="javax.servlet.http.*"%>
<%@ page import="java.sql.*"%>
<%@ page import="java.net.*"%>
<%@ page import="Java_Home\lib" %> <-eventuell ne erklärung wie genau man diesen classpath setzt

<HTML>
<head>
		<title>Nutzerverwaltung</title>
	</head>
<BODY>
<%
if(session.getAttribute("theName").equals("user")&&session.getAttribute("thePass").equals("test"))
{

  String url = "jdbc:mysql://127.0.0.1:3306/filme";
  String uid = "root";
  String pwd = "";

Connection con = null;
try {
    //Register the JDBC driver
    Class.forName("com.mysql.jdbc.Driver");
  } catch( Exception e ) {
    e.printStackTrace();
  }//end catch
  
   //Get a connection to the database
  try {
    con = DriverManager.getConnection(url, uid, pwd);
  } catch( Exception e ) {
    e.printStackTrace();
  }//end catch
  
if(con!=null) //neu
  {
	//Class.forName("com.mysql.jdbc.Driver");
    //con = DriverManager.getConnection(url, uid, pwd);                     
    java.sql.Statement st   = con.createStatement();
    ResultSet          rs   = st.executeQuery( "");
    ResultSetMetaData  rsmd = rs.getMetaData();
    int n = rsmd.getColumnCount();
    out.println( "<table border=1 cellspacing=0><tr>" );
    for( int i=1; i<=n; i++ )    // Achtung: erste Spalte mit 1 statt 0
    out.println( "<th>" + rsmd.getColumnName( i ) + "</th>" );
    while( rs.next() )
        {
        out.println( "</tr><tr>" );
        for( int i=1; i<=n; i++ )  // Achtung: erste Spalte mit 1 statt 0
        out.println( "<td>" + rs.getString( i ) + "</td>" );
        }
    out.println( "</tr></table>" );
    rs.close();
    st.close();
    con.close();
	}
        else //neu
	{
	%>
	Konnte Keinen Zugriff auf die Datenbank ausführen.
    <%}%>
  
<%}else{%>
Zugriff verweigert!
<%}%>
</BODY>
</HTML>
```

Lass ich den Classpath genau so da drinne stehen wird mir nur gesagt das diese klasse nicht aufgelöst werden kann.


----------



## nillehammer (15. Nov 2012)

```
try {
    //Register the JDBC driver
    Class.forName("com.mysql.jdbc.Driver");
  } catch( Exception e ) {
    e.printStackTrace();
  }//end catch

   //Get a connection to the database
  try {
    con = DriverManager.getConnection(url, uid, pwd);
  } catch( Exception e ) {
    e.printStackTrace();
  }//end catch
```
Was sagt denn der StackTrace an diesen Stellen? Und hast Du auch das connecorJ-Jar eingebunden (MySQL :: Download Connector/J


----------



## Tatze64 (15. Nov 2012)

Bin grade dabei Eclipse mit ner Downloadgeschwindigkeit von 20kb/s zu laden, da ich vorher nur mit notepad++ gearbeitet habe und ich dort keine Ahnung habe wie ich den Connecter einbinde bzw den Stacktrace auslese. Melde mich Zurück sobald dies fertig ist.


----------



## Tatze64 (15. Nov 2012)

Tomcat installiert                    +
Dynamic web Project erstellt     +
Alle jsp`s hinzugefügt              +
Connector in die libarie gepackt +
Tomcat server hinzugefügt       +

So nun bleibt die frage:
wie lasse ich mir nun den stacktrace ausgeben?


----------



## Tatze64 (15. Nov 2012)

So noch nen bisschen rumgespielt und der trace gibt nun folgendes aus.
Code:

```
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<%@ page language="java" %>
<%@ page import="java.io.*"%>
<%@ page import="java.sql.*"%>
<%@ page import="java.sql.DriverManager"%>
<%@	page import="java.sql.Connection" %>
<%@	page import="java.sql.SQLException" %>

<HTML>
<head>
		<title>Nutzerverwaltung</title>
	</head>
<BODY>
<%
if(session.getAttribute("theName").equals("user")&&session.getAttribute("thePass").equals("test"))
{

  String url = "jdbc:mysql://127.0.0.1:3306/filme";
  String uid = "root";
  String pwd = "";

Connection con = null;
try {
    //Register the JDBC driver
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    System.out.println("treiber registriert");
  } catch( Exception e ) {
	  Writer writer = new StringWriter();
	  PrintWriter printWriter = new PrintWriter(writer);
	  e.printStackTrace(printWriter);
	  String s = writer.toString();
	  System.out.println(s);
	  System.out.println("fehler1");
  }//end catch
  
   //Get a connection to the database
  try {
    con = DriverManager.getConnection(url, uid, pwd);
    System.out.println("verbindung steht");
  } catch( Exception e ) {
	  Writer writer = new StringWriter();
	  PrintWriter printWriter = new PrintWriter(writer);
	  e.printStackTrace(printWriter);
	  String s = writer.toString();
	  System.out.println(s);
	  System.out.println("fehler2");
  }//end catch
```

Fehler:

```
Last packet sent to the server was 0 ms ago.
	at com.mysql.jdbc.Connection.createNewIO(Connection.java:2847)
	at com.mysql.jdbc.Connection.<init>(Connection.java:1555)
	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at org.apache.jsp.NextPage_jsp._jspService(NextPage_jsp.java:104)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

fehler2
```

Nun würde ich mich drüber freuen wenn mir jemmand nen stubser in die richtige richtung geben kann.


----------



## Tatze64 (15. Nov 2012)

Okay.
Feststellung: Das was ich gepostet habe war nicht der gesamte Stacktrace.

```
java.net.ConnectException: Connection refused: connect
```
stand noch etwas weiter drüber.
Damit kamm ich dann auf den Entschluss das ich dumm bin.
Man sollte halt auch die datenbank starten, in meinem fall über xampp-> MySql.
Dann trat natürlich noch der fehler auf das in meinem Fall die query leer war und keine leere query ausgeführt werden kann :bloed:

```
java.sql.SQLException: Can not issue empty query.
```

Möchte mich nun hier nochmal ganz Herzlich bei nillehammer für seine Hilfe und Geduld bedanken.


----------

