# NullPointer und ClassNotFound bei JSP



## Cynric (25. Mai 2012)

Hallo zusammen,

ich habe folgendes Problem:
Ich bin gerade dabei, einen Online-Shop zu programmieren und benutze dafür JSPs und Servlets.
Ich habe außerdem noch eine Klasse, die auf eine MySQL-Datenbank zugreift und dort gewisse Daten für die Ausgabe in eine JSP ausliest.
Das klappt soweit an sich auch, also wenn ich die Klasse selbst teste und die SQL-Results per System-Print ausgebe, kommen die auch so, wie sie sollen.
Nur wenn ich jetzt diese Klasse per <jsp:useBean id="klasse" class="package.Class"> einbinde und dann per <% out.write(klasse.getResult()); %> ausdrucken lassen will, wirft mir der Server eine ClassNotFoundException für "com.mysql.jdbc.Driver" und eine NullPointerException an der Stelle, wo ich "connection.createStatement()" aufrufe.

Bitte was mache ich falsch?


----------



## Fant (25. Mai 2012)

Hast du denn den passenden JDBC-Treiber im Classpath?

Gruß Fant


----------



## Cynric (25. Mai 2012)

Muss ja an sich so sein, sonst käme doch beim Testen auch schon die Fehlermeldung, oder nicht?
Also, dann würde er doch gar nicht auf die Datenbank zugreifen, das tut er aber, nur eben nicht beim Aufruf in der JSP-Datei.

Und ja, den Treiber hab ich in den Classpath gepackt bzw. als eigenes Projekt im Build Path eingebunden.
Oder liegt genau da der Fehler?^^


----------



## Fant (25. Mai 2012)

Ja, du hast Recht, da hab ich deine Frage nicht aufmerksam genug gelesen...

Zeig einfach mal deine Bean und die Klasse her. Mit den gegebenen Informationen hab ich zZt keine Idee...

Grundsätzlich sind Scriptlets aber nicht so das gelbe vom Ei. Gibt es einen speziellen Grund, wieso du drauf zurückgreifst?


----------



## Fant (25. Mai 2012)

...schau aber trotzdem mal nach, ob nach dem build der Treiber auch wirklich unter /WEB-INF/lib zu finden ist.


----------



## Cynric (25. Mai 2012)

Hier mal die DAO-Klasse

```
package dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;

public class AngebotDAO {
	
	private static AngebotDAO instance;
	private Connection connection;
	private String driver = "com.mysql.jdbc.Driver";
	private LinkedList<String> resultList = new LinkedList<String>();
	
	public AngebotDAO() {
		connectToDatabase();
		launchStatement();
	}
	
	public static AngebotDAO getInstance() {
		if (instance == null) {
			instance = new AngebotDAO();
		}
		return instance;
	}
	
	private void connectToDatabase() {
	    try {
	    	Class.forName(driver);
			connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/sofashop?profileSQL=true", "root", null);
		} 
	    catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public void launchStatement () {
		String sql = "SELECT * FROM ecksofas";
		ResultSet result = null;
		String resultString = "";
		try {
			Statement statement = connection.createStatement();
			result = statement.executeQuery(sql);
			
			while (result.next()) {
				resultString = "<img src='" + result.getString(6) + "' /><br />" +
							   result.getString(2) + "<br />" +
							   result.getString(5) + "<br />" +
							   "Preis: " + result.getString(3) + "&euro;";
				resultList.add(resultString);
			}
			
			statement.close();
			connection.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
				
	}
	
	public LinkedList<String> getResultList() {
		return resultList;
	}

}
```

Hier die Klasse, die ich in der JSP aufrufe:


```
package angebote;

import util.RandomUtils;
import dao.AngebotDAO;


public class Angebot  {

	private String imageUrl = "";
	private String type = "";
	private String price = "";
	private String description = "";
	
	private AngebotDAO dao = AngebotDAO.getInstance();
	private String[] angebote;
	
    public Angebot() {
    	initializeAngebot();
    }
    
    public void initializeAngebot() {
    	angebote = new String[dao.getResultList().size()];
    	int i=0;
    	for (String s : dao.getResultList()) {
    		angebote[i] = s;
    		i++;
    	}
    }
    
    public String getAngebot() {
    	
    	String angebot = "";
    	for (int i=0; i<3; i++) {
    		angebot += RandomUtils.randomElement(angebote);
    		angebot += "<br />";
    	}
    	
    	return angebot;
    }

	public String getImageUrl() {
		return imageUrl;
	}

	public String getType() {
		return type;
	}

	public String getPrice() {
		return price;
	}

	public String getDescription() {
		return description;
	} 

}
```

und hier die JSP (auf der Hauptseite mach ich da nur einen <jsp:include>)


```
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<jsp:useBean id="angebot" class="angebote.Angebot" />
<div align="center">
<% out.write(angebot.getAngebot()); %>
</div>
```

Warum ich darauf zurückgreife?
Naja, ich weiß nich, ich find diese Art der Webprogrammierung eig. relativ komfortabel, mit JSF z.B. komm ich ned so wirklich klar.
Und ich hab auch nich viel Lust, mich in Spring oder so reinzulesen xD


----------



## F.S.WhiTeY (26. Mai 2012)

Warum du den Fehler bekommst kann ich dir nun nicht sagen aber ich kann dir folgenden tipp geben:

Ein neues Project mit einer nicht mehr unterstützten Technologie schreiben zu wollen ist eine schlechte Idee!

JSP: JSP und die JSTL werden nur noch weitergeführt um ältere Projekte/Programme aufrecht halten zu können. also reine Kompatibilität. ERGO: Nimm JSF 2.0! Wenn du dazu noch ein paar Frameworks benutzt kann kaum noch was schief gehen 
Für dein vorhaben ist Spring noch ganz interessant. Alleine Spring-Security kann dir sehr viel nutzen, wenn du User gegen eine Datenbank authentifizieren willst. 

DAO: Man schreibt eigentlich keine DAO's mehr. Du solltest dir mal JPA und/oder Hibernate anschauen.
Is schon cool wenn man volles OOP durchziehen kann während man mit einer DB arbeitet.

Ich schreibe auch gerade ein Projekt mit einer Datenbank und ich muss nicht eine Zeile SQL-code als query schreiben  

Also bevor du dich da weiter verstrickst, denk doch mal darüber nach ob du nicht mit etwas aktuellerem arbeiten willst als nativen querys und JSP  

und Faulheit ist keine ausrede ;P Wer nicht mit der zeit geht, geht mit der zeit 

LG

WhiTeY


----------



## Cynric (26. Mai 2012)

Warum sollte man keine DAOs mehr schreiben?
Also ich finde, dass die für eine saubere Architektur noch relativ wichtig sind.
Ja ich weiß, JSF 2.0 is was tolles, aber ich werd damit nich wirklich warm und dass JSPs derart veraltet sein sollen, wäre mir neu


----------



## Cynric (26. Mai 2012)

@Fant: Hab jetz mal geschaut, der Treiber ist NICHT unter WEB-INF/lib zu finden, dann wirds wohl daran liegen^^

Danke schonmal!


----------



## Cynric (26. Mai 2012)

Hmm, aber irgendwie krieg ichs grad nicht hin, dass in lib was rein kommt.
Kann mir wer sagen, wie ich den Classpath dann so einstelle, dass es passt?^^


----------



## Fant (26. Mai 2012)

Benutzt du irgendeine IDE? Wenn ja welche und wo liegt die Treiber-jar? 
Unter Netbeans z.B. muss ich den Treiber in meinem Projekt nur in den "Libraries"-Ordner packen, damit er mit ausgeliefert wird. Unter Eclipse klappt es z.B., wenn du in deinem Projekt-Folder die jar direkt nach WEB-INF/lib schiebst.
Wenn du den build manuell machst, dann kopier notfalls die Treiber-jar manuell an die passende Stelle deines WAR(?)


----------



## Cynric (27. Mai 2012)

Ja, ich benutze Eclipse.
Sprich, ich muss dann nur die Driver.jar in den lib-Ordner packen und dann sollte es gehen?


----------



## Fant (27. Mai 2012)

Ja genau. Direkt im offenen Projekt-Verzeichnis nach /WebContent/WEB-INF/lib kopieren. Das geht sogar per Copy&Paste.

Wenn es danach immer noch nicht klappt, dann sag noch mal Bescheid.


----------



## Cynric (31. Mai 2012)

Hat geklappt - Danke!


----------

