Java HTTP Status 500 bei Try Catch Block

furryhamster

Lt. Commander
Registriert
Okt. 2008
Beiträge
1.100
Hi,

habe eine jsp webapplikation. Da ich auch datenbankzugriffe mache, habe ich z.b. die verbindungsherstellung mit einem try catch block umgeben um Fehler abzufangen. Jedoch erhalte ich sobald ich dann ständig bei schnellem refreshen der seite einen HTTP Status 500 Fehler.

So sieht mein try catch block aus:
Code:
    try {
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "");
    Statement stmt = conn.createStatement(); }
	catch(Exception e){
		out.println(e.getMessage());
		}%>
 
und an welcher stelle wirft er den fehler? ich vermute mal, dass du nicht 2mal eine verbindung aufbauen kannst...
 
habe eine index datei, die je nach get parameter eine andere include datei ladet. die datenbankverbindung wird jedoch immer hergestellt und nur bei bestimmten include dateien geschlossen. aber auch wenn die datenbankverbindung geschlossen wird, tritt dieser fehler auf.

der fehler tritt zudem auf der gesamten seite auf. je langsamer ich refreshe oder einen anderen link aufrufe, desto geringer ist die wahrscheinlichkeit für den fehler
 
ok. ich versuchs nochmal: wenn du weißt, dass es innerhalb diesen try/catch block passiert, wie wäre es denn, wenn du uns mal die exception zeigst...außerdem wäre immernoch die zeile interessant.

btw: schonmal was von debug gehört ;)

warum schließt du überhaupt die db-verbindung? üblicherweise kann die "ewig" offen bleiben. ist sogar besser, denn im falle des falles musst du nicht ständig auf/zu/auf/zu usw.
 
debug hab ich schon gehört. bei jsp hab ich nur den bogen noch nicht so ganz raus ;)

hier mal der fehler
Code:
exception

org.apache.jasper.JasperException: Unable to compile class for JSP: 

An error occurred at line: 11 in the jsp file: /content/buecher-content.jsp
stmt cannot be resolved
8: 			<td><b>Verlag</b></td>
9: 			<td><b>ISBN</b></td>
10: 		</tr>
11: 		<% ResultSet rs = stmt.executeQuery("select * from artikel");
12: 		while (rs.next()) {
13: 			out.println("<tr><td>" + rs.getString(2) + "</td><td>" + rs.getString(3) + "</td><td>" + rs.getString(4) + "</td><td>" + rs.getString(7));
14: 		} %>


An error occurred at line: 27 in the jsp file: /content/artikel-anlegen-content.jsp
stmt cannot be resolved
24: 	if (request.getParameter("buchsubmit") != null) 
25: 		{
26: 			try{
27: 			int rs = stmt.executeUpdate("INSERT INTO artikel (bezeichnung, autor, verlag, art, isbn) values ('" + request.getParameter("buchtitel") + "', '" + request.getParameter("autor") + "', '" + request.getParameter("verlag") + "', 'Buch', '" + request.getParameter("isbn") + "') ");
28: 	
29: 			out.println("<p style='color:red; font-size:130%;'>Buch erfolgreich angelegt</p>");}
30: 			catch(Exception e){


An error occurred at line: 38 in the jsp file: /content/artikel-anlegen-content.jsp
stmt cannot be resolved
35: 	if (request.getParameter("cdsubmit") != null) 
36: 	{
37: 		try{
38: 		int rs = stmt.executeUpdate("INSERT INTO artikel (bezeichnung, autor, ean) values ('" + request.getParameter("cdtitel") + "', '" + request.getParameter("kuenstler") + "', '" + request.getParameter("ean") + "', 'CD') ");
39: 
40: 		out.println("<p style='color:red; font-size:130%;'>CD erfolgreich angelegt</p>");
41: 		}

Was mich etwas stutzig macht ist, dass er versucht auf die buecher-content.jsp und artikel-anlegen-content.jsp versucht zuzugreifen bzw dort fehler anzeigt, obwohl diese beiden dateien (eigentlich) gar nicht included werden an der stelle wo der fehler auftrat
 
furryhamster schrieb:
Code:
stmt cannot be resolved

ein compile fehler ... das hat nichts mit try/catch zu tun. was ist denn stmt bzw. woher soll die jsp das bekommen?


im übrigen hoffe ich, dass der code fürs lernen (schule/ausbildung) ist. direkt im jsp eine db-verbindung zeugt nicht gerade von guter qualität...

mal ein paar dinge zum lesen/weiterbilden (für deinen speziellen fall)
SQL-Injection
MVC
DRY
SRP
 
stmt sind die select- statements also z.b. select * from artikel, die auch direkt abgesetzt werden. komischerweise tritt der fehler nur mit dem try catch block auf. sonst laufen alle select / insert statements fehlerfrei.

ist auch nur für ne projektarbeit ^^. werde mir trotzdem mal deine links durchlesen. mir gefällt das bis jetzt auch noch nicht so ganz mit dem verbindungsaufbau

edit: kannst du mir mal stichwort geben wie ich die sql verbindung auslagere bzw in was für einer datei? sollte ich die datei vlt eher als servlet aufbauen? in den links konnte ich nur gründe für eine auslagerung finden.
 
Zuletzt bearbeitet:
das kommt immer auf die zugrunde liegende architektur und die verwendeten frameworks an.

bei MVC würde sowas klar in den controller passen. allerdings solltest du im sinne von DRY eine schnittstelle (bspw. neue klasse) für die datenbankverbindung bauen. üblicherweise macht der controller sowas wie "nimm benutzerdaten, press die in ein model und gibt die irgendwo hin zum abspeichern" (stark vereinfacht).

die datenbankverbindungsklasse würde dann bspw. solch ein model (objekt) erhalten, alle notwendigen informationen herausnehmen und die dann über die connection abspeichern. dabei kann natürlich wieder SRP angewandt werden, d.h. es gibt neue klassen, die einzelne modelklassen abzuspeichern.

all das soll aber nur ein kleiner ausblick sein. es gibt sehr gute frameworks (bspw. hibernate, spring, eclipselink etc.), die in größeren projekten solche komplexen aufgaben übernehmen.

der neuste versuch, sowas in einen standard zu verpacken, heißt JPA - Java Persistence Api und ist teil von Java EE 6.

allerdings ist das schon highlevel. wenn du also "nur schüler der 11. klasse" bist und gedenkst, informatik sowieso nicht großartig weiter zu verfolgen, dann dürfte das eher der overkill sein.
 
stmt existiert nach dem try-catch block gar nicht mehr, so klappts:

Code:
    Statement stmt;
    try {
      Class.forName("com.mysql.jdbc.Driver");
      Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "");
      stmt = conn.createStatement(); }
    catch(Exception e){
        out.println(e.getMessage());
    }%>

stmt kann aber auch null sein falls Verbindung fehlgeschlagen ..

also sollten in spätere Blöcke abfragen rein
if (stmt != null) { ..
 
lynxx schrieb:
stmt existiert nach dem try-catch block gar nicht mehr, so klappts

stmt kann aber auch null sein falls Verbindung fehlgeschlagen ..

korrekterweise existiert stmt (es ist außerhalb des Scopes des try-catch definiert worden), kann bei einer Exception jedoch nie != null gewesen sein.
Würde Class.forName oder DriverManager.getConnection die Exception werfen, würde stmt nie etwas zugewiesen.
Schmeißen beide aber keine Exception und es fliegt eine, so kann dies nur von conn.createStatement passieren, wodurch stmt nie einen Wert zugewiesen bekommen kann.
 
@ManOki:
danke für den Ausblick. Da es sich um Gruppenarbeit handelt werde ich mal schauen wie wir es umsetzen.

@lynxx:
läuft so leider auch nicht.

Seitdem ich gestern noch paar Seiten implementiert habe und den try catch block erstmal außen vor gelassen habe, scheint es heute gar nicht mehr mit dem try catch block zu funktionieren. ich erhalte ständig die oben genannten fehler und zusätzlich erhalte ich manchmal nach ein paar refresh folgendes:

Code:
HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: org.apache.jasper.JasperException: Unable to load class for JSP
	org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:156)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

org.apache.jasper.JasperException: Unable to load class for JSP
	org.apache.jasper.JspCompilationContext.load(JspCompilationContext.java:620)
	org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:144)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

java.lang.ClassNotFoundException: org.apache.jsp.index_jsp
	java.net.URLClassLoader$1.run(Unknown Source)
	java.security.AccessController.doPrivileged(Native Method)
	java.net.URLClassLoader.findClass(Unknown Source)
	org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:134)
	org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:66)
	org.apache.jasper.JspCompilationContext.load(JspCompilationContext.java:618)
	org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:144)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
 

Ähnliche Themen

Zurück
Oben