Avatar billede rasmuslh Nybegynder
08. maj 2004 - 10:26 Der er 26 kommentarer og
1 løsning

Servlet - databaseconnection

Hejsa

jeg sidder og arbjeder på en servlet der skal hente informationer fra en MySQL-DB. Når sender en variabel til Servletten med GET og skal så bruge den variabel i SQL-forespørgsel.

Her er min kode til Servletten:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class ReadDBServlet extends HttpServlet {

  final static String usr = "rlh1";
  final static String url = "jdbc:mysql://mysql.it-c.dk/" + usr;
  final static String pwd = "XXX";

  Connection  db;            // The connection to the database
  Statement    st;            // A statement to run queries with
 
  // Open connection to the database when the servlet object is created
  public void init(ServletConfig config) throws ServletException {
    super.init(config);
    try {
      Class.forName("org.gjt.mm.mysql.Driver");  //loading driver
      db = DriverManager.getConnection(url, usr, pwd); // establish connection
      st = db.createStatement(); //create statement object
    } catch (ClassNotFoundException e) {
      System.out.println("Cannot find the mysql driver");
    } catch (SQLException e) {
      System.out.println("Database error: " + e);
    }
  }

  // Close the connection to the database when the servlet object is destroyed
  public void destroy() {
    try {
      st.close();
      db.close();
    } catch (SQLException e) {
      System.out.println("Database error: " + e);
    }
  }

  // Read from the database
  public void doGet(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {

    String[] number1params = req.getParameterValues("kategori");
    int number1 = Integer.parseInt(number1params[0]);

    res.setContentType("text/html");
    ServletOutputStream out = res.getOutputStream();

    try {
      String query = "SELECT * FROM Film";
      st.execute(query);
      out.println("<html><body>");
      out.println("<h2>Filmtitel</h2><br/>");
      out.println("<ul>");
      ResultSet rs = st.getResultSet();
      while (rs.next()) {
        String titel = rs.getString("Titel");
        out.println("<li>" + titel + "</li>");
      }
      out.println("</ul></body></html>");
      } catch (SQLException e) {
        System.out.println("Database error: " + e);
      }
  }
}

Men når jeg får følgende fejl når servletten kaldes:

java.lang.NullPointerException
    at ReadDBServlet.doGet(ReadDBServlet.java:50)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(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.java:191)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(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:2396)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(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.invokeNext(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:223)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:405)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:380)
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:508)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:533)
    at java.lang.Thread.run(Thread.java:534)

Jeg har testet at DB fungerer så det er ikke problemet!

På forhånd tak!
Rasmus
Avatar billede arne_v Ekspert
08. maj 2004 - 12:18 #1
For at komme videre skal du nok have fat i server output d.v.s.
det som de System.out.println's skriver ud. Så kan vi se om og hvilken
exception der kommer.

Et gæt ville være at servletten ikke kan finde JDBC driver jar filen.
Den skal ligge i webapps/xxxx/WEB-INF/lib
Avatar billede rasmuslh Nybegynder
08. maj 2004 - 12:39 #2
Okay - det lyder som en forklaring. Nu er jeg lige begyndt på at arbejde med Servletter og har kun adgang til at arbejde med dem fra min skole hvor jeg desværre ikke befinder mig lige nu! Så jeg kan først teste det engang i morgen eller mandag!

Jeg har selv lavet et directory i Tomcat folderen hvor jeg har lagt filerne og de eneste filer i den er mine java-filer samt web.xml filen. Kan jeg bare "tage" jar-filen og lægge over i mit directory eller skal jeg rette andre steder.

Undskyld hvis jeg spørger lidt dumt, men har som sagt ikke det store kendskab til det endnu!

Gider du evt. tjekke tråden engang på søndag eller mandag når jeg har testet det så skal du selvfølgelig nok få point! :D
Avatar billede arne_v Ekspert
08. maj 2004 - 12:42 #3
jar filen skal ligge i et lib directory under WEB-INF for at Tomcat kan finde den.
Avatar billede rasmuslh Nybegynder
08. maj 2004 - 12:43 #4
Indeholder den bare en række klasser?
Avatar billede arne_v Ekspert
08. maj 2004 - 12:43 #5
fil struktur skal være som:

minapplikation
___*.jsp
___WEB-INF
______web.xml
______classes
_________minpakke
____________*Servlet.class
____________*Bean.class
______lib
_________*.jar

[underscore sat ind fordi spaces ikke virker godt]
Avatar billede arne_v Ekspert
08. maj 2004 - 12:44 #6
En JDBC driver jar fil indeholder den kode der er nødvendig for at snakke med
en bestemt database.
Avatar billede arne_v Ekspert
08. maj 2004 - 12:45 #7
Jeg er her også søndag og mandag !
Avatar billede rasmuslh Nybegynder
08. maj 2004 - 12:46 #8
Takker og jeg vender tilbage! :D
Avatar billede arne_v Ekspert
08. maj 2004 - 12:49 #9
Og ja en jar indeholder et antal class filer.
Avatar billede rasmuslh Nybegynder
09. maj 2004 - 21:00 #10
Hej Arne
Nu har jeg kopieret den lib-folder der ligger i server-mappen under Apache Installationen over i WEB-INF, men det hjælper ikke. Kan man godt bare bruge den installation eller kan man evt. hente jar-filen et sted på nettet?

På forhånd tak!
Rasmus
Avatar billede arne_v Ekspert
09. maj 2004 - 21:02 #11
Du skal ikke kopiere hel lib folderen over.

Du kan og bør hente MySQL JDBC driver jar fra MYSQL's web-site.
Avatar billede arne_v Ekspert
09. maj 2004 - 21:02 #12
Avatar billede rasmuslh Nybegynder
09. maj 2004 - 21:09 #13
Skal jeg så rette noget i de her linier:

Class.forName("org.gjt.mm.mysql.Driver");  //loading driver
      db = DriverManager.getConnection(url, usr, pwd); // establish connection
      st = db.createStatement(); //create statement object
Avatar billede rasmuslh Nybegynder
09. maj 2004 - 21:09 #14
mest den første linie!
Avatar billede arne_v Ekspert
09. maj 2004 - 21:17 #15
Den vil virke.

Men overvej:

Class.forName("com.mysql.jdbc.Driver");

[der er ved at være nogen år siden MySQL selv overtog driveren]
Avatar billede rasmuslh Nybegynder
09. maj 2004 - 21:40 #16
Okay - jeg er hjemme igen nu. Så jeg tester det først imorgen, men du skal være dne første til at høre om det virker! ;-D
Avatar billede rasmuslh Nybegynder
10. maj 2004 - 09:13 #17
Hej Arne.

Jeg får stadigvæk den samme fejl. Jeg ahr lagt den her fil i lib-folderen:
mysql-connector-java-3.0.11-stable.tar.gz.

Kan jeg mangle andet eller er fejlen et andet sted?

På forhånd tak!
Rasmus
Avatar billede arne_v Ekspert
10. maj 2004 - 09:29 #18
Det er mysql-connector-java-3.0.11-stable.jar der skal ligge i det directory

gzip -d og tar xf (ller hent zip versionen istedetfor og unzip)
Avatar billede rasmuslh Nybegynder
10. maj 2004 - 09:56 #19
Nu har jeg hentet zip-filen og unzipped den! Det er stadigvæk det samme!!!! :-(
Avatar billede arne_v Ekspert
10. maj 2004 - 10:00 #20
mysql-connector-java-3.0.11-stable-bin.jar ligger i WEB-INF/lib ?
Avatar billede arne_v Ekspert
10. maj 2004 - 10:01 #21
Og du har genstartet Tomcat ?
Avatar billede rasmuslh Nybegynder
10. maj 2004 - 10:08 #22
ja - til begge to!

Får den helt samme fejl!
Avatar billede arne_v Ekspert
10. maj 2004 - 10:12 #23
Og du kalder servletten med en URL som ender på ?kategori=n
Avatar billede rasmuslh Nybegynder
10. maj 2004 - 10:32 #24
Her er min html side:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Velkommen til biobooking</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="index.css" rel="stylesheet" type="text/css">
</head>

<body>

    <div class="center">
        <H1>Velkommen til biobookingballade</H1>

        <FORM ACTION="http://localhost:8080/servlets/servlet/ReadDBServlet" METHOD="GET">
            Vælg filmkategori: <INPUT TYPE="TEXT" NAME="kategori"><br/>
        <INPUT TYPE=SUBMIT VALUE="Add the numbers">
        </FORM>       
    </div>
</body>
</html>
Avatar billede rasmuslh Nybegynder
10. maj 2004 - 10:32 #25
Og her er min web.xml-fil:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>

  <servlet>
    <servlet-name>ReadDBServlet</servlet-name>
    <servlet-class>ReadDBServlet</servlet-class>
  </servlet>

  <servlet>
    <servlet-name>AdditionServlet</servlet-name>
    <servlet-class>AdditionServlet</servlet-class>
  </servlet>

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

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

 
  <session-config>
    <session-timeout>
            30
        </session-timeout>
  </session-config>
  <welcome-file-list>
    <welcome-file>
            index.jsp
        </welcome-file>
    <welcome-file>
            index.html
        </welcome-file>
    <welcome-file>
            index.htm
        </welcome-file>
  </welcome-file-list>
</web-app>
Avatar billede rasmuslh Nybegynder
10. maj 2004 - 11:38 #26
Ahhhh - jeg er verdens største klovn!!!! Jeg fandt log-filen for Tomcat og her stod der Acces denied for User + database.

Jeg har selvfølgelig ikk navngivet min database med mit usernavn derfor skulle den her linie:e

  final static String url = "jdbc:mysql://mysql.it-c.dk/" + usr;

ændres til:

  final static String url = "jdbc:mysql://mysql.it-c.dk/boobook; som er navnet på min databse.

Arne skriv lige et svar så får du point for din udholdenhed! :-D
Avatar billede arne_v Ekspert
10. maj 2004 - 12:42 #27
Ah - OK
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester