Moka: JSTL

Hi,

ich hoffe, dass jemand sich hier mit JSTL auskennt!

Mein Problem ist wie folgt:

Ich habe ein kleines JSP-Programm, das unter Netbeans als JSTL umgeschreiebn werden muss. Dies scheitert aber an:

url="jdbc:mysql://localhost/meineDatenbank"

Fehlermeldung:

No suitable driver found for jdbc:mysql://localhost/meineDatenbank"

Ich habe alles versucht. Das will einfach nicht klappen. Für jede Hilfe bin ich dankbar.

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<sql:setDataSource driver="com.mysql.jdbc.Driver"
                   url="jdbc:mysql://localhost/meineDatenbank"
                   user="root"
                   password="pass"
                   var="exampleDS"
                   scope="application" />

<sql:query dataSource="${exampleDS}"
           var="javax_servlet_jsp_jstl_sql_Result"
           sql="SELECT * FROM meineTabelle">
         <sql:param value="1" />
</sql:query>

Gruß

  1. Grüss dich!

    ich hoffe, dass jemand sich hier mit JSTL auskennt!

    Ausgerechnet HIER?!?

    Fehlermeldung:
    No suitable driver found for jdbc:mysql://localhost/meineDatenbank"

    Ich habe alles versucht.

    Glaub ich nicht! ;-)

    <sql:setDataSource driver="com.mysql.jdbc.Driver"
                       url="jdbc:mysql://localhost/meineDatenbank"
                       user="root"
                       password="pass"
                       var="exampleDS"
                       scope="application" />

    Wenn deine JSP ausgeführt wird, findet der Webserver den Treiber zur Datenbank nicht. Genauer die Klasse, die unter deinem DataSource hinterlegt ist.
    Füge in deinem Netbeans Projekt den passenden JDBC Treiber hinzu. Dürfte hier der "JDBC Driver for MySQL (Connector/J)" sein, in Gestalt von mysql-connector-java-5.1.10-bin.jar
    Wenn deine Anwendung ausserhalb von Netbeans laufen soll, muss der Treiber im Classpath vorhanden sein.

    Gruss

    1. Hallo,

      vielen Dank für die Antwort.

      Ich habe einiges im Internet gefunden. Alles war inhaltlich nicht zu gebrauchen. Die haben zwar das Problem geschildert, die Lösung war aber so kompliziert, dass ich überhaupt nichts versatnd.

      Ich habe mysql-connector-java-5.1.10-bin.jar berites in Netbeans unter "Libraries" eingefügt. Das Problem hält aber immer noch. Meine Webanwendung als JSP läuft einwandfrei. Das heißt, die Datenbank abfragen erzeugen keine Fehlermeldung und der JDBC scheint gut zu funktionieren.

      final String DB_URL = "jdbc:mysql://localhost/meineDatenbank";

      Nur bei JSTL bekommt man Fehlermeldungen.

      Gruß

  2. Hi,

    Guten Morgen,

    ich hoffe, dass jemand sich hier mit JSTL auskennt!

    Ja.

    [...]
    Fehlermeldung:

    No suitable driver found for jdbc:mysql://localhost/meineDatenbank"
    [...]
    <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

    <sql:setDataSource driver="com.mysql.jdbc.Driver"
                       url="jdbc:mysql://localhost/meineDatenbank"
                       user="root"
                       password="pass"
                       var="exampleDS"
                       scope="application" />

    <sql:query dataSource="${exampleDS}"
               var="javax_servlet_jsp_jstl_sql_Result"
               sql="SELECT * FROM meineTabelle">
             <sql:param value="1" />
    </sql:query>

    Wo führst Du denn Deine JSP aus, wenn der Fehler auftritt? Wahrscheinlich doch in einem Servlet Container (Tomcat, Resin, ...). Dieser Container muss Bescheid wissen über den JDBC-Treiber.
    Aber mein Tipp wäre: schmeiss alles, was auf "http://java.sun.com/jsp/jstl/sql" in Deinen JSPs referenziert, weg und stell Deine Software auf eine vernünftige Struktur um. Datenbankabfragen gehören nicht in die View einer Software, sondern in die Datenzugriffsschicht. Und die ist ein paar Ebenen unterhalb der View, zunächst kommen noch mindestens der Controller und die Serviceschicht.
    Du solltest Dich mit der Model2-Architektur bzw. MVC für Java Webanwendungen beschäftigen, dann ist Deine Anwendung auch in einem halben Jahr noch wartbar.

    Schöne Grüße und viel Erfolg.

    Peter

    1. Hallo Peter,

      du hast natürlich recht. Dies geschieht aber im Rahmen eines studentischen Projekts. Normalerweise gehe ich auch anders vor.

      Mein JSP wird unter Netbeans ausgeführt. Soweit ich weiß, wird Tomcat auch mitinstalliert, wenn man Netbeans installiert. Was ich nicht ganz verstehen kann, ist, warum JSP den Pfad findet, JSTL aber nicht!

      Gruß

      1. Servus,

        [...]
        du hast natürlich recht. Dies geschieht aber im Rahmen eines studentischen Projekts. Normalerweise gehe ich auch anders vor.

        Das macht doch keinen Unterschied, ob fürs Studium oder nicht. Ich habe auch im Studium versucht, vernünftige Software zu schreiben. In den meisten Fällen ist es ja mittelfristig auch einfacher, das zu tun. Hingefrickelte Lösungen kosten meiner Erfahrung nach fast immer mehr (Geld, Zeit, Nerven), als vernünftige Sachen.

        Mein JSP wird unter Netbeans ausgeführt. Soweit ich weiß, wird Tomcat auch mitinstalliert, wenn man Netbeans installiert. Was ich nicht ganz verstehen kann, ist, warum JSP den Pfad findet, JSTL aber nicht!

        Eine JSP findet ja erst mal gar nichts. ;) Vielleicht findet Netbeans die Bibliothek, aber sagt dem Tomcat nicht Bescheid, dass es eine gibt. Woran machst Du denn fest, dass "die JSP den Pfad findet"?

        Peter

        1. Hi,

          wie schon erwähnt, das Programm ist ja ursprünglich in JSP geschrieben. In der Klasse, die für Datenabfragen zuständig ist, ist ja der Pfad angegeben.

          final String DB_URL = "jdbc:mysql://localhost/meine Datenbank";

          So kann man ohne weiters eine Verbindung zur Datenbank aufbauen, also keine Fehlermeldung. Diese aber scheitert, wenn dies über eine JSTL laufen soll.

          Übrigens, das, was ich mache, ist auch keine "unvernüftige" Sache! Man hat ja für ein Projekt nicht ewig Zeit, weder bei der Arbeit noch im Studium. Man muss ja eine Vernüftige Lösung finden, ohne dass den Zeitrahmen, den man zur Verfügung hat, gesprengt wird. Ja, wenn diese nicht oder schlecht zu finden ist, ist man gezwungen zu improvisieren.

          Gruß

          1. [...]
            final String DB_URL = "jdbc:mysql://localhost/meine Datenbank";

            So kann man ohne weiters eine Verbindung zur Datenbank aufbauen, also keine Fehlermeldung. Diese aber scheitert, wenn dies über eine JSTL laufen soll.

            Die Fehlermeldung, die Du in Deinem ersten Post angegeben hat, hat ja nichts mit dem Host zu tun. Es kann schon sein, dass die Verbindung zur Datenbank über diese Connection-URL möglich ist. Aber Deine Servlet Engine findet halt zur Laufzeit die entsprechende Klasse nicht, deshalb auch der Fehler.

            Übrigens, das, was ich mache, ist auch keine "unvernüftige" Sache! Man hat ja für ein Projekt nicht ewig Zeit, weder bei der Arbeit noch im Studium. Man muss ja eine Vernüftige Lösung finden, ohne dass den Zeitrahmen, den man zur Verfügung hat, gesprengt wird. Ja, wenn diese nicht oder schlecht zu finden ist, ist man gezwungen zu improvisieren.

            Naja, da wirst Du Deine Meinung behalten und ich meine. Meine Erfahrung sagt mir jedoch, dass auch bei Klein- und Kleinstprojekten Sachen wie z.B. Deine Verwendung der SQL-JSTL "unvernünftig" ist. Auch kleine Projekte werden größer, so wird z.B. aus einem reinen JSP-Projekt irgendwann mal ein JSTL-Projekt (ist übrigens ja immer noch JSP), und vielleicht kommt irgendwann mal einer drauf und sagt: blöder Käse, wir verschwenden unsere ganze Zeit darauf, unsere hingefrickelte Lösung zu betreuen und haben keine Zeit mehr, echte Probleme zu lösen (nämlich fachliche). Ich werde oft genug genau bei solchen Projekten eingesetzt und es bleibt dann nichts anderes übrig, als das Bestehende in die Tonne zu treten und richtig neu zu entwickeln. Aber mach das ruhig so mit der reinen JSP-Lösung, die Erkenntnis kommt vielleicht mit der Zeit. ;)

            Zum Fehler: wenn Deine Servlet Engine sagt, sie findet eine Klasse nicht, dann glaub ihr das ruhig. Schau nach, ob der JDBC-Treiber eingebunden ist (zur Laufzeit im Container, im richtigen Classloader), das wird der Fehler sein.

            Schöne Grüße,

            Peter

            1. Hi,

              kannst du mir bitte auch kurz sagen, wo ich die beiden Sachen finde?

              zur Laufzeit im Container, im richtigen Classloader

              Ist das möglich eine Varibale, die im JSP-Bereich definiert ist mit JSTL-Tag
              auszugeben? Z.B.:

              <%
                String test = "Hallo";
              %>

              <c:out value="${test}" />

              So klappt es nicht. Und wie kann man auf ads X-ten Elemnt eines Vektors in JSTL zuzugreifen?

              <jsp:useBean id="personen" scope="session" class="java.util.Vector"/>

              Über eine foreach-Schleife kann man zwar alle Elemente durchlaufen, die einzelnen Elemnte lassen sich anscheint aber nicht ansprechen.

              <c:forEach var="person" items="${personen}">

              <c:forEach>

              Gruß

              1. Guten Morgen!

                [...]
                kannst du mir bitte auch kurz sagen, wo ich die beiden Sachen finde?

                zur Laufzeit im Container, im richtigen Classloader

                Da hat Dir Helferlein oben schon den richtigen Tip gegeben. Der Tomcat kann Datenbankverbindungen vorab aufbauen und als Ressource bereit stellen. Das sollte in Deinem Fall nicht zutreffen, weil Du keine JNDI-Ressource anziehst, sondern die Connection-Daten in der JSP mitgibst. Deshalb müsstest Du in meinen Augen den Treiber nicht unter CATALINA_HOME/lib/ bereitstellen, sondern es sollte reichen, wenn er im Webarchiv unter WEB-INF/lib/ liegt.

                Ist das möglich eine Varibale, die im JSP-Bereich definiert ist mit JSTL-Tag
                auszugeben? Z.B.:

                <%
                  String test = "Hallo";
                %>

                <c:out value="${test}" />

                Ich habe noch nie in JSPs mit Scriptlets gearbeitet (noch so eine Sache, die ich als unsauber empfinde und in meinen Projekten nicht dulde :)).

                So klappt es nicht. Und wie kann man auf ads X-ten Elemnt eines Vektors in JSTL zuzugreifen?

                <jsp:useBean id="personen" scope="session" class="java.util.Vector"/>

                Du solltest über den Index mit folgender Syntax zugreifen können: ${personen[1]}

                Siehe auch:
                http://java.sun.com/javaee/5/docs/tutorial/doc/bnahq.html#bnaij

                Schöne Grüße,

                Peter

            2. Ich wieder.

              final String DB_URL = "jdbc:mysql://localhost/meine Datenbank";

              So kann man ohne weiters eine Verbindung zur Datenbank aufbauen, also keine Fehlermeldung. Diese aber scheitert, wenn dies über eine JSTL laufen soll.

              Diese Zeile alleine macht noch keine Datenbankverbindung. Da muss mehr passieren mit der Variablen DB_URL.

              Zum Fehler: wenn Deine Servlet Engine sagt, sie findet eine Klasse nicht, dann glaub ihr das ruhig. Schau nach, ob der JDBC-Treiber eingebunden ist (zur Laufzeit im Container, im richtigen Classloader), das wird der Fehler sein.

              Genau.
              Schau bitte mal nach, wo bei dir der Tomcat genau installiert ist. Evtl. mal nach der Umgebungsvariablen CATALINE_HOME o.ä. suchen. Dort sollte es ein Unterverzeichnis {CATALINA_HOME}/common/lib geben. Kopiere dort deinen JDBC Treiber (die bereits angesprochene JAR-Datei) hinein. Tomcat will gerne VOR dem Starten der Webapplikation den Datasource einrichten und Verbindung zur Datenbank aufbauen. Und dafür braucht er den JDBC Treiber.

              Vielleicht reicht das schon.

              Gruss