# Datenübergabe von Servlet an JSP



## DieToni (21. Apr 2009)

Hallo zusammen,

ich stecke leider noch in den Anfängen was Java und JSPs angeht. Im Moment arbeite in an einem Projekt, wo ich eben dies brauche und hänge jetzt seit Tagen an einer Stelle fest: Ich möchte mit einem Servlet eine Datenbank auslesen (das funktioniert auch), die Ergebnisse dann aber nicht mit dem Servlet, sondern einer JSP darstellen.
Ich weiß, dass ich dazu die Daten mit einem request.setAttribute(...) übergebe und mit dem RequestDispatcher die JSP aufrufe, allerdings bekomme ich das einfach nicht umgesetzt. Ich glaub mir fehlt da einfach das Gesamtverständnis  Habe hier im Forum schon quer gelesen, aber leider bringt mich das gerade auch nicht viel weiter.

Hier erstmal der Code vom Servlet: 


```
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SQLServlet5 extends HttpServlet {
	public void doPost(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
			response.setContentType("text/html");
			PrintWriter out = response.getWriter();
			String username = "root";
			String password = "";
			String url = "jdbc:mysql://localhost:3306/test2?";
			String query = "SELECT * FROM employee";
			  
			showTable(url, username, password, query, out);
			out.println("</center></body><html>");
	}
	
	public void showTable(String url, String username, String password, String query, PrintWriter out) {
		try {
			//Load database driver if it's not already loaded
			Class.forName("com.mysql.jdbc.Driver");
			//Establish network connection to database
			Connection connection = DriverManager.getConnection(url, username, password);
			DatabaseMetaData dbMetaData = connection.getMetaData();
			Statement statement = connection.createStatement();
			ResultSet resultSet = statement.executeQuery(query);
			out.println("<table border=1>");
			ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
			int columnCount = resultSetMetaData.getColumnCount();
			out.println("<tr>");
			//Column index starts at 1
			for (int i = 1; i <= columnCount; i++) {
				out.print("<th>" + resultSetMetaData.getColumnName(i));
			}
			out.println();
			//Step through each row in the result set
			while (resultSet.next()) {
				out.println("<tr>");
				for (int i = 1; i <= columnCount; i++) {
					out.print("<td>" + resultSet.getString(i));
				}
				out.println();
			}
			out.println("</table>");
			connection.close();
		} catch (ClassNotFoundException cnfe) {
			System.err.println("Error loading driver: " + cnfe);
		} catch (SQLException sqle) {
			System.err.println("Error loading connection: " + sqle);
		} catch (Exception ex) {
			System.err.println("Error with input: " + ex);
		}
	}
}
```

Bis jetzt hab ich eben die Ergebnisse der Datenbankabfrage durch das Servlet darstellen lassen. Wenn ich das jetzt an eine JSP übergeben will, brauche ich ja sowas in der Richtung: 


```
request.setAttribute("meinErgebnis", ErgebnisObjekt); 
RequestDispatcher rd = request.getRequestDispatcher("Ausgabe.jsp"); 
rd.forward(request,response);
```

Aber wie bekomm ich jezt die Ergebnisse vom ResultSet in das Ergebnisobjekt? 

Wie gesagt, ich stell mich da gerade selten dämlich an und hoffe das mit einer von euch mal das Brett vom Kopf nehmen kann.

Schonmal Danke im Voraus!


----------



## mvitz (21. Apr 2009)

in der JSP

```
${meinErgebnis.xxx}
```

Für XXX kann alles eingetragen werden, was per getXXX oder isXXX abfragbar ist (also eine JavaBean ausmacht).

Zudem kann es sich z.B. bei Listen auch noch lohnen die JSTL einzusetzen.

Ganz gutes Tutorial findet sich hier:
JSP-Tutorial - Inhalt


----------



## DieToni (22. Apr 2009)

Hallo, Danke für die Antwort.

Allerdings ging es mir mehr darum, wie ich direkt im Servlet die Daten aus dem ResultSet in das Objekt "ErgebnisObjekt" schreiben kann.

Die Weiterverarbeitung der Daten in der JSP bekomme ich denke ich hin.

LG Toni


----------



## SlaterB (22. Apr 2009)

was ist denn ErgebnisObjekt für ein Objekt?
hast du da Platz für beliebig viele Elemente mit jeweils mehreren Attributen?
 z.B.


```
ErgebnisObjekt x = ..
while (resultSet.next()) {
   Entry e = x.newEntry();
   for (int i = 1; i <= columnCount; i++) {
       e.add(resultSet.getString(i));
   }
}
```


----------



## DieToni (23. Apr 2009)

Ich habe mein Servlet jetzt mal umgeschrieben. Compilen kann ich es schon mal, nur noch nicht testen, da ich jetzt doch vor dem Problem stehe, wie ich das in der JSP wieder ausgebe.
Denkt ihr, das wäre so erstmal praktikabel?


```
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.ArrayList;
import java.util.List;

public class SQLServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
			response.setContentType("text/html");
			PrintWriter out = response.getWriter();
			String username = "root";
			String password = "";
			String url = "jdbc:mysql://localhost:3306/test2?";
			String query = "SELECT * FROM employee";
			
	try {
			//Load database driver if it's not already loaded
			Class.forName("com.mysql.jdbc.Driver");
			//Establish network connection to database
			Connection connection = DriverManager.getConnection(url, username, password);
			DatabaseMetaData dbMetaData = connection.getMetaData();
			Statement statement = connection.createStatement();
			ResultSet resultSet = statement.executeQuery(query);
			ResultSetMetaData rsmd = resultSet.getMetaData();
			int columnCount = rsmd.getColumnCount();
			
			List rows = new ArrayList();
			while(resultSet.next()){
				String[] row = new String[columnCount];
				for(int i = 1;i<=columnCount;i++){
					row[i-1]=resultSet.getString(i);
				}
				rows.add(row);	
			}
			
			String[][] rowData = (String[][])rows.toArray(new String[rows.size()][columnCount]);
			
			request.setAttribute("rowData", rowData); 
			RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/Ausgabe.jsp"); 
			rd.forward(request,response);
			
			resultSet.close();
			statement.close();
			connection.close();
			
		} catch (ClassNotFoundException cnfe) {
			System.err.println("Error loading driver: " + cnfe);
		} catch (SQLException sqle) {
			System.err.println("Error loading connection: " + sqle);
		} catch (Exception ex) {
			System.err.println("Error with input: " + ex);
		}
	}
}
```

Falls das so okay ist, kann mir jemand einen Hinweis geben, wie ich das dann in der JSP weiterbenutzen kann? Dort soll die ganze Tabelle aus der Datenbank ausgegeben werden.

Vielen Dank für eure Hilfe


----------



## SlaterB (23. Apr 2009)

close() vor dem forward()

Zugriff auf Variablen und Umgang mit Arrays allgemein im JSP musst du aus Tutorials erlernen,
das ist doch kein Thema für ein Forum?!
in jedem Fall wüßte ich es derzeit nicht, wenn dann jemand anders


----------



## maki (24. Apr 2009)

> Falls das so okay ist...


Hm... zum spielen mit JSPs und Servlets ist das vielleicht ok, aber ansonsten nicht.

Für jeden GET Request auf dein SQLServlet wird eine neue DB Verbindung aufgebaut, die Daten abgefragt und die DB Verbindung wieder geschlossen.
Eine "echte" Java WebApp darf das so nicht machen. 
Was passiert denn wenn du 100 GET Requests gleichzeitg bzw. ziemlich schnell hintereinander bekommst? 

Ansonsten sieh dich mal nach JSTL und EL um, ist sehr nützlich für JSPs.


----------

