# ResultSet auf JSP ausgeben?



## arend (15. Okt 2004)

hallo zusammen,

habe mich schon durchs forum gewuehlt, leider aber nicht die passende antwort auf mein problem gefunden. folgendes macht mir zu schaffen:


ich moechte / soll eine kleine (java)suchmaschine programmieren.

ich habe eine jsp-seite erstellt, auf der daten in ein formular eingegeben werden. beim klick auf den suche-button werden die daten an ein servlet geschickt. im servlet wird aus den eingabefeldern ein sql-statement formuliert und an die datenbank geschickt. die ergebnisse, die ich zurueckbekomme, liegen als string-werte vor. wenn die datenbankabfrage nur ein ergebnis liefert, ist das ganze recht simpel - man haengt die werte an die url dran und kann sie so auf der ausgabe-seite mit der getParameter()-methode auslesen.

soweit, so einfach  :wink:  

jetzt aber mein problem: :bahnhof: 

was mache ich, wenn ich mehrere ergebnisse von der datenbank bekomme? 
das auslesen der sql-ergebnistabelle mittels while-schleife ist noch recht einfach, ich habe zumindest die werte per System.out.printl() in der konsole ausgeben koennen - dieser teil klappt also. nur - wie bekomme ich die werte aus dem resultset in mein ausgabe-jsp geschrieben? das anhaengen der werte an die url kommt dafuer nicht in frage, da dies je nach system begrenzt ist. 

kann evtl. jemand kurz ein quellcode-beispiel liefern? denke damit waere mir schon sehr geholfen. auf wunsch kann ich auch meinen bisherigen quellcode hier einstellen.

vielen dank schonmal,


arend


----------



## foobar (15. Okt 2004)

Du könntest die Daten in eine JavaBean packen und dann die Bean im Servlet an die JSP weiterleiten. In der Jsp kannst du dann mit 

```
<jsp:useBean class="myClass" id="bean"/>
<%= bean.myMethod() %>
```
auf die Bean zugreifen.


----------



## arend (15. Okt 2004)

danke, das klingt schon mal gut. hab noch nie was mit beans gemacht, ist aber eigentlich nix anderes als eine klasse, oder?

wie schiebe ich die daten vom servlet in die bean?
und wie muss eine bean aufgebaut sein?


----------



## foobar (15. Okt 2004)

Eine JavaBean muß einen parameterlosen Konstruktor haben und Serializable implementieren. Alle Felder die von außen zugänglich sein sollen , müssen enstprechende Setter und Getter haben. Wenn das alles gegeben ist, muß die Bean und ein entsprechendes Manifest in ein Jar verpackt werden.
Im Servlet gibt es mehrere Möglichkeiten um Jsp's eine Bean zur Verfügung zu stellen.

```
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
{
    ....
  MyBean b = new MyBean();
   req.getSession.setAttribute("mybean", b);
    ......
}
```

In der Jsp:

```
<jsp:useBean class="myClass" id="mybean" scope="Session"/>
<%= mybean.myMethod() %>
```
Mit dem Tag useBean kannst du auf JavaBeans zugreifen. Du kannst jetzt über die Variable mybean auf , die im Servlet erzeugte Bean zugreifen.

P.S. Guck dir mal das Kapitel über Beans in Java ist auch eine Insel an


----------



## arend (15. Okt 2004)

bevor ich das probiere noch eine frage:

auf meiner startseite schicke ich formulardaten mit einem submit-button ab. muss ich bei 'action' das servlet angeben, an das die werte geschickt werden?

ein bekannter meinte, da gehoert die url der zielseite rein. wenn ich das mache, findet aber keinerlei verarbeitung der daten im servlet statt ...

???


----------



## foobar (15. Okt 2004)

Klar mußt du im Formtag das Servlet angeben. Woher soll das Servlet sonst wissen was es machen soll?


----------



## arend (15. Okt 2004)

ok ... und wie definiere ich dann im servlet meine antwortseite?
also wie mache ich ihm klar, welche seite er als zielseite aufrufen soll?

bis hierher auf jeden fall schon mal danke fuer die zuegigen antworten!


----------



## foobar (15. Okt 2004)

```
req.getRequestDispatcher(res.encodeURL("myjsp.jsp")).forward(req, res);
```


----------



## arend (18. Okt 2004)

hat soweit alles geklappt, danke!

eine frage hab ich noch: wie kann ich die anzahl der ergebnisse (zeilen)  aus dem resultset auslesen, bevor ich es mit einer schleife durchlaufe? gibt es da irgendeinen weg?


----------



## foobar (18. Okt 2004)

Benutz doch eine While-Schleife:

```
ResultSet rs = stmt.execute("SELECT col1 FROM tbl");
While (rs.next)
{
   System.out.println( rs.getString(1));
}
```


----------



## arend (18. Okt 2004)

mmh ja, die ist schon eingebaut.

ich schiebe die daten aus dem resultset in ein array. das array wollte ich aber dynamisch halten, das heisst die anzahl der 'zeilen' im array sollte mit einer variable belegt werden anstatt mit einem festen wert.

dafuer brauche ich vor dem durchlaufen des resultsets mit der whileschleife irgendeine moeglichkeit, an die anzahl der ergebnisse meiner sql-abfrage zu kommen...


----------



## foobar (18. Okt 2004)

> dafuer brauche ich vor dem durchlaufen des resultsets mit der whileschleife irgendeine moeglichkeit, an die anzahl der ergebnisse meiner sql-abfrage zu kommen...


Das geht nicht, da das Resultset ein Cursor in der DB ist. Benutz doch eine Collection z.b. einen Vector, der passt seine Größe automatisch an.


----------



## Heiko (18. Okt 2004)

foobar hat gesagt.:
			
		

> > dafuer brauche ich vor dem durchlaufen des resultsets mit der whileschleife irgendeine moeglichkeit, an die anzahl der ergebnisse meiner sql-abfrage zu kommen...
> 
> 
> Das geht nicht, da das Resultset ein Cursor in der DB ist. Benutz doch eine Collection z.b. einen Vector, der passt seine Größe automatisch an.



Das stimmt, ich lese meine RS's auch immer in Vectoren ein. Geht ohne Probleme.


----------



## arend (18. Okt 2004)

haettet ihr ein quelltextbeispiel?
hab von vektoren noch nie was gehoert...


----------



## Heiko (18. Okt 2004)

So funktioniert das.
Wundere nicht über den rest vom Code, das ist aus einer riesigen Anwendung einfach rausgenommen.


```
Vector dop = new Vector();

				try
		{
			String query =
				"select * from "
					+ _dbap.getJdbc_sqlcollection()
					+ "."
					+ jdbc_Dateiname
					+ " ";
			
			prepstmt = null;
			prepstmt = connection.prepareStatement(query);
			int i = 1;

			ResultSet rs = prepstmt.executeQuery();
			int id = 0;

			while (rs.next())
			{

				An_angebevExBean db = resultSetToBean(rs);
				if (id != 0 && db.getLaufendeIdentNr() == id)
				{
					//System.out.println("Wert in dop: " + id);
					dop.add(db);

				}
				id = db.getLaufendeIdentNr();
				i++;
			}
			dop.insertElementAt(i+"",0);
```


----------



## foobar (18. Okt 2004)

> hab von vektoren noch nie was gehoert...


Na dann wirds aber Zeit ;-)


```
Vector v = new Vector(); // Vector initialisieren
ResultSet rs = stmt.execute("SELECT col1 FROM tbl");
While (rs.next)
{
   v.add( rs.getString(1)); // Vector mit Daten fuellen
}

// Vector durchlaufen und Daten ausgeben
Iterator it =  v.iterator();
while (it.hasNext())
{
     String s = (String) it.next();
     System.out.println( s );
}
```


----------



## Heiko (18. Okt 2004)

War schneller ;-)


----------



## arend (18. Okt 2004)

aah ... ihr macht 'nen wettbewerb ... deshalb immer diese unglaublich schnellen antworten 

kann ich einen vektor auch mehrdimensional anlegen oder muss ich mir das als eindimensionales, sequentielles konstrukt vorstellen?

was hab ich bei einem vektor - abgesehen von der variablen groesse - sonst noch fuer vorteile gegenueber arrays?


----------



## foobar (18. Okt 2004)

> kann ich einen vektor auch mehrdimensional anlegen oder muss ich mir das als eindimensionales, sequentielles konstrukt vorstellen?


Du kannst einen Vector auch n-dimensional anlegen. 

2-dimensionaler Vector:

```
Vector outer = new Vector();
Vector inner = new Vector();
inner.add("hello world");
outer.add(inner);
System.out.println(  ((Vector)out.get(0)).get(0)  );
```



> was hab ich bei einem vektor - abgesehen von der variablen groesse - sonst noch fuer vorteile gegenueber arrays?


Jede Menge ;-) Guckst du hier


----------



## arend (18. Okt 2004)

hab grad folgendes problem, vielleicht koennt ihr mir da auch weiterhelfen.
wenn die variable *blz * leer ist, also seitens des eingabeformulars keinen wert erhaelt, soll eine fehlerseite angezeigt werden.

komischerweise springt das servlet *immer* sofort in die else-anweisung, egal ob ich der variable *blz* im eingabefeld einen wert mitgebe oder nicht. was mach ich falsch?



```
//Variablen zur Aufnahme der Formularwerte
		String blz 		= null;
		String institut = null;
		String ort		= null;
		String plz 		= null;


		HttpSession session = request.getSession(true);
	
		blz 		= request.getParameter("blz");
		institut 	= request.getParameter("institut");
		ort			= request.getParameter("ort");
		plz 		= request.getParameter("plz");	
		
		if (blz == null)		
			{
				responseURL = "/fehler.jsp";
			} 
					
		else

                                               {	
				db.connect(db.dburl); 
				db.executeQuery(db.query1);
			}
```


----------



## foobar (18. Okt 2004)

@arend Bitte verwende für jedes Thema einen eigenen Thread !!!
@J2ee-Mods Bitte Thread teilen.


----------



## Heiko (18. Okt 2004)

du musst das mit equals vergleichen.


```
String blz ="plz";

if(blz.equals("")){//tu was}
else{""tu was anderes}
```


----------



## arend (18. Okt 2004)

@ foobar: sorry, hab ich nicht gewusst


----------



## arend (18. Okt 2004)

hat sich aber auch schon erledigt weil > es funktioniert
sorry nochmal, werd's das naechste mal beachten


----------



## Heiko (18. Okt 2004)

Wie hast du es denn jetzt gelöst?


----------



## arend (18. Okt 2004)

so wie du es hingeschrieben hast


----------



## Heiko (18. Okt 2004)

arend hat gesagt.:
			
		

> so wie du es hingeschrieben hast



OK ;-)

Freut mich, wenn ich dir helfen konnte.


----------

