Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Newbie JSP+JDBC Problem

0 views
Skip to first unread message

Alex Schatten

unread,
Nov 28, 2003, 10:26:54 AM11/28/03
to
Hallo,
fange gerade erst mit JSP an.
jetzt wollte ich meine JDBC Verbindung testen mit folgendem Script

<html><body>
<%@ page import = "java.sql.*" isThreadSafe="false" %>
<%
String sDbDrv = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
String sDbUrl =
"jdbc:microsoft:sqlserver://192.168.0.27:1433;databaseName=test";
String sUsr = "sa";
String sPwd = "pa55word";
String sSql = "select * from members";
Class.forName( sDbDrv );
Connection cn = DriverManager.getConnection( sDbUrl, sUsr, sPwd );
java.sql.Statement st = cn.createStatement();
ResultSet rs = st.executeQuery( sSql );
ResultSetMetaData rsmd = rs.getMetaData();
int n = rsmd.getColumnCount();

out.println("Zeige Classpath:" + System.getProperty("java.class.path") +
"<br>");
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();
%>
</body></html>

doch leider funktioniert es nicht.
Als Fehlermeldung bekomme ich die Meldung unten.
Ich arbeite hier mit Tomcat 4.1.29 und den JDBC Treiber von Microsoft SP2
Die Ausgabe von Classpath bringt:
D:\java\j2sdk1.4.2_02\lib\tools.jar;C:\jakarta-tomcat-4.1.29\bin\bootstrap.j
ar;C:\Driver\JDBC-MS\msbase.jar;C:\Driver\JDBC-MS\msslqserver.jar;C:\Driver\
JDBC-MS\msutil.jar
was den installierten Verzeichnissen entspricht.

Google irgendwie schon seit Stunden und kommen nicht weiter deswegen wäre
jede Art von Hilfe willkommen

Gruß, Alex

Die Fehlermeldung:

Alex Schatten

unread,
Nov 28, 2003, 10:29:36 AM11/28/03
to
Hier noch die Fehlermeldung

description The server encountered an internal error () that prevented it
from fulfilling this request.

exception

org.apache.jasper.JasperException
at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:2
54)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Application
FilterChain.java:247)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterCh
ain.java:193)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.ja
va:256)
at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
eNext(StandardPipeline.java:643)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.ja
va:191)
at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
eNext(StandardPipeline.java:643)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at
org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2417)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180
)
at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
eNext(StandardPipeline.java:643)
at
org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.
java:171)
at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
eNext(StandardPipeline.java:641)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172
)
at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
eNext(StandardPipeline.java:641)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java
:174)
at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
eNext(StandardPipeline.java:643)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:193)
at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:781)
at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConne
ction(Http11Protocol.java:549)
at
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:589)
at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.jav
a:666)
at java.lang.Thread.run(Thread.java:534)


root cause

java.lang.NullPointerException
at com.microsoft.jdbc.base.BaseDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(DriverManager.java:512)
at java.sql.DriverManager.getConnection(DriverManager.java:171)
at org.apache.jsp.firstsql_jsp._jspService(firstsql_jsp.java:107)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:137)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:2
07)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Application
FilterChain.java:247)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterCh
ain.java:193)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.ja
va:256)
at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
eNext(StandardPipeline.java:643)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.ja
va:191)
at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
eNext(StandardPipeline.java:643)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at
org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2417)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180
)
at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
eNext(StandardPipeline.java:643)
at
org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.
java:171)
at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
eNext(StandardPipeline.java:641)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172
)
at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
eNext(StandardPipeline.java:641)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java
:174)
at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
eNext(StandardPipeline.java:643)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:193)
at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:781)
at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConne
ction(Http11Protocol.java:549)
at
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:589)
at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.jav
a:666)
at java.lang.Thread.run(Thread.java:534)


Christian Hauser

unread,
Nov 28, 2003, 4:39:00 PM11/28/03
to
Hallo Alex

> fange gerade erst mit JSP an.
> jetzt wollte ich meine JDBC Verbindung testen mit folgendem Script
>

> [...]

Ich weiss nicht genau wo ich anfangen soll, darum sage ich es mal so:
Deine JSP läuft bei mir (Treiber und so angepasst, weil ich MySQL
anstatt MS Access benütze.)

Alles was ich tat war folgendes: Ich erstelle ein neues Projekt 'test'
unter '<TOMCAT_HOME>\webapps'. Dort drin hat es natürlich ein WEB-INF
Verzeichnis. Und dort drin ein web.xml und unter 'WEB-INF\lib\' habe ich
die JAR Files installiert, die es benötigt. Ich rate dir daher deine
JDBC Treiber für MS Access auch dort reinzukopieren, egal was der
Classpath sagt. Dann sollte es meiner Meinung nach gehen:

<TOMCAT_HOME>\webapps\<webapp-name>\WEB-INF\lib\msbase.jar
msslqserver.jar
msutil.jar

Falls es nicht immer noch nicht geht, kannst du ja ein kleines
Java-Programm schreiben, das das gleiche auf dem Bildschirm ausgibt, um
zu sehen, ob der DB Zugriff überhaupt läuft. Und wenn das geht noch ein
kleines Programm, zum schauen, ob JSPs grundsätzlich laufen.

Nun zu deinem Code... Sieht schon nicht wirklich hübsch aus. Aber das
kriegst du hin und bist vielleicht noch vor mir SCWCD (Sun Certified Web
Component Developer). ;-)

Spass beiseite, du schreibst gibst der page Direktive das Attribut
isThreadSafe den Wert "false" mit. Verstehst du was das macht? Das
erlaubt nur einem Thread auf deine Seite zuzugreifen. Und das macht die
Seite sehr sehr langsam, falls mehrere Requests gleichzeitig kommen
würden. Und thread-safe ist es auch nicht, da gemäss Spezifikation zwar
nur 1 Thread aufs mal zugreifen darf, aber es könnten mehrere Instanzen
deiner JSP (bzw. des daraus generierten Servlets) existieren. Also
besser wäre isThreadSafe="true" und dann alles in ein
synchronized(this) {
....
}
packen.

Das oben beschriebene kann in der Praxis nicht eingesetzt werden. Um es
besser zu lösen pack den Initialisierungs-Teil in die Methode jspInit().
Dann wird die DB-Connection beim Erzeugen der Servlet-Instanz erstellt
und nicht bei jedem Request:

<html><body>
<%@ page import = "java.sql.*" isThreadSafe="true" %>

<%!
String sDbDrv = "...";
String sDbUrl = "jdbc:...";
String sSql = "select * from ...";
Connection cn = null;

public void jspInit() {
try {
Class.forName(sDbDrv);
cn = DriverManager.getConnection(sDbUrl);
} catch (Exception e) {
// Forward to error page or so
}
}
%>

<%


Statement st = cn.createStatement();
ResultSet rs = st.executeQuery(sSql);
ResultSetMetaData rsmd = rs.getMetaData();
int n = rsmd.getColumnCount();

... // usw.
%>
</body></html>

Ich möchte dir abschliessend noch sagen, dass man keine DB Verbindung
aus einer JSP macht, sondern den Zugriff über Java-Klassen löst, auf die
man dann aus der JSP zugreift.

Siehe dazu auch die Bücher über Servlets und JavaServer Pages von Marty
Hall oder einfach den Quelltext seiner Beispiele:

Chapter 17: Accessing Databases with JDBC
http://volume1.coreservlets.com/archive/Chapter17.html

Chapter 18: Configuring MS Access, MySQL, and Oracle9i
http://volume1.coreservlets.com/archive/Chapter18.html

Für mehr Source Code (aus diesem Buch):
http://volume1.coreservlets.com/archive/index.html


Gruss,
Christian

Alex Schatten

unread,
Dec 1, 2003, 11:02:47 AM12/1/03
to
"Christian Hauser" <don_...@bluewin.ch> schrieb im Newsbeitrag
news:bq8f94$hue$1...@newshispeed.ch...
> Hallo Alex

Vielen Dank für Deine erschöpfende Antwort

...

> die JAR Files installiert, die es benötigt. Ich rate dir daher deine
> JDBC Treiber für MS Access auch dort reinzukopieren, egal was der
> Classpath sagt. Dann sollte es meiner Meinung nach gehen:
>
> <TOMCAT_HOME>\webapps\<webapp-name>\WEB-INF\lib\msbase.jar
> msslqserver.jar
> msutil.jar
>

Das hatte ich davor auch getan, allerdings funktionioerte es erst nachdem
ich komplett neu den Server kalt gestartet hatte.
Aber ich habe jetzt Ergebnisse, wennir auch unerklärlich ist warum der
Server fast 50 Sekunden braucht um die Seite aufzubauen.
Sind da noch andere Bremmsen eingebaut?

...

> Nun zu deinem Code... Sieht schon nicht wirklich hübsch aus. Aber das
> kriegst du hin und bist vielleicht noch vor mir SCWCD (Sun Certified Web
> Component Developer). ;-)
>

Ähemm, es war ein erster Test und ich gelobe Besserung :-)

...

> Ich möchte dir abschliessend noch sagen, dass man keine DB Verbindung
> aus einer JSP macht, sondern den Zugriff über Java-Klassen löst, auf die
> man dann aus der JSP zugreift.

Danke, da bin ich noch zu sehr an ASP gewöhnt. Da ich ein bestehendes ASP
Projekt gerade in JSP neu schreiben soll wird es sicher hier nicht meine
letzte Frage gewesen sein.

...
> Gruss,
> Christian

Vielen Dank nochmal

Gruß Alex


0 new messages