Newsgroup: it.comp.java
Titolo: [Forse OT] Jsp+Tomcat+MySQL : No suitable driver

Salve a tutti, sto cercando un aiuto (sperando sia il NG giusto) per via di
un errore che non riesco a risolvere. Ho creato per esercizio una pagina
html che ha lo scopo di raccogliere via form delle informazioni che
potrebbero servire per un qualche servizio di registrazione (nome, cognome,
email, ecc...). In origine, mandavo queste informazioni (via POST) a una
servlet che le registrava in un database (uso appunto MySQL con il driver
JDBC - quello mm-jdbc per intenderci); inoltre mandava in uscita l'elenco
dei nominativi già registrati + email. Fin qui nessun problema, tutto ha
funzionato alla perfezione. Poi ho voluto provare a sostituire alla servlet
una JSP; non ne posto per ora il codice, comunque essa, per quel che
riguarda la connessione e le operazioni con il DB, è una copia esatta della
servlet. Al momento dell'esecuzione, il server web (uso Tomcat 4.0.1) mi
manda su una pagina di errore (Errore 500 - Internal Error) che riproduco
qua sotto (scusate la lunghezza) :
javax.servlet.ServletException: No suitable driver
 at
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImp
l.java:457)
 at org.apache.jsp.register$jsp._jspService(register$jsp.java:131)
 at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
 at
org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.ja
va:202)
 at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382)
 at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:474)
 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:243)
 at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
66)
 at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
 at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.ja
va:201)
 at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
66)
 at
org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:2
46)
 at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
64)
 at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
 at
org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2344)
 at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164
)
 at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
66)
 at
org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.
java:170)
 at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
64)
 at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170
)
 at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
64)
 at
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:462)
 at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
64)
 at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
 at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java
:163)
 at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
66)
 at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
 at
org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:
1011)
 at
org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1106
)
 at java.lang.Thread.run(Thread.java:536)
root cause
java.sql.SQLException: No suitable driver
 at java.sql.DriverManager.getConnection(DriverManager.java:532)
 at java.sql.DriverManager.getConnection(DriverManager.java:171)
 at org.apache.jsp.register$jsp._jspService(register$jsp.java:80)
 at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
 at
org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.ja
va:202)
 at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382)
 at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:474)
 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:243)
 at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
66)
 at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
 at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.ja
va:201)
 at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
66)
 at
org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:2
46)
 at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
64)
 at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
 at
org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2344)
 at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164
)
 at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
66)
 at
org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.
java:170)
 at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
64)
 at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170
)
 at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
64)
 at
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:462)
 at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
64)
 at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
 at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java
:163)
 at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
66)
 at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
 at
org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:
1011)
 at
org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1106
)
 at java.lang.Thread.run(Thread.java:536)
Aggiungo che Tomcat l'ho adeguatamente configurato (con i suoi vari file
.xml), almeno così credo poichè la Servlet funziona senza problemi; anche il
file .jar del driver JDBC è stato messo in common\lib. Io, partendo da ciò
che sta scritto qua sopra, non riesco a venirne a capo; spero di trovare
qualcuno che riesca a capire cosa non ho fatto o cosa ho fatto male. Grazie
in ogni caso.
--
RC - FreeBSD User

Se il driver č registrato correttamente, probabilmente l'url jdbc č
sbagliato. Dovresti postare il codice in cui registri il driver e ti
connetti al db tramite url.

 connetti al db tramite url.
In effetti hai visto giusto. Io avevo scritto:
Connection con = DriverManager.getConnection("jdbc:mysql:nomeDB", "login",
"pword");
Provando con l'url completo, cioč:
Connection con =
DriverManager.getConnection("jdbc:mysql://iphost:porta/nomeDB", "login",
"pword");
funziona. Tuttavia non capisco il motivo.
Saresti cosě gentile da spiegarmi perchč il metodo con cui lo avevo scritto
io funziona se messo in una servlet e non in una JSP? Io, se su un unico
host risiedono sia web server che DBMS, ho sempre usato (con servlet) la
prima versione, cosě come specificato anche nel tutorial Sun, ma purtroppo
pare che debba usare la seconda, come mi hai suggerito, per le JSP, ma non
capisco perchč. Grazie mille!

il primo url č sbagliato, avresti dovuto scriverlo cosě :
"jdbc:mysql:///nomeDB".
in questo modo indichi che č su localhost. Come hai scritto tu, il driver
non lo riconosce come un URL che puň risolvere. Mi stupisce molto che dici
che funziona se messo in una servlet... dovresti verificare.
Avevo scritto degli appunti su jdbc/mysql, se ti interessano:
http://groups.yahoo.com/group/it-torino-java-jug/files/documenti/jdbc_mysql
.
zip
Ciao.
L.

 che funziona se messo in una servlet... dovresti verificare.
La servlet in questione, cioè usando MySQL, l'avevo effettivamente scritta
con l'url completo, mentre la jsp no; tuttavia l'url come l'ho scritto io
nel reply funziona in una servlet (e suppongo in una qualunque applicazione)
quando uso il ponte jdbc-odbc (con Access), come è pure specificato nel
tutorial di Sun : (quoto)
<< The rest of the URL is generally your data source name or database
system. So, if you are using ODBC to access an ODBC data source called "
Fred, " for example, your JDBC URL could be jdbc:odbc:Fred . In place of "
myLogin " you put the name you use to log in to the DBMS; in place of "
myPassword " you put your password for the DBMS. So if you log in to your
DBMS with a login name of " Fernanda " and a password of " J8, " just these
two lines of code will establish a connection:
String url = "jdbc:odbc:Fred";
Connection con = DriverManager.getConnection(url, "Fernanda", "J8"); >>
Però, rileggendo meglio, quel "If you are using ODBC ... " potrebbe
presupporre che non funzioni con un jdbc puro, e che nel caso di jdbc-odbc
invece riesca a trovare il DB poichè è specificato configurando l'odbc.
Penso perciò di aver dato per scontato una cosa che non lo era.
Grazie di tutto, ciao.

 Grazie di tutto, ciao.
Di nulla :-)

 Il formato dell' URL è specifico del driver che usi.
Ecco, era questo che mancava nelle mie conoscenze :^) Ora lo so, grazie
ancora.