Pagina 1 di 1

Servlet e MySQL: problema apparentemente semplice con il driver JDBC

Inviato: martedì 5 giugno 2007, 11:08
da MarKco
Ciao a tutti,

sto preparando l'esame di Basi di Dati e quindi per le prime volte provo a destreggiarmi con Servlet, Tomcat e in generale con la realizzazione di pagine HTML dinamiche in Java a partire da Database.

Seguendo le dispense del corso ho provato a realizzare una Servlet. Purtroppo (ma anche no) nelle dispense le istruzioni riguardano l'accesso tramite Postgresql ad un database speficico che è presente nei laboratori dell'università. Io ho replicato il database a casa mia, ma in Mysql. Quindi devo cambiare il codice della servlet in modo che si connetta con il database sul server Mysql.

Per fare ciò, seguendo le istruzioni che ho trovato qui, ho inserito nella Servlet le seguenti righe, nel metodo doGet:

Codice: Seleziona tutto


String user = "usernameCheUso";
String passwd = "passwordCheUso";

String url = "jdbc:mysql://localhost:8080/esercitazione3";

//Caricamento del driver JDBC per il database
try {
		Class.forName("org.gjt.mm.mysql.Driver");
}
catch (Exception cnfe) 
{
		out.println("Driver jdbc non trovato: " + cnfe.getMessage());
}

Inoltre nel file web.xml corrispondente, nella cartella /usr/local/tomcat/webapps/CorsoStudi/WEB-INF/, ho messo questo

Codice: Seleziona tutto


<?xml version="1.0" encoding="ISO-8859-1"?>


<web-app xmlns="http://java.sun.com/xml/ns/javaee"

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

   version="2.5">

<servlet>
<servlet-name>ServletCorsoStudi</servlet-name>
<servlet-class>ServletCorsoStudi</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>ServletCorsoStudi</servlet-name>
<url-pattern>/ServletCorsoStudi</url-pattern>
</servlet-mapping>

</web-app>

La classe compilata della servlet è nella sottocartella di WEB-INF chiamata classes.

A questo punto, se cerco di avviare la servlet andando col browser alla pagina http://localhost:8080/CorsoStudi/ServletCorsoStudi, ottengo come messaggio un bel

[glow=red,2,300]Driver jdbc non trovato: org.gjt.mm.mysql.Driver[/glow]

A questo punto presumo che la pagina venga trovata, ma l'errore sta nell'importazione del driver JDBC per Mysql.
Ho controllato quindi che nel classpath ci fosse il percorso del driver, e c'è ($CLASSPATH --> :/usr/share/java/servlet-2.3.jar:/usr/lib/mysql-connector-java-5.0.6/mysql-connector-java-5.0.6-bin.jar).
Ho pensato anche che potrebbe essere un problema dovuto al fatto che il percorso di "connector" viene aggiunto al classpath dal file .bashrc, quindi viene caricata l'istruzione solo quando apro la shell. La shell la apro prima di caricare la pagina nel browser, ma magari pensavo che il cambiamento del classpath potrebbe non influire sull'ambiente del browser, ma solo su quello della shell... ha senso? In tal caso come faccio a cambiare in modo "globale" il CLASSPATH in modo che il file .jar contenente il driver JDBC sia visto anche dalla pagina web?

Grazie per ogni aiuto, e scusate se sono stato prolisso.  (z)

Re: Servlet e MySQL: problema apparentemente semplice con il driver JDBC

Inviato: martedì 5 giugno 2007, 11:35
da Giambo
MarKco ha scritto: Class.forName("org.gjt.mm.mysql.Driver");
Se la memoria non mi inganna, ora si chiama "com.mysql.jdbc.Driver". Il nome da te usato e' (era ?) tenuto per compatibilita' all'indietro.
Soluzione rapida ma "sporca": Copia il jar in $JAVA_HOME/jre/lib/ext ... Io non ti ho detto niente  :D !
Comunque tomcat dovrebbe automagicamente "vedere" tutti i jar presenti in $MYAPP/WEB-INF/lib/  :-\ ...

Re: Servlet e MySQL: problema apparentemente semplice con il driver JDBC

Inviato: martedì 5 giugno 2007, 11:42
da Massimo S.
Come l'hai settato il classpath? Usi qualche IDE oppure hai settato solo la variabile d'ambiente CLASSPATH in .bashrc ?

Comunque non serve a nulla che il browser veda il CLASSPATH, potrebbe aver senso in caso uso applet, ma non per le servlet. Al browser arriva solo html e non qui può fregare di meno se questo html è prodotto da una servlet java o da un drago rosa a pois verdi, il browser non esegue codice java.

L'importante è che Tomcat veda il corretto classpath.
Se vuoi settare la variabile CLASSPATH globalmente mettila nel file /etc/envinronment e poi riavvia.
Però mi pare che Tomcat ignora la variabile CLASSPATH a differenza di quanto fatto normalmente i prog. java.
Ti consiglio caldamente di copiare (o linkare) il mysql-connector-java-5.0.6-bin.jar nella dir. /usr/local/tomcat/webapps/CorsoStudi/WEB-INF/lib oppure in /usr/local/tomcat/common/lib (quest'ultima dir esiste in tomcat 5.x non so in altre versioni)

Ciao

P.S. ma sei sicuro di quel "jdbc:mysql://localhost:8080/esercitazione3" ?
Cioè mysql risponde sulla porta 8080? la stessa di tomcat? Non c'è conflito o hai cambiato la porta di tomcat?

Re: Servlet e MySQL: problema apparentemente semplice con il driver JDBC

Inviato: martedì 5 giugno 2007, 11:54
da MarKco
Giambo ha scritto: Se la memoria non mi inganna, ora si chiama "com.mysql.jdbc.Driver". Il nome da te usato e' (era ?) tenuto per compatibilita' all'indietro.
Capito, grazie mille  ;) Così imparo a usare guide del paleolitico!
Ad ogni modo ho cambiato il riferimento, e ora l'errore è (e ti pareva)

Driver jdbc non trovato: com.mysql.jdbc.Driver
Soluzione rapida ma "sporca": Copia il jar in $JAVA_HOME/jre/lib/ext ... Io non ti ho detto niente  :D !
Ehm... come la scopro, la Home di Java?
Perché la mia variabile d'ambiente JAVA_HOME non è settata...
Comunque tomcat dovrebbe automagicamente "vedere" tutti i jar presenti in $MYAPP/WEB-INF/lib/  :-\ ...
Buono a sapersi  ;D
Comunque non sembra che non veda la servlet, altrimenti mi darebbe un altro errore. Nella servlet ci entra, è il driver JDBC che non riesce a trovare...

Re: Servlet e MySQL: problema apparentemente semplice con il driver JDBC

Inviato: martedì 5 giugno 2007, 12:01
da MarKco
Massimo S. ha scritto:
Come l'hai settato il classpath? Usi qualche IDE oppure hai settato solo la variabile d'ambiente CLASSPATH in .bashrc ?
La seconda che hai detto... ... ... ma cos'è un IDE? (perdona la mia ignoranza)
Comunque non serve a nulla che il browser veda il CLASSPATH, potrebbe aver senso in caso uso applet, ma non per le servlet. Al browser arriva solo html e non qui può fregare di meno se questo html è prodotto da una servlet java o da un drago rosa a pois verdi, il browser non esegue codice java.

L'importante è che Tomcat veda il corretto classpath.
Infatti, era proprio questo che intendevo.
Se vuoi settare la variabile CLASSPATH globalmente mettila nel file /etc/envinronment e poi riavvia.
Ora provo!
Però mi pare che Tomcat ignora la variabile CLASSPATH a differenza di quanto fatto normalmente i prog. java.
Ti consiglio caldamente di copiare (o linkare) il mysql-connector-java-5.0.6-bin.jar nella dir. /usr/local/tomcat/webapps/CorsoStudi/WEB-INF/lib oppure in /usr/local/tomcat/common/lib (quest'ultima dir esiste in tomcat 5.x non so in altre versioni)
Fatto, ma non cambia il risultato (ho anche stoppato e riavviato tomcat)...  :'(
P.S. ma sei sicuro di quel "jdbc:mysql://localhost:8080/esercitazione3" ?
Cioè mysql risponde sulla porta 8080? la stessa di tomcat? Non c'è conflito o hai cambiato la porta di tomcat?
Uhm... hai ragione, ho sbagliato porta! Quella è la porta di tomcat!
Non credo che ciò interferisca con l'errore che mi da, dato che il problema è in fase di risoluzione del driver JDBC, quindi prima della connessione al database, ma sicuramente quell'8080 è sbagliato...
...ora si trova solo di scoprire su che porta è in asolto MySQL  8)

Grazie mille delle dritte! Dopo aver riavviato con il file /etc/environment cambiato ti farò sapere se funziona!

P.S. Per cambiarlo ho aggiunto la riga
CLASSPATH=$CLASSPATH:/usr/share/java/servlet-2.3.jar:/usr/lib/mysql-connector-java-5.0.6/mysql-connector-java-5.0.6-bin.jar

Spero sia giusto...  :-[

Ciao ciao

Re: Servlet e MySQL: problema apparentemente semplice con il driver JDBC

Inviato: martedì 5 giugno 2007, 13:30
da prampa
mi associo a quanto detto da Massimo S.
Io comunque, preferibilmente, metterei il jar di mysql direttamente nella lib del tuo progetto.
Ma se tu vai nella webapps di tomcat, ed entri nella tua applicazione, nella sottocartella lib esiste il jar di mysql? perche' potrebbe darsi che quando deploy l'applicazione non si porta dietro la libreria. Che ide usi? perche' un conto sono le librerie che l'ide vede e un conto quelle che si porta dietro al momento del deploy.
In ogni caso deve esserci una compatibilità tra i percorsi che usi nell'ide e quelli al momento del deploy.
ciao

Re: Servlet e MySQL: problema apparentemente semplice con il driver JDBC

Inviato: martedì 5 giugno 2007, 13:59
da MarKco
prampa ha scritto: mi associo a quanto detto da Massimo S.
Io comunque, preferibilmente, metterei il jar di mysql direttamente nella lib del tuo progetto.
Ma se tu vai nella webapps di tomcat, ed entri nella tua applicazione, nella sottocartella lib esiste il jar di mysql?
Allora, premetto che ora funziona tutto.  ;D
Avevo già stoppato e riavviato tomcat, sinceramente non capisco cosa posso essere cambiato. Ho fatto un ennesimo reload della pagina e funziona.
Al momento nella cartella lib ho il collegamento al file .jar, come suggeritomi da Massimo.
perche' potrebbe darsi che quando deploy l'applicazione non si porta dietro la libreria. Che ide usi? perche' un conto sono le librerie che l'ide vede e un conto quelle che si porta dietro al momento del deploy.
In ogni caso deve esserci una compatibilità tra i percorsi che usi nell'ide e quelli al momento del deploy.
Ehm... cos'è il deploy? E cos'è un ide?

Re: Servlet e MySQL: problema apparentemente semplice con il driver JDBC

Inviato: martedì 5 giugno 2007, 14:15
da Massimo S.
Potrebbe anche essere che la prima volta sembrava non aver funzionato per colpa della cache del browser.

Un IDE è un Integrated Develpment Environment  ovverò un Ambiente di Sviluppo Integrato cioè un programma che ti aiuta a sviluppare software.
Per Java c'è ne sono molti, ti cito i due Open Source più famosi: Eclipse e NetBeans.

Quando si usa un IDE spesso si ha una dir. di lavoro dive si hanno tutti .java, .jsp, .html ecc. tutti i vari file del progetto.
L'IDE come minimo ti permette di compilare, ovvero di ottenere vari file .class dai file .java, però di solito non la fa direttamente nelle dir. vista da tomcat per le webapps ma in un dir. di lavoro.

Fare il deploy o l'inglesismo deployare significa che l'IDE, dopo aver pronta una struttura di dir. con tutti i .jsp, .html, .jar, .class ecc., prende questa struttura che è la tua web-application e la incastona nell'application server, nel nostro caso Tomcat.

Ciao

Edit: aggiungo che il deploy si può fare anche in altri modi, anche senza IDE.
Ad esempio se ha la struttura di dir. della web-application la si può comprimere dentro un file zip, dandogli però l'estensione war, che non sta per guerra ma per Web Application Archive.
Poi si puo deployare o mettendo questo war nella dir webapps di tomcat o usando l'apposita webapp "manager" di tomcat

Re: Servlet e MySQL: problema apparentemente semplice con il driver JDBC

Inviato: martedì 5 giugno 2007, 14:22
da Giambo
MarKco ha scritto:
Soluzione rapida ma "sporca": Copia il jar in $JAVA_HOME/jre/lib/ext ... Io non ti ho detto niente  :D !
Ehm... come la scopro, la Home di Java?
Hmmm ... prova a dare un "which java" per scoprire dove sta' l'eseguibile di Java. Se non hai successo, prova a cercare sotto /usr/lib (Se la memoria non mi inganna ...)
Comunque tomcat dovrebbe automagicamente "vedere" tutti i jar presenti in $MYAPP/WEB-INF/lib/  :-\ ...
Buono a sapersi  ;D
Comunque non sembra che non veda la servlet, altrimenti mi darebbe un altro errore.
Allora forse tomcat non e' settato correttamente. La tua servlet e' presente sotto $MYAPP/WEB-INF/classes/ ?

Re: Servlet e MySQL: problema apparentemente semplice con il driver JDBC

Inviato: martedì 5 giugno 2007, 15:52
da MarKco
Massimo S. ha scritto: Potrebbe anche essere che la prima volta sembrava non aver funzionato per colpa della cache del browser.
La vedo probabile
Un IDE è un Integrated Develpment Environment  ovverò un Ambiente di Sviluppo Integrato cioè un programma che ti aiuta a sviluppare software.
Per Java c'è ne sono molti, ti cito i due Open Source più famosi: Eclipse e NetBeans.
(...)
Capito  ;)
No, al momento non uso nessun IDE. Per le poche cose cose che devo fare gedit va più che bene.
Fare il deploy o l'inglesismo deployare significa che l'IDE, dopo aver pronta una struttura di dir. con tutti i .jsp, .html, .jar, .class ecc., prende questa struttura che è la tua web-application e la incastona nell'application server, nel nostro caso Tomcat.
Capito. Io compilo a mano e con "javac -d" specifico dove voglio che venga ficcata la classe. I sorgenti li tengo nella cartella tomcat/src/nomeProgetto...

Re: Servlet e MySQL: problema apparentemente semplice con il driver JDBC

Inviato: martedì 5 giugno 2007, 15:56
da MarKco
Hmmm ... prova a dare un "which java" per scoprire dove sta' l'eseguibile di Java. Se non hai successo, prova a cercare sotto /usr/lib (Se la memoria non mi inganna ...)
Alors, "which java" mi restituisce /usr/bin/java.
"whereis java" invece dice

java: /usr/bin/java /etc/java /usr/X11R6/bin/java /usr/bin/X11/java /usr/share/java /usr/share/man/man1/java.1.gz
Comunque tomcat dovrebbe automagicamente "vedere" tutti i jar presenti in $MYAPP/WEB-INF/lib/  :-\ ...

Allora forse tomcat non e' settato correttamente. La tua servlet e' presente sotto $MYAPP/WEB-INF/classes/ ?
Sì sì. Comunque ora funziona, quindi evidentemente trova tutto quanto ciò che gli serve... Ora provo a modificare il database e vediamo se la pagina si aggiorna!

Re: Servlet e MySQL: problema apparentemente semplice con il driver JDBC

Inviato: martedì 5 giugno 2007, 17:04
da Massimo S.
MarKco ha scritto: Alors, "which java" mi restituisce /usr/bin/java.
Occhio che /usr/bin/java è probabilmente un link simbolico a qualcos'altro

Lo puoi vedere con

Codice: Seleziona tutto

ls -l /usr/bin/java

Re: Servlet e MySQL: problema apparentemente semplice con il driver JDBC

Inviato: martedì 5 giugno 2007, 17:06
da MarKco
Massimo S. ha scritto:
MarKco ha scritto: Alors, "which java" mi restituisce /usr/bin/java.
Occhio che /usr/bin/java è probabilmente un link simbolico a qualcos'altro
Hai ragione! Come ho fatto a non pensarci????

Il "java" che uso è /etc/alternatives/java

Re: Servlet e MySQL: problema apparentemente semplice con il driver JDBC

Inviato: martedì 5 giugno 2007, 17:13
da Massimo S.
controlla se pure /etc/alternatives/java è un link e cosi via

Re: Servlet e MySQL: problema apparentemente semplice con il driver JDBC

Inviato: martedì 5 giugno 2007, 17:21
da MarKco
Massimo S. ha scritto: controlla se pure /etc/alternatives/java è un link e cosi via
D'oh  >:(
Che doppia figura di merdissima!  ;D

E' un link, che rimanda ad un altro link, che rimanda ad un altro link, finché... sono tornato indietro!

Il file sembra essere /usr/bin/gij-4.1

Re: Servlet e MySQL: problema apparentemente semplice con il driver JDBC

Inviato: martedì 5 giugno 2007, 17:30
da Massimo S.
MarKco ha scritto: D'oh  >:(
Che doppia figura di merdissima!  ;D
Che fai dici le parolacce, mica si può dire in pubblico la parola "figura" !  ;D
Il file sembra essere /usr/bin/gij-4.1
Stai usando la versione di gnu di java.
So che a molti ha dato problemi.
Se dovesse darli anche a te usa java di SUN

Per sapere come istallarlo e come selezionarlo come predefinito vedi il wiki:
http://wiki.ubuntu-it.org/Java

Re: Servlet e MySQL: problema apparentemente semplice con il driver JDBC

Inviato: martedì 5 giugno 2007, 17:58
da MarKco
Massimo S. ha scritto:
MarKco ha scritto: D'oh
Che doppia figura di merdissima!
Che fai dici le parolacce, mica si può dire in pubblico la parola "figura" !  ;D
Ops  :-[ Che figurina di merdissima, allora!  ;D
Il file sembra essere /usr/bin/gij-4.1

Stai usando la versione di gnu di java.
So che a molti ha dato problemi.
Se dovesse darli anche a te usa java di SUN

Per sapere come istallarlo e come selezionarlo come predefinito vedi il wiki:
http://wiki.ubuntu-it.org/Java
Thanks so much!  (yes)