# ResultSet aus Bean an JSP übergeben



## digital_doom (9. Mai 2008)

wie kann ich einn ResultSet aus einer Bean übergeben?
Hab eine Datenbank in der User gespeichert sind. Nun möchte ich in einer Funktion der Bean alle User auslesen und in einem ResultSet speichern und dieses per return an die jsp Seite zurückgeben. doch wenn ich dann in der jsp Seite mit rs.next() durch das ResultSet iterieren will wirft er mir st#ndig eine NullPointerException.
Hier die betreffenden Code Zeilen:


```
public ResultSet getAllEntries()
	{
		ResultSet rs = null;
		String query = "SELECT * FROM st_user";
		
		try
		{
			this.connectDB();
			Statement st = con.createStatement();
			rs = st.executeQuery(query);
		}catch(SQLException e)
		{
			e.printStackTrace();
			System.out.println("Fehler in getAllEntries()");
		}
		
		return rs;
	}
```

con ist ein Connection Objekt das ich als Member der Bean deklariert habe. In connectDB() wird die Verbindung hergestellt. Habs auch schon probiert mit der Statement Variable als Member der Bean geht auch nicht. Und bevor ich weiter herumpfusche wollte ich mal hier um Hilfe bzw Tipps fragen.
hier noch das jsp Dokument:


```
<%@ 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">
<%@page import="java.sql.ResultSet"%>
<html>

<jsp:useBean id="user" class="StudyTalk.ST_user" scope="application"></jsp:useBean>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<%
		ResultSet rs = user.getAllEntries();
		System.out.println(rs);
	 %>
	 <table>
	 	<tr><th>ID</th><th>FirstName</th><th>LastName</th><th>MatNumber</th><th>Username</th><th>Password</th>
	 	<%
	 	
	 		while(rs.next())
	 		{
	 	%>
	 			<tr>
	 				<td><%=rs.getInt("U_ID") %></td>
	 				<td><%=rs.getString("FirstName") %></td>
	 				<td><%=rs.getString("LastName") %></td>
	 				<td><%=rs.getString("MatNumber") %></td>
	 				<td><%=rs.getString("UserName") %></td>
	 				<td><%=rs.getString("Password") %></td>
	 			</tr>
	 			
	 	<%	
	 		}
	 	%>
	 		<tr><th>--</th><th>------</th><th>------</th><th>------</th><th>------</th><th>------</th>
	 </table>
</body>
</html>
```

Vielleicht könnt ihr mir helfen. Ich glaub ich hab das Mit der Lebensdauer von Statement, ResultSet und Connection noch nicht ganz verstanden.
mfg[/code]


----------



## Niki (9. Mai 2008)

Ich habe zwar mit jsps keine/kaum Erfahrung, aber ich vermute dass das nicht zulässig ist. Du solltest ein POJO bauen, welches du mit den Daten aus dem ResultSet befüllst und dieses der JSP übergeben (wie gesagt, ich weiß nicht ob das korrekt ist)


----------



## digital_doom (9. Mai 2008)

das heisst also ich soll ein objekt mit den gleichen membern wie datenbank spalten schreiben?
und halt die member als collections? damit ich alle einträge gescheit auslesen kann?
wird das nicht viel zu speicher und rechenintensiv wenn mal ich sag mal 500 user drinn stehen als beispiel?
aber schonmal danke für den tip. jetzt hab ich ja zumindest schon mal eine alternative


----------



## Niki (9. Mai 2008)

500 User sind ja keine Größe. Das sollte kein Problem sein. Genauso hab ich es gemeint, du gibst einfach eine Collection von User-Objekten zurück.

EDIT:
noch was. du solltest das ResultSet und das Statement auch wieder schließen:

```
List erg = new ArrayList();
try{
  stmt = con.createStatement();
  rs = stmt.executeQuery("...");
  while(rs.next()){
    //befülle neues POJO und füge es der Ergebnisliste hinzu
    User u = new User();
    u.set....
    erg.add(u);
  }
}catch(....){
}finally{
  if(rs != null)
    rs.close();
  if(stmt != null)
    stmt.close();
}
return erg;
```


----------



## maki (9. Mai 2008)

Ist zwar zuläsasig, aber sehr hässlich und bringt eine Menge Probleme.

Solltest die Daten von einem Serlvet holen und aufbereiten lassen, die JSP stellt diese dann nur dar, am besten mit Taglibs (JSTL) und der EL.

Wo kommt denn die NPE?


----------



## Niki (9. Mai 2008)

@maki: mich würde interessieren wie das ausschaut, sich aus der jsp die Daten über ein Servlet zu holen. Wie schickt man die Anfrage und was/wie bekomm ich das Ergebnis zurück?


----------



## maki (9. Mai 2008)

Grundsätzlich sollte jede Anfrage an ein Servlet gehen, den Controller. Dieser sorgt dann dafür, dass zuerst die benötigten Aktionen ausgeführt & Daten(Model) aufbereitet werden, danach leitet der Controller weiter an die jeweilige View (JSP). 
Die Daten werden vom Controller in die Session oder den Request gehängt, wo die JSP sie sich später holt um sie anzuzeigen.


----------



## ms (9. Mai 2008)

Niki hat gesagt.:
			
		

> 500 User sind ja keine Größe. Das sollte kein Problem sein.


Abgesehen davon bezweifle ich, dass du wirklich 500 User auf einer Seite darstellen willst.
Du wirst wahrscheinlich eine Blätterlogik einbauen wollen.
Im ersten Schritt spielt das aber keine Rolle.
Erstmal schön mit Servlet machen wie maki gesagt hat.

ms


----------



## Niki (9. Mai 2008)

Danke schon mal für die Antwort. Verstehe ich das also so richtig:
Die jsp wird im Browser angezeigt, der Benutzer klickt etwas in einem Formular, die Anfrage wird an ein Servlet geschickt welches die Daten holt, aufbereitet... und dann die Daten ins Model stellt. Das Model steht dann z.B. in der Session. Anschließend macht das Servlet ein forwarding auf eine jsp um die Daten anzeigen zu lassen.
Ist das korrekt?


----------



## maki (9. Mai 2008)

Ja 

struts wäre ein gutes Beispiel für nicht JSF Projekte.


----------



## Niki (9. Mai 2008)

Wieder was dazu gelernt...

Ich hätte schon viel früher den Arbeitgeber wechseln sollen, leider war ich die ersten 4-5 Jahre meiner Programmiertätigkeit mit SWING beschäftigt und bin jetzt erst dabei auf WebApplikationen umzusteigen. Da ist das Umdenken vom Eventbasierten Programmieren auf Request/Response nicht so einfach (Ok, mit JSF kann man mittlerweile auch ganz fein Event-basiert programmieren)


----------



## digital_doom (9. Mai 2008)

danke für die antworten.
ich werds mal probieren zu realisieren.
bei problemen werd ich sicher wieder kommen ;-)


----------

