PDA

View Full Version : [JSP] Progetto .war con accesso al DB: su JBoss funziona su Tomcat no


fbcyborg
27-11-2011, 14:28
Salve a tutti,

sto impazzendo di fronte al seguente problema: ho un progetto perfettamente funzionante su JBoss AS 7, ma se voglio farlo girare su tomcat non funziona.
L'applicazione è composta da delle JSP e qualche javascript e dopo aver inserito i parametri di login in un semplice form html, dovrei essere reindirizzato ad una pagina che mi mostra il risultato di una query. Ciò avviene, come dicevo, se faccio il deploy su JBoss, ma se provo a caricare lo stesso file .war nella directory CATALINA_HOME di Tomcat non mi mostra quella pagina e cade in una SQLException che sinceramente neanche capisco.

Da cosa può dipendere?
Ho già letto questo (http://www.mulesoft.com/tomcat-mysql) ma non sono riuscito a risolvere un bel niente. Neanche inserendo il file mysql-connector-java-5.1.18-bin.jar nella directory /usr/share/tomcat-6/lib.

gokan
27-11-2011, 19:59
Che tipo di errore ottieni di preciso?
Quasi sicuramente ti manca qualche libreria..

fbcyborg
27-11-2011, 20:47
Anche io ho pensato a qualche libreria mancante, però l'unica esterna che uso è quella del mysql jdbc connector e l'ho copiata in /usr/share/tomcat-7/lib/ (ho aggiornato tomcat, pensando che potessi risolvere ma non è cambiato nulla).

Dunque, nella pagina che non riesco a caricare ho una sezione così:

try {
[...]
}catch (SQLException s){
response.sendRedirect("error.jsp");
}

Nell'intestazione ho messo:
<%@ page errorPage="error.jsp" %>

E la jsp error.jsp è così scritta:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page isErrorPage="true" %>
<%@ page import="java.io.PrintWriter" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Error</title>
</head>
<body>
<%
exception.printStackTrace(new PrintWriter(out));
%>
</body>
</html>

L'errore che esce fuori è il seguente:
exception

org.apache.jasper.JasperException: java.lang.NullPointerException
org.apache.jasper.servlet.JspServletWrapper.handleJspException(Unknown Source)
org.apache.jasper.servlet.JspServletWrapper.service(Unknown Source)
org.apache.jasper.servlet.JspServlet.serviceJspFile(Unknown Source)
org.apache.jasper.servlet.JspServlet.service(Unknown Source)
javax.servlet.http.HttpServlet.service(Unknown Source)

root cause

java.lang.NullPointerException
org.apache.jsp.error_jsp._jspService(error_jsp.java:79)
org.apache.jasper.runtime.HttpJspBase.service(Unknown Source)
javax.servlet.http.HttpServlet.service(Unknown Source)
org.apache.jasper.servlet.JspServletWrapper.service(Unknown Source)
org.apache.jasper.servlet.JspServlet.serviceJspFile(Unknown Source)
org.apache.jasper.servlet.JspServlet.service(Unknown Source)
javax.servlet.http.HttpServlet.service(Unknown Source)

gokan
28-11-2011, 14:27
Sembra tutto corretto..se per caso nella prima pagina fai il try-catch, esce fuori lo stesso risultato?

fbcyborg
28-11-2011, 14:40
No aspetta, la prima pagina è quella che appunto non riesco a caricare ed è quella che sputa fuori quell'eccezione.
Per prima pagina intendo la prima jsp effettiva che carico.

Lo schema è questo:

1) login.jsp (non è altro che una pagina di puro html che fa una post a 2))
2) listato.jsp (mostra il contenuto di una tabella all'interno di input box)
3) update.jsp (è una jsp che contiene le query di update sulla tabella, che prende i valori del listato nella jsp al punto 2 tramite una POST e poi rimanda a listato.jsp)

Io non riesco a caricare listato.jsp, ed è lì che c'è il try catch. Se vado con JBoss, funziona, con Tomcat no.

Non so, è corretto usare la libreria mysql-connector-java-5.1.18-bin.jar ?
Penso di sì.

Fra l'altro sto cercando di impostare Tomcat 7 in Eclipse, per provare direttamente da lì, ma non ci riesco.

gokan
28-11-2011, 14:50
Ok, però nel messaggio di errore sopra, non mi sembra ci siano errori di tipo SQL.

Per tomcat in eclipse dovrebbe essere facile...
Add new server, scegli tomcat 7 se esiste altrimenti scarichi l'additional adapter.

A questo punto dovrai farlo puntare alla directory in cui hai unzippato tomcat e dovrebbe andare..

ciao

fbcyborg
28-11-2011, 15:56
Perfetto, l'ho aggiunto come server ed ora sto testando l'applicazione su Tomcat 7.

Ho riabilitato la stampa dell'errore, e rompe sempre le scatole qui:

org.apache.jasper.JasperException: An exception occurred processing JSP page /error.jsp at line 14

11: </head>
12: <body>
13: <%
14: exception.printStackTrace(new PrintWriter(out));
15: %>
16: </body>
17: </html>
Sembra come se non interpreti la jsp. Possibile?
Infatti non legge nemmeno l'index.jsp all'interno della dir webapps/ROOT.
Dice che non è presente, invece c'è.

In questo caso sto usando Tomcat scaricato dal sito come file tar.gz, e non quello che ho installato tramite il package manager della mia distribuzione, che invece le jsp le carica senza problemi.. Il server si avvia!

EDIT: cavolo, se lo avvio da riga di comando e non da eclipse, index.jsp funziona. Provo a vedere che succede invece, con la mia applicazione...
Niente: mi da l'errore qui sopra.

Non vorrei che sia questo (http://forum.studentidia.org/topic/21909-eccezione-orgapachejasperjasperexception/page__view__findpost__p__168395) il problema, ma non ho capito allora come risolverlo.

fbcyborg
28-11-2011, 18:41
Sinceramente mi sto perdendo.

Premesso che a quanto mi sembra di capire, sviluppare un'applicazione web su JBoss è diverso che svilupparla per Tomcat, e che questa cosa mi stia poco simpatica, mi sto imbattendo in un semplice esempio per vedere se riesco a leggere dati da DB usando Tomcat.

Ho letto questa documentazione (http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html) e usato questo esempio (http://www.danhendricks.com/source-code/java/jsp-mysql-tutorial/) per fare una query al DB.

Quindi ecco cosa ho fatto.


Ho copiato il file mysql-connector-java-5.1.18-bin.jar nella directory webapps/ROOT/WEB-INF/lib/
Ho inserito il seguente codice nel file conf/context.xml all'interno del tag <Context>:
<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/javatest"/>
Ho aggiunto le seguenti righe nel file webapps/ROOT/WEB-INF/web.xml all'interno del tag <web-app>:
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
(Non so se va cambiato il <res-ref-name>)
Infine ho provato la seguente JSP:
<%@ page import="java.sql.*" %>
<%
String connectionURL = "jdbc:mysql://localhost:3306/mydatabase?user=;password=";
Connection connection = null;
Statement statement = null;
ResultSet rs = null;
%>



<%
Class.forName("com.mysql.jdbc.Driver").newInstance();
connection = DriverManager.getConnection(connectionURL, "", "");
statement = connection.createStatement();
rs = statement.executeQuery("SELECT * FROM mytable");

while (rs.next()) {
out.println(rs.getString("myfield")+"");
}

rs.close();
%>
(Ovviamente riadattandola al mio caso)


Vado all'URL della JSP e ottengo sempre questi errori:
HTTP Status 500:
org.apache.jasper.JasperException: javax.servlet.ServletException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549)
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)

Poi le root causes sono:

javax.servlet.ServletException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
java.net.ConnectException: Connection refused


A questo punto non so cosa fare. :muro: :muro: :muro:

gokan
29-11-2011, 10:37
Ciao, la parte 2 e 3 non ti serve se pensi di accedere al DB con il classico DriverManager. La url jndi ti serve quando vuoi referenziare il data source tramite lookup.

Ho fatto un progettino web con tomcat 6 su eclipse, incollato la tua jsp (con le modifice ovvie) e tutto funziona.
Ho inserito il connector mysql dentro WEB-INF/lib

Se ti interessa, eccolo:
http://www.megaupload.com/?d=9ETIUUVA

Lo puoi importare come progetto eclipse.

Ciao

fbcyborg
29-11-2011, 12:24
Grazie per le conferme sulla parte 2 e 3.

Ho provato ad importare il progetto su Eclipse, e su tomcat non mi funziona!!! :mc: :mc:

Mi si pianta sempre alla riga in cui si fa la getConnection().
org.apache.jasper.JasperException: An exception occurred processing JSP page /test.jsp at line 22

E la urlConnection che uso è stragiusta! Infatti come la lancio su JBoss va che è una meraviglia.

A questo punto credo che ci sia qualche problema di configurazione di Tomcat, o sul mio sistema.

La versione che ho scaricato è questa (http://mirror.nohup.it/apache/tomcat/tomcat-7/v7.0.23/bin/apache-tomcat-7.0.23.tar.gz).

Ora provo su tomcat in una macchina windows e vediamo che cosa succede.
EDIT: su Windows XP con tomcat a 32 bit l'applicazione funziona!

gokan
29-11-2011, 13:12
Finalmente ;)
Io, per il mio test ho usato tomcat6 su windows 7 ed eclipse galileo.

Ciauz

fbcyborg
29-11-2011, 13:45
E mi funziona anche su windows 7 con tomcat 7.

Quindi ora devo capire perché sulla mia Gentoo Linux non funziona.
Sicuro c'è qualche impiccio con la configurazione, anche se la cosa strana è che non funziona sia che io usi l'installazione di tomcat che ho fatto con portage sia che io usi l'installazione di tomcat che ho scaricato direttamente dal sito.

[...]

Azz... Mentre scrivevo ho fatto una prova di nuovo su Gentoo dove non mi funzionava, e ora funziona! :eek: :eek: :eek:
Giuro che non ho cambiato alcuna impostazione in tomcat.
Fra l'altro credevo fosse un problema di JRE_HOME, che è settata su "/usr".

Ho scoperto qual'era il problema. La stringa per la connessione al DB, scritta in questo modo non va bene:
"jdbc:mysql://localhost/mydb"

mentre invece scrivendola così funziona:
"jdbc:mysql://192.168.1.100/mydb"

fbcyborg
29-11-2011, 15:57
Finalmente ho deployato l'applicazione sul server di produzione e funziona!
C'è solo una cosa che non capisco: quando faccio il login sul database, la prima volta non funziona, la seconda sì!
Troppo strano! Eppure mi sono assicurato che username e password fossero scritti giusti.