NullPointer und ClassNotFound bei JSP

Cynric

Aktives Mitglied
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?
 

Cynric

Aktives Mitglied
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

Bekanntes Mitglied
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

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

Cynric

Aktives Mitglied
Hier mal die DAO-Klasse
Java:
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:

Java:
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>)

HTML:
<%@ 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

Bekanntes Mitglied
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 :D

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

LG

WhiTeY
 
Zuletzt bearbeitet:

Cynric

Aktives Mitglied
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

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

Danke schonmal!
 

Cynric

Aktives Mitglied
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

Bekanntes Mitglied
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(?)
 

Fant

Bekanntes Mitglied
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.
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben