# DB-Tabelle in Servlet einlesen und in JSP anzeigen



## ak (8. Jan 2005)

Hallo Leute,

ich habe eine Tabelle namens "dozenten", welche ich in einem Servlet einlese:

```
...
      Statement statement = connection.createStatement();
      String sqlQuery="select id, name, nachname from dozent";
      ResultSet resultset = statement.executeQuery(sqlQuery);
      while(resultset.next()){
        //hier kommt noch was...
      }
...
```
Nachdem die Werte vom Servlet eingelesen wurden wird zu einer JSP umgeleitet:

```
...
    RequestDispatcher dispatcher = 
    request.getRequestDispatcher("/WEB-INF/Sites/Dozenten.jsp");
    dispatcher.forward(request, response);
...
```
Jetzt möchte ich die drei Werte (id, name, nachname) für alle Datensätze im Servlet in einem Vector oder sonstiger Collection speichern und diese Werte dann anschließend in einer JSP ausgeben.

Wie würdet ihr diese Werte speichern, dass diese jeweils für eine session gültig sind? Wie würdet ihr diese Werte in der JSP ausgeben?
Ich habe da so ein paar Ideen bin mir aber nicht so sicher ob diese wirklich elegant sind. 

Gruß


----------



## bronks (8. Jan 2005)

ak hat gesagt.:
			
		

> Wie würdet ihr diese Werte speichern, dass diese jeweils für eine session gültig sind?


Den ganzen Resultset an die JSP übergeben.



			
				ak hat gesagt.:
			
		

> Wie würdet ihr diese Werte in der JSP ausgeben?


JSTL mit foreach auf den Resultset anwenden. Siehe auch die beiden Threads mit den Titeln: "Java Standart Tag Library" und "Die sinnvolle Vorgehensweise" in diesem Board auf der ersten Seite.


----------



## ak (9. Jan 2005)

Hallo Bronks, wenn ich das ganze Resultset an die JSP übergebe, dann muss ich meine connection die ganze Zeit geöffnet halten. Das will ich nicht.

Ich habe es jetzt so gelöst, bin aber mit der ausgabe in der JSP nicht ganz zufrieden, da ich zuviel javaquelltext drin habe:

Zuerst frage ich alle dozenten aus der DB ab und speichere das Resultset in einem Vector aus Beanobjekten:

```
Statement sqlstatement = connection.createStatement();
        String sqlQuery = "select D_NR, D_ANREDE, D_VORNAME, D_NACHNAME from"+             
                          "scott.dozent order by D_NR";
        ResultSet doz_resultset = sqlstatement.executeQuery(sqlQuery);

        Vector doz_Vector = new Vector();
        while(doz_resultset.next()){
          Dozenten_BEAN akt_dozent = new Dozenten_BEAN();
          akt_dozent.setDoz_ID(doz_resultset.getInt("D_NR"));
          akt_dozent.setDoz_Anrede(doz_resultset.getString("D_ANREDE"));
          akt_dozent.setDoz_vorname(doz_resultset.getString("D_VORNAME"));
          akt_dozent.setDoz_Nachname(doz_resultset.getString("D_NACHNAME"));
          doz_Vector.add(akt_dozent);
        }
        //Vector an die session übergeben.
        HttpSession session = request.getSession();
        Dozenten_BEAN dozent = (Dozenten_BEAN)session.getAttribute("dozent");
        dozent.setDozentenVector(doz_Vector);
        session.setAttribute("dozent", dozent);
        connection.close();
```

Jetzt gebe ich die Daten des Vectors in Tabellenform in einer JSP aus:

```
<% 
    if(dozent.getDozentenVector()!=null){
      java.util.Iterator it =  dozent.getDozentenVector().iterator();
      while(it.hasNext()){
	out.println("<tr>");
	coreservlets.Dozenten_BEAN doz =  (coreservlets.Dozenten_BEAN)it.next();
	          
        out.println("<td>"+doz.getDoz_Anrede()+"</td>");
	out.println("<td>"+doz.getDoz_vorname()+"</td>");
	out.println("<td>"+doz.getDoz_Nachname()+"</td>");
	out.println("</tr>");
     }
   }
  %>
```

Wie kann ich die Ausgabe in der JSP besser lösen? Bitte mit Quelltextangabe wenn es geht.

Gruß


----------



## bronks (9. Jan 2005)

ak hat gesagt.:
			
		

> ... dann muss ich meine connection die ganze Zeit geöffnet halten. Das will ich nicht ...


Genau das ist m.E. das tollste Feature bei Servlets. Schon beim zweiten Zugriff auf die DB hast Du performancetechnisch gewonnen.

Blos so aus Neugier: Warum willst Du das nicht?


----------



## ak (9. Jan 2005)

Ich habe mal gelesen, dass man eine db-connection nicht allzulange offen halten sollte, wegen der Performance. Natürlich kostet es Zeit die connection jedes mal neu zu öffnen, bin mir aber nicht so sicher ob das bei Webanwendungen wirklich so gut ist. Ich schaue mir mal an wie das mit dem Connectionpooling funktioniert.
Wenn du denkst, dass ich da auf dem Holzweg bin, dann berichtige mich bitte.  Bin noch relativer JSP und Servlet Neuling.

P.S. Obwohl ich die Connection jedesmal nach dem Einlesen schließe, ist die Geschwindigkeit ab dem zweiten Mal Einlesen deutlich schneller.


----------



## Jaraz (9. Jan 2005)

Jetzt gebe ich die Daten des Vectors in Tabellenform in einer JSP aus:

```
<% 
    if(dozent.getDozentenVector()!=null){
      java.util.Iterator it =  dozent.getDozentenVector().iterator();
      while(it.hasNext()){
	out.println("<tr>");
	coreservlets.Dozenten_BEAN doz =  (coreservlets.Dozenten_BEAN)it.next();
	          
        out.println("<td>"+doz.getDoz_Anrede()+"</td>");
	out.println("<td>"+doz.getDoz_vorname()+"</td>");
	out.println("<td>"+doz.getDoz_Nachname()+"</td>");
	out.println("</tr>");
     }
   }
  %>
```

Wie kann ich die Ausgabe in der JSP besser lösen? Bitte mit Quelltextangabe wenn es geht.[/quote]


```
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
<c:forEach var="dozent" items="${ requestScope.dozent }">
<tr><td>${dozent.Doz_Anrede}</td><td>${dozent.Doz_vorname}</td><td>${dozent.Doz_Nachname}</td><tr>
</c:forEach>
```

Gruß Jaraz

PS: Die schreibweise geht nur mit der webapp Version 2.4
[<web-app xmlns="http://java.sun.com/xml/ns/j2ee" version="2.4"> ]


----------



## Jaraz (9. Jan 2005)

@ bronks
Das ResultSet hat übrigens in der JSP nix zu suchen.

Die Ansicht sollte mit einem Datenmodell arbeiten das von der Datenhaltung unabhängig ist.
Wenn du das ResultSet bis zur jsp durch reichst, kannst du nie mit anderen Datenquellen als JDBC arbeiten.

@ak
Bei einer Web Anwendung brauchts du keinen Vector nehmen, eine ArrayList reicht und ist schneller da nicht synchronisiert. 

Gruß Jaraz


----------



## bronks (9. Jan 2005)

Jaraz hat gesagt.:
			
		

> @ bronks
> Das ResultSet hat übrigens in der JSP nix zu suchen.


Würde ich mir auch denken, wenn ich nicht die passenden JSTL-Tags kennen würde. Nur zu demonstrationszwecken hat man die sicher nicht entwickelt.


----------



## ak (9. Jan 2005)

Hallo Jaraz,

danke für deine Hilfe. So geht es sehr schön, wie ich es mir vorgestellt habe:


```
<c:forEach items="${dozent.dozentenVector}" var="doz">
      <tr>
       <td>${doz.doz_Anrede}</td>
       <td>${doz.doz_vorname}</td>
       <td>${doz.doz_Nachname}</td>
      <tr>
    </c:forEach>
```

Werde mal sehen, ob ich jetzt besser ne Arraylist nehme.


----------



## Jaraz (10. Jan 2005)

bronks hat gesagt.:
			
		

> Jaraz hat gesagt.:
> 
> 
> 
> ...



OK, dann konkretisiere ich meine Aussage.
Wenn man eine größere Anwendung proggt und sich an das MVC Prinzip halten will, hat das ResultSet in der JSP nix zu suchen.

Will man nur eine einfache Telefonliste aus einer JDBC Datenbank anzeigen, kann man wegen meiner auch die JSTL Tags benutzen.

Zufrieden? 

Gruß Jaraz


----------

