# MYSQL-Zugriff mittels einer Java-Bean



## Julia Schulz (8. Mrz 2008)

Hi ich möchte  gerne über eine Java BEAN eine Datenbank -Verbindung zu einer MYSQL Datenbank erzeugen allerdings wenn ich in Easy Eclipse das ganze ausführen möchte bekomm ich folgende Fehlermeldung . Da kommt ständig die Meldung Fehler in line of code was aber nicht sein kann da ich diese Beispiele von einem Buch verwende. Ist mir nicht ganz klar wo da der Fehler liegen könnte? Vl weis jemand aus em Forum wo der Fehler sein könnte ????

Beide JAVA Dateien ( lesenDB.jsp und DBZugriff befinden sich im package namens DB.

*
Fehleranzeige:
*


```
--------------------------------------------------------------------------------

type Exception report

message 

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

exception 

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

An error occurred at line: 30 in the jsp file: /lesendb.jsp
benutzernr cannot be resolved
27: String benutzernr = tabelleBenutzer.getString("BENUTZERNR");
28: String pseudonym = tabelleBenutzer.getString("PSEUDONYM");%>
29: <tr>
30: <td><%=benutzernr %></td>
31: <td><%=pseudonym %></td>
32: <td><%=tabelleBenutzer.getString("PASSWORT")%></td>
33: </tr>


An error occurred at line: 31 in the jsp file: /lesendb.jsp
pseudonym cannot be resolved
28: String pseudonym = tabelleBenutzer.getString("PSEUDONYM");%>
29: <tr>
30: <td><%=benutzernr %></td>
31: <td><%=pseudonym %></td>
32: <td><%=tabelleBenutzer.getString("PASSWORT")%></td>
33: </tr>
34: <%catch} %>


An error occurred at line: 34 in the jsp file: /lesendb.jsp
Syntax error on token "catch", { expected
31: <td><%=pseudonym %></td>
32: <td><%=tabelleBenutzer.getString("PASSWORT")%></td>
33: </tr>
34: <%catch} %>
35: 
36: 
37: 


An error occurred at line: 34 in the jsp file: /lesendb.jsp
Syntax error, insert "}" to complete Block
31: <td><%=pseudonym %></td>
32: <td><%=tabelleBenutzer.getString("PASSWORT")%></td>
33: </tr>
34: <%catch} %>
35: 
36: 
37: 


An error occurred at line: 34 in the jsp file: /lesendb.jsp
Syntax error, insert "Finally" to complete TryStatement
31: <td><%=pseudonym %></td>
32: <td><%=tabelleBenutzer.getString("PASSWORT")%></td>
33: </tr>
34: <%catch} %>
35: 
36: 
37: 



An error occurred at line: 97 in the generated java file
Syntax error on token "catch", Identifier expected


An error occurred at line: 99 in the generated java file
out cannot be resolved


An error occurred at line: 99 in the generated java file
_jspx_out cannot be resolved


An error occurred at line: 100 in the generated java file
out cannot be resolved


An error occurred at line: 100 in the generated java file
out cannot be resolved


An error occurred at line: 101 in the generated java file
out cannot be resolved


An error occurred at line: 102 in the generated java file
_jspx_page_context cannot be resolved


An error occurred at line: 102 in the generated java file
_jspx_page_context cannot be resolved


An error occurred at line: 104 in the generated java file
Syntax error on token "finally", { expected


An error occurred at line: 105 in the generated java file
_jspxFactory cannot be resolved


An error occurred at line: 105 in the generated java file
_jspxFactory cannot be resolved


An error occurred at line: 105 in the generated java file
_jspx_page_context cannot be resolved

Stacktrace:
	org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:93)
	org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
	org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:435)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:298)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:277)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:265)
	org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:564)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:302)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)


note The full stack trace of the root cause is available in the Apache Tomcat/5.5.26 logs.
```


Also den Treiber hab ich selbstverständlich importiert das is der MYSQL Treiber mysq-connector 5.0.8.




*Ich poste mal meine DB:*

-- phpMyAdmin SQL Dump
-- version 2.11.4
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Erstellungszeit: 08. März 2008 um 16:01
-- Server Version: 5.0.51
-- PHP-Version: 5.2.5

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Datenbank: `dbbenutzer`
--

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `benutzer`
--

CREATE TABLE IF NOT EXISTS `benutzer` (
  `benutzernr` int(11) NOT NULL,
  `pseudonym` varchar(10) NOT NULL,
  `passwort` varchar(6) NOT NULL,
  PRIMARY KEY  (`benutzernr`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Daten für Tabelle `benutzer`
--

INSERT INTO `benutzer` (`benutzernr`, `pseudonym`, `passwort`) VALUES
(1, 'tom', 'test'),
(2, 'uli', 'test'),
(3, 'klaus', 'test');


*
Hier kommt dann meine lesendb.jsp:*



```
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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>JSP-Beispiel: Lesen einer Datenbank</title>
</head>
<body>




 Inhalt der benutzer-Datenbank</p>
<table border="1" cellpadding="0" cellspacing="0">

<tr>

<td>Benutzer-Nr</td>
<td>Pseudonym</td>
<td>Passwort</td>
</tr>

<jsp:useBean id="eineDB" class="DB.DBZugriff" />
// Dann befindet sich das Ergebnis in ein Objekt der Klasse ResultSet
<% java.sql.ResultSet tabelleBenutzer = eineDB.leseDB(); %>
while (tabelleBenutzer.next())
{
String benutzernr = tabelleBenutzer.getString("BENUTZERNR");
String pseudonym = tabelleBenutzer.getString("PSEUDONYM");%>
<tr>
<td><%=benutzernr %></td>
<td><%=pseudonym %></td>
<td><%=tabelleBenutzer.getString("PASSWORT")%></td>
</tr>
<%catch} %>



</table>
</body>
</html>
```



*Und zu guter letzt die JAVA-Klasse  DBZugriff.java*








```
package DB;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class DBZugriff {


	private java.sql.Connection dieVerbindung;

	public DBZugriff() throws InstantiationException, IllegalAccessException, SQLException


	{
		try {

		// Die Verbindung zur DB wird einmal am Anfang aufgebaut!
			// Erzeugen und laden des Treibers
			// Der Name des Treibers lautet:....................


			Class.forName("com.mysql.jdbc.Driver").newInstance();
			// Holen eines Connection Objekts
			// die DB lautet dbbenutzer
			dieVerbindung = java.sql.DriverManager.getConnection("jdbc:mysql://localhost/dbbenutzer","","");
		}

		catch(ClassNotFoundException e1)
		{

			System.out.println
			("ClassNotFoundException:" + e1.getMessage());


		}

	}


	// Lesende Operationen


		public java.sql.ResultSet leseDB()
		{

			java.sql.Statement statement;
			java.sql.ResultSet tabelle;
			try
			{

				// Abfrage der DB
				// hier Inhalt der gesamten Benutzertabelle
				statement = dieVerbindung.createStatement();
				// Ausführung der SQL Anweisung
				tabelle = statement.executeQuery("SELECT * FROM BENUTZER ");
				//Rückgabe des Ergebnisses vom Typ ResultSet
				return tabelle;

			}

			catch(java.sql.SQLException e3)
			{



			}


			return null;
			}





}
```
[/code]


----------



## Julia Schulz (8. Mrz 2008)

so hab geseh ndas ich einen kleinen Syntaxfehler gehabt habe allerdings wirft Easy Eclipse nun eine Null Pointer Exception:
Was is daran bitte nur falsch?????



*FEHLER*




```
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.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:460)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)


root cause 

java.lang.NullPointerException
	DB.DBZugriff.leseDB(DBZugriff.java:53)
	org.apache.jsp.lesendb_jsp._jspService(lesendb_jsp.java:72)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)


note The full stack trace of the root cause is available in the Apache Tomcat/5.5.26 logs.
```


----------



## Guest (8. Mrz 2008)

Mach das ganze zuerst ohne JSP. Einfach ein kleines Programm, mit dem du die Daten auf die Console ausgibst.
Wenn dies funktioniert, kannst du es in JSP verwenden.


----------



## Julia Schulz (9. Mrz 2008)

mmh weis niemand wo der Fehler sein könnte ?? Egal was ich versuch ständig wird eine Null Pointer Exception geworfen.


----------



## maki (9. Mrz 2008)

> mmh weis niemand wo der Fehler sein könnte ??


Klar, irgendwo in deinem schrecklichen Code...

Solltest erst das eine dann das andere lernen, d.h. erst DB Zugriff danach vielleicht JSP und Web.
Nix für ungut, aber so wie das aussieht, kannst du weder das eine noch das andere.

Ist denn der JDBC Treiber im classpath?
Lagere mal das newInstance auf eine eigene Zeile aus.


----------



## Guest (9. Mrz 2008)

HI also der schreckliche Code stammt von einem Buch JSP für Einsteiger sorry ;-) 
Das is mein erster Versuch mit JBEAN und MYSQL. 

Wie meinst du denn das genau das ich die newInstance() auslagern sollte?


----------



## Julia Schulz (9. Mrz 2008)

Ja der Treiber ist im Classpath integriert.


----------



## maki (9. Mrz 2008)

Vergiss dass mit newInstance.

Hol dir ein besseres Buch  Deins muss ja wirklich alt sein, oder einfach nur schlecht(?), nichtmal die naming conventions wurden eingehalten...

Zu deinem Problem, die NPE tritt in DBZugriff in Zeile 53 auf, bei createStatament(), anscheinend ist dieVerbindung null.


----------



## Julia Schulz (9. Mrz 2008)

Also i hab jetzt mal einen Test versucht und hab die Klasse DBZugriff durch eine Main-Methode aufgerufen da  bekomm ich sofort eine Verbindung zu MYSQl aber sobald ich die Main-Methode lösche und auf Tomcat starte bekomm ich ständig Null Pointer Exception als Fehlermeldung.



```
package DB;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;


public class DBZugriff {
	private java.sql.Connection dieVerbindung;


private final String DBUSER ="root";
	private final String PASSWORD ="";
	private final String DBNAME ="dbbenutzer";

	String url = "jdbc:mysql://localhost/"+DBNAME+"?user="+DBUSER+"&password="+PASSWORD;
public DBZugriff() throws Exception, IllegalAccessException
		{
	try
		{

		// Die Verbindung zur DB wird einmal am Anfang aufgebaut!
			// Erzeugen und laden des Treibers
			// Der Name des Treibers lautet:....................


			Class.forName("com.mysql.jdbc.Driver").newInstance();
			// Holen eines Connection Objekts
			// die DB lautet dbbenutzer
			dieVerbindung = java.sql.DriverManager.getConnection(url);



		}

		catch(ClassNotFoundException e1)
		{

			System.out.println
			("ClassNotFoundException:" + e1.getMessage());


		}

	}


	// Lesende Operationen


		public java.sql.ResultSet leseDB()
		{

			java.sql.Statement statement;
			java.sql.ResultSet tabelle;
			try
			{

				// Abfrage der DB
				// hier Inhalt der gesamten Benutzertabelle
				statement = dieVerbindung.createStatement();
				// Ausführung der SQL Anweisung
				tabelle = statement.executeQuery("SELECT * FROM benutzer ");
				//Rückgabe des Ergebnisses vom Typ ResultSet
				return tabelle;

			}

			catch(java.sql.SQLException e3)
			{



			}


			return null;
			}
//##################################################################################
		// DAS HIER SCHREIBE DB IST NEU !!!!!!!!!!!!!

public synchronized void schreibeDB (String pseudonym, String passwort)
{

String benutzerString = "Leer";
int benutzernr = 0;

java.sql.Statement statement = null;
java.sql.ResultSet tabelle = null;
try {

	// Statement erzeugen
	statement = dieVerbindung.createStatement();

// Letzte Benutzernummer lesen
	// DIE SQL - Operation MAX liefert den  größten Wert einer Spalte
	// DB-Operationen ausführen
	tabelle = statement.executeQuery("SELECT MAX(BENUTZERNR)FROM BENUTZER");
	// Zeiger auf 1. Element positionieren
tabelle.next();
// 1. Element der 1.Spalte lesen
benutzernr = tabelle.getInt(1);
// benutzernr um 1 erhöhen
benutzernr++;

benutzerString = Integer.toString(benutzernr);

// Neuen Eintrag im String insert zwischenspeichern

String insert = "INSERT INTO benutzer (BENUTZER,PSEUDONYM,PASSWORT)";

// NEUE WERTE im STRINGVALUES zwischenspeichern

String values = "VALUES('" + benutzerString + "','" + pseudonym + "','" + passwort + "')";

// DB-Operationen ausführen, d.h. Daten in Tabelle eintragen

statement.executeUpdate(insert + values);
}
catch (java.sql.SQLException e3)
{


}

finally
{

try
{
	// Die close Operation kann ebenfalls eine Ausnahme erzeugen, die abgefangen werden muss
	tabelle.close();
	statement.close();

}
catch ( java.sql.SQLException e3)
{


}
}

}

public static void main (String args []) throws IllegalAccessException, Exception
{


DBZugriff meinzugriff = new DBZugriff();
System.out.println("DB erfoglreich");
}


}
```


----------



## maki (9. Mrz 2008)

In deiner Main rufst du nirgends die leseDB() MEthode auf.


----------



## Julia Schulz (9. Mrz 2008)

Was müsste man den in Zeile 53 abändern damit das Statement nicht Null ist?


----------



## maki (9. Mrz 2008)

Nix. Der Fehler liegt woanders, die Connection sollte nicht null sein.


----------



## Julia Schulz (9. Mrz 2008)

mmh jetzt verwirst du mich?? Wie würdest du den das ganze schreiben??


----------



## maki (9. Mrz 2008)

Rufe mal die leseDB Methode in deiner Main auf.

WIe ich das schreiben würde? Nützt doch hier nix, du musst erstmal die Grundlagen verstehen.


----------



## Julia Schulz (9. Mrz 2008)

So hab ich gemacht dann kommt trotzdem erfolgreich als Meldunf in der Konsole.


public static void main (String args []) throws IllegalAccessException, Exception
{


DBZugriff meinzugriff = new DBZugriff();
leseDB();
System.out.println("DB erfoglreich");
}


----------



## maki (9. Mrz 2008)

Der MySQL Treiber, wird der auch ins WEB-INF/lib Verzeichniss kopiert?
Bekommst du eine Exception in der Tomcat Konsole?


----------



## Julia Schulz (9. Mrz 2008)

Also ich hab den Treiber über Eclipse " Projekt" Java Builth" importiert der wird mir anschließend in der  Library angezeigt.

Wie soll ich den in die LIB kopierne manuel per Mouse?? Sorry das i so sau dumm frage aber ich kenn das nur über Java Builth.....


----------



## maki (9. Mrz 2008)

Musst dich entscheiden.
Anscheinend kennst du dich weder mit JDBC noch mit Webanwendungen aus. 
Zu versuchen beides auf einmal zu erlernen frustriert nur unnötig.

Also, was willst du zuerst lernen? 
Mein Tipp: JDBC ist um einiges einfacher als Webanwendungen, solltest dich aber mit Java ganz gut auskennen, dein "Exceptionhandling" macht mir nicht den Eindruck.

Nicht böse sein, aber manchmal hilft es einen Schritt zurückzumachen wenn man nicht weiterkommt.


----------



## Julia Schulz (9. Mrz 2008)

Alos ich möchte gerne Web-Anwendungen lernen und mein Ziel war es in einem Formular Name und Passwort einzugeben das anschließend in eine MYSQL DB gespeichert wird also so eine Art Login.


----------



## maki (9. Mrz 2008)

Suche dir ein gutes Buch über Servlets, dann eines über JSPs.
Da wirst du dann zwangsläufig über die JSTL stolpern, da gibt es auch fertige Tags für den JDBC Zugriff, auch wenn ich nix davon halte.

In JSPs sollte man Scriptlets unbedingt vermeiden, Java, JSP, HTML, CSS, JavaScript und SQL zu mischen führt zu einem Chaos.

Solltest in den Servlet/JSP Büchern nach MVC (bzw. Model 2) suchen, sollte dann klarer werden wie man das "richtig" macht.

Wieviel Zeit hast du denn?


----------



## Julia Schulz (9. Mrz 2008)

Zeit hab ich nur 2 Tage um das ganze abzugeben leider.....


----------



## maki (9. Mrz 2008)

Abgeben?

Für die Schule?


----------



## Julia Schulz (9. Mrz 2008)

nene für Professor das is so ne Punkte Aufgabe... obwohl man noch Anfänger is  heul........


----------



## maki (9. Mrz 2008)

Sieh doch mal ins WEB-INF/lib Verzeichniss, ob da der MySQL Treiber drinnen liegt.

Wenn du eine Exception fängst, schlucke sie nicht einfach, macht die Fehlersuche fast unmöglich, zumindest in System.out schreiben.
Solltest dir die Meldungen auf der Tomcat Konsole ansehen, ob eine der Exceptions geworfen wurde.


----------



## Julia Schulz (9. Mrz 2008)

Also i hab jetzt den MYSQL  Treiber manuel in meine LIB kopiert  mysql-connector-java-5.0.8

und Tomcat bringt mir auf der Konsole diesen Fehler.



```
09.03.2008 12:55:16 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Programme\EasyEclipse Server Java 1.2.2.2\jre\bin;.;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem
09.03.2008 12:55:16 org.apache.coyote.http11.Http11BaseProtocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
09.03.2008 12:55:16 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 563 ms
09.03.2008 12:55:16 org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
09.03.2008 12:55:16 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/5.5.26
09.03.2008 12:55:16 org.apache.catalina.core.StandardHost start
INFO: XML validation disabled
09.03.2008 12:55:17 org.apache.coyote.http11.Http11BaseProtocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
09.03.2008 12:55:17 org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
09.03.2008 12:55:17 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/16  config=null
09.03.2008 12:55:17 org.apache.catalina.storeconfig.StoreLoader load
INFO: Find registry server-registry.xml at classpath resource
09.03.2008 12:55:17 org.apache.catalina.startup.Catalina start
INFO: Server startup in 593 ms
ClassNotFoundException:com.mysql.jdbc.Driver
09.03.2008 12:55:29 org.apache.catalina.core.StandardWrapperValve invoke
SCHWERWIEGEND: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
	at DB.DBZugriff.schreibeDB(DBZugriff.java:132)
	at org.apache.jsp.eintragendb_jsp._jspService(eintragendb_jsp.java:74)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
	at java.lang.Thread.run(Thread.java:595)
```


----------



## maki (9. Mrz 2008)

> java.lang.NullPointerException
> at DB.DBZugriff.schreibeDB(DBZugriff.java:132)


Dir ist klar wo der Fehler auftritt?


----------



## Julia Schulz (9. Mrz 2008)

mmh also Zeile 132 wäre im Code folgendes:






finally
{

try
{
	// Die close Operation kann ebenfalls eine Ausnahme erzeugen, die abgefangen werden muss
	tabelle.close();
	statement.close();

}


Ich werd daraus einfach nicht schlau


----------



## maki (9. Mrz 2008)

Wenn tabelle oder statement null sind, kracht es.


----------



## Julia Schulz (9. Mrz 2008)

soll ich tabelle.close und statement.close entfernen??


----------



## Guest (9. Mrz 2008)

Julia Schulz hat gesagt.:
			
		

> soll ich tabelle.close und statement.close entfernen??


Nein, nur auf null prüfen.

1) Ändere die BenutzerNr-Spalte in das hier

BenutzerNr int(11) NOT NULL *auto_increment*,

2) Führe das Update wie folgt aus
	
	
	
	





```
PreparedStatement stmt = null;
try
{
   stmt = getConnection().prepareStatement(
      "INSERT INTO Benutzer (Pseudonym, Passwort) VALUES (?, ?)"
   );
   stmt.setString(1, pseudonym);
   stmt.setString(2, passwort);
   stmt.executeUpdate();
}
catch(SQLException e)
{
   // Logger.error(e);
   e.printStackTrace();
}
finally
{
   if(stmt != null)
   {
      try
      {
         stmt.close();
      }
      catch(SQLException e)
      {
         // Logger.error(e);
         e.printStackTrace();
      }
   }
}
```


----------



## Julia Schulz (9. Mrz 2008)

Muss ich diesen Code in die _schreibeDB()_ kopieren?? oder wo willst du das genau hin haben sorry nochmal das ich so fragen muss;-) Danke auf jeden Fall für deine Hilfe


----------



## semi (9. Mrz 2008)

OK, mir ist langweilig.  Wir gehen es mal Schritt für Schritt durch.
Du kannst dir diese Vorgehensweise merken und, bis du was besseres drauf hast, immer wieder anwenden.

1) Du hast zunächst eine Entität/Klasse Benutzer
	
	
	
	





```
public class Benutzer
{
   private Integer nr;
   private String pseudonym;
   private String passwort;

   public Benutzer()
   {
   }

   // Getter und Setter hier ergänzen
}
```
2) Die Benutzer werden gelesen und gespeichert. Dabei können auch Fehler auftreten.
Am besten definierst du ein Interface zum Lesen/Schreiben und eine passende Exception (hier DaoException)
Dao steht für Data Access Object.
	
	
	
	





```
/**
 * Dao zum Lesen und Schreiben von Benutzerdaten.
 */
public interface BenutzerDao
{
   /**
    * Liefert eine Liste aller Benutzer.
    *
    * @return Liste aller Benutzer
    * @throws DaoException Wird geworfen, wenn das Lesen scheitert.
    */
   List<Benutzer> readBenutzerList() throws DaoException;

   /**
    * Liefert einen Benutzer mit der gegebenen Nummer.
    *
    * @param nr Nummer des Benutzers.
    * @return Gefundener Benutzer.
    * @throws DaoException Wird geworfen, wenn das Lesen scheitert
    * oder kein Benutzer mit gegebener Nummer gefunden wird.
    */
   Benutzer readBenutzer(Integer nr) throws DaoException;

   /**
    * Speichert den gegebenen Benutzer.
    *
    * @param benutzer Zu speichernder Benutzer.
    * @return Gespeicherter Benutzer.
    * @throws DaoException Wird geworfen, wenn das Schreiben scheitert.
    */
   Benutzer saveBenutzer(Benutzer benutzer) throws DaoException;
}
```
und die Exception
	
	
	
	





```
/**
 * Exception der Dao-Schicht. Kapselt Fehler in Dao-Implementierungen.
 */
public class DaoException extends Exception
{
   private static final long serialVersionUID = 618840826778824033L;

   /**
    * Konstruktor.
    *
    * @param message Fehlermeldung
    */
   public DaoException(String message)
   {
      super(message);
   }

   /**
    * Konstruktor.
    *
    * @param message Fehlermeldung
    * @param cause Fehlerursache
    */
   public DaoException(String message, Exception cause)
   {
      super(message, cause);
   }
}
```
3) Für deine JSP-Seite brauchst du irgendeine Bean. Wir lassen die Bean das Interface
implementieren und die Funktionalität an die tatsächliche Implementierung delegieren. Beachte, dass dir noch
die Implementierung fehlt.... kommt noch.
	
	
	
	





```
/**
 * Benutzer-Bean.
 */
public class BenutzerBean implements BenutzerDao
{
   private BenutzerDao dao;

   /**
    * Konstruktor.
    */
   public BenutzerBean()
   {
      dao = ... hier wird die Implementierung instanziiert;
   }

   /**
    * Liefert eine Liste aller Benutzer.
    *
    * @return Liste aller Benutzer
    * @throws DaoException Wird geworfen, wenn das Lesen scheitert.
    */
   public List<Benutzer> readBenutzerList() throws DaoException
   {
      return dao.readBenutzerList();
   }

   /**
    * Liefert einen Benutzer mit der gegebenen Nummer.
    *
    * @param nr Nummer des Benutzers.
    * @return Gefundener Benutzer.
    * @throws DaoException Wird geworfen, wenn das Lesen scheitert
    * oder kein Benutzer mit gegebener Nummer gefunden wird.
    */
   public Benutzer readBenutzer(Integer nr) throws DaoException
   {
      return dao.readBenutzer(nr);
   }

   /**
    * Speichert den gegebenen Benutzer.
    *
    * @param benutzer Zu speichernder Benutzer.
    * @return Gespeicherter Benutzer.
    * @throws DaoException Wird geworfen, wenn das Schreiben scheitert.
    */
   public Benutzer saveBenutzer(Benutzer benutzer) throws DaoException
   {
      return dao.saveBenutzer(benutzer);
   }
}
```
4) Wir haben keine Datenbank, daher schreiben wir zunächst eine Dummy-Implementierung,
um zumindest paar Daten für die JSP-Seiten zu haben.
Da du hier gegen Interface (BenutzerDao) programmierst, kann die Implementierung später
ersetzt werden, ohne den Rest anpassen zu müssen.
Wir packen paar Benutzer in eine HashMap und gut ist.
	
	
	
	





```
/**
 * Eine Dummy-Implementierung von BenutzerDao.
 */
class BenutzerDaoDummyImpl implements BenutzerDao
{
   private Map<Integer, Benutzer> benutzerMap = new HashMap<Integer, Benutzer>();
   private static Integer sequence = Integer.valueOf(1);

   /**
    * Konstruktor.
    */
   public BenutzerDaoDummyImpl()
   {
      // Testdaten
      addBenutzer("Bart", "geheim");
      addBenutzer("Lisa", "secret");
      addBenutzer("Homer", "passwort");
   }

   /**
    * Liefert eine Liste aller Benutzer.
    *
    * @return Liste aller Benutzer
    * @throws DaoException Wird geworfen, wenn das Lesen scheitert.
    */
   public List<Benutzer> readBenutzerList() throws DaoException
   {
      return new LinkedList<Benutzer>(benutzerMap.values());
   }

   /**
    * Liefert einen Benutzer mit der gegebenen Nummer.
    *
    * @param nr Nummer des Benutzers.
    * @return Gefundener Benutzer.
    * @throws DaoException Wird geworfen, wenn das Lesen scheitert
    * oder kein Benutzer mit gegebener Nummer gefunden wird.
    */
   public Benutzer readBenutzer(Integer nr) throws DaoException
   {
      assert nr != null : "Benutzernummer darf nicht null sein!";
      Benutzer result = benutzerMap.get(nr);
      if(result == null)
      {
         throw new DaoException(
               String.format("Ein Benutzer mit der Nummer '%d' existiert nicht!", nr));
      }
      return result;
   }

   /**
    * Speichert den gegebenen Benutzer.
    *
    * @param benutzer Zu speichernder Benutzer.
    * @return Gespeicherter Benutzer.
    * @throws DaoException Wird geworfen, wenn das Schreiben scheitert.
    */
   public Benutzer saveBenutzer(Benutzer benutzer) throws DaoException
   {
      assert benutzer != null : "Benutzer darf nicht null sein!";
      Benutzer result = benutzer;
      // Ein neuer Benutzer (noch keine Id), dann neuanlegen, sonst aktualisieren
      if(benutzer.getNr() == null)
      {
         addBenutzer(benutzer);
      }
      else
      {
         result = readBenutzer(benutzer.getNr());
         result.setPseudonym(benutzer.getPseudonym());
         result.setPasswort(benutzer.getPasswort());
      }
      return result;
   }

   /**
    * Erstellt einen neuen Benutzer.
    *
    * @param pseudonym Pseudonym des Benutzers
    * @param passwort Passwort des Benutzers
    * @return Neuer Benutzer
    */
   private Benutzer addBenutzer(String pseudonym, String passwort)
   {
      Benutzer benutzer = new Benutzer();
      benutzer.setPseudonym(pseudonym);
      benutzer.setPasswort(passwort);
      addBenutzer(benutzer);
      return benutzer;
   }

   /**
    * Erstellt einen neuen Benutzer.
    *
    * @param benutzer Neuer Benutzer
    */
   private void addBenutzer(Benutzer benutzer)
   {
      benutzer.setNr(nextSequence());
      benutzerMap.put(benutzer.getNr(), benutzer);
   }

   /**
    * Liefert die nächste Benutzernummer.
    *
    * @return Benutzernummer
    */
   private Integer nextSequence()
   {
      synchronized(sequence)
      {
         Integer result = sequence;
         sequence = Integer.valueOf(sequence.intValue()+1);
         return result;
      }
   }
}
```
5) Damit das ganze schmerzlos geht, definieren wir noch eine Factory, die die Implementierung 
erzeugt und verwenden diese im Konstruktor von BenutzerBean.
Warum? Damit ist die Bean zunächst mal komplett. Wenn du die Implementierung von BenutzerDao
austauschen möchtest, brauchst du nur in Factory eine andere Implementierung zu instanziieren.
Das liesse sich auch konfigurierbar machen... das lassen wir aber mal.
	
	
	
	





```
/**
 * Factory zur Instanziierung von Dao-Implementierungen.
 */
public final class DaoFactory
{
   /**
    * Konstruktor.
    */
   private DaoFactory()
   {
   }

   /**
    * Liefert eine Implementierung von BenutzerDao.
    *
    * @return Implementierung von BenutzerDao.
    */
   public static BenutzerDao getBenutzerDao()
   {
      // Die Dummy-Implementierung instanziieren. Das wird später durch eine Implementierung
      // ersetzt, die auf die Datenbank losgeht.
      return new BenutzerDaoDummyImpl();
   }
}
```
und den Konstruktor von BenutzerBean anpassen.
	
	
	
	





```
/**
    * Konstruktor.
    */
   public BenutzerBean()
   {
      // Implementierung von BenutzerDao holen... was auch immer es ist.
      dao = DaoFactory.getBenutzerDao();
   }
```
Damit hast du schon eine funktionierende Version, die in JSP verwendet werden kann.
z.B. wie folgt
	
	
	
	





```
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<jsp:useBean id="benutzerBean" class="examples.jsp.BenutzerBean" scope="application" />
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
   <title>Benutzerliste</title>
</head>
<body>
<table border="1">
   <thead>
      <tr>
         <td>Nr</td>
         <td>Pseudonym</td>
         <td>Passwort</td>
      </tr>
   </thead>
<%
for(examples.jsp.domain.Benutzer benutzer : benutzerBean.readBenutzerList())
{
%>
   <tr>
      <td><%=benutzer.getNr()%></td>
      <td><%=benutzer.getPseudonym()%></td>
      <td><%=benutzer.getPasswort()%></td>
   </tr>
<%
}
%>
</table>
</body>
</html>
```

Kannst du mir soweit folgen? Probiere es aus und sag Bescheid, wenn es gelaufen ist.


----------



## semi (9. Mrz 2008)

PS: An die Experten hier.  Man mag über die Vorgehensweise streiten, insbesondere über die u.U. unnötige
Dao-Schicht. Das ganze ist aber gut für Anfänger, da es eine systematische und strukturierte Vorgehensweise
erzwingt/ermöglicht.


----------



## Julia Schulz (10. Mrz 2008)

Erstmal Danke Jungs bin noch am herum experimentieren!!! Grüße eure Julia


----------



## Julia Schulz (11. Mrz 2008)

MMH also wenn ich den ganzen Code kopiere und ausführen will dann erscheint in Easy Eclipse an der Seite einige Rote Balken die auf einen Fehler hinweisen ich soll da ständig irgend etwas abändern im Code ??Und das soll ich in jeder Klasse machen wo du hier reinkopiert hattest...


----------



## Guest (11. Mrz 2008)

Hat bei dir das Programm funktioniert?


----------



## Guest (11. Mrz 2008)

Julia Schulz hat gesagt.:
			
		

> MMH also wenn ich den ganzen Code kopiere und ausführen will dann erscheint in Easy Eclipse an der Seite einige Rote Balken die auf einen Fehler hinweisen ich soll da ständig irgend etwas abändern im Code ??Und das soll ich in jeder Klasse machen wo du hier reinkopiert hattest...


Mach mal Ctrl->Shift->O im Editor, in Eclipse. Wahrscheinlich fehlen dir nur die Imports (List, LinkedList etc.). 
Ansonsten ist es direkt compilierbar, da ist nix spektakuläres drin. Nur die Getter und Setter in der Klasse 
Benutzer musst du noch erstellen bzw. generieren.


----------



## Julia Schulz (11. Mrz 2008)

So die meißten Roten Balken sind verschwunden allerdings kommt in der der Klasse BenutzerDaoDumm... in der Methode



```
public Benutzer saveBenutzer(Benutzer benutzer) throws DaoException
   {
      assert benutzer != null : "Benutzer darf nicht null sein!";
      Benutzer result = benutzer;
      // Ein neuer Benutzer (noch keine Id), dann neuanlegen, sonst aktualisieren
   [b]   if(benutzer.getNr() == null)[/b]
      {
         addBenutzer(benutzer);
      }
      else
      {
         result = readBenutzer(benutzer.getNr());
         result.setPseudonym(benutzer.getPseudonym());
         result.setPasswort(benutzer.getPasswort());
      }
      return result;
   }
```



Fehleranzeige in Eclipse

*This operator == undefined for the arguement type (s) int null*


----------



## Guest (11. Mrz 2008)

Julia Schulz hat gesagt.:
			
		

> So die meißten Roten Balken sind verschwunden allerdings kommt in der der Klasse BenutzerDaoDumm... in der Methode
> 
> 
> 
> ...


----------



## Guest (11. Mrz 2008)

Hast du in der Klasse Benutzer die Getter und Setter ergänzt?
	
	
	
	





```
public class Benutzer 
{ 
   private Integer nr; 
   private String pseudonym; 
   private String passwort; 

   public Benutzer() 
   { 
   } 

   public Integer getNr()
   {
      return nr;
   }

   public void setNr(Integer nr)
   {
      this.nr = nr;
   }

   // usw. mit Gettern und Settern für Pseudonym und Passwort ergänzen 
}
```

Gruß,
semi ohne Keks im Browser  :wink:


----------



## Julia Schulz (11. Mrz 2008)

Hi ja hab ich gemacht moment ich poste mal meine Klasse:Trotzdem der obige Fehler.


```
public class Benutzer {

		private Integer nr;
	   private String pseudonym;
	   private String passwort;

	   public Benutzer()
	   {
	   }


	   public void setNr(int nr)
	    {
	        this.nr = nr;
	    }
	    public void setPseudonym(String pseudonym)
	    {
	        this.passwort =pseudonym ;
	    }
	    public void setPasswort(String passwort)
	    {
	        this.passwort = passwort;
	    }
	    //Lesende Operationen
	    public int getNr()
	    {
	        return nr;
	    }
	    public String getPseudonym()
	    {
	        return pseudonym;
	    }
	    public String getPasswort()
	    {
	        return passwort;
	    }
	    //Komplexe Operation

	    }
```


----------



## maki (11. Mrz 2008)

```
private Integer nr; 
...
      public void setNr(int nr)
       {
           this.nr = nr;
       }
...
public int getNr()
       {
           return nr;
       }
```
Wie kommst du auf *int*? Solltest doch *Integer* schreiben... Autoboxing ist zwar "nice to have", löst aber nicht alle Probleme.

Dickes Lob an semi!  :toll:


----------



## semi (11. Mrz 2008)

Yepp, das ist es.  :toll: 
Du kannst dir die Getter und Setter in Eclipse generieren lassen, dann passiert sowas nicht.

Alt->Shift->s, r, dann im Dialogfenster Alt-a und OK. Das gute an Eclipse ist, das das Ding 
komplett mit der Tastatur bedienbar ist. Man kann die Maus bei eBay verkaufen und trotzdem 
weiter arbeiten. In jedem Fall ist man mit der Tastatur schneller als bei dem Herumgeklicke.


----------

