# jsp:useBean



## ivan_7 (29. Jun 2007)

hallo allerseits

ich habe probleme mit dem erzeugen einer bean in der jsp-seite. hier der auszug aus meiner jsp-seite: 

```
<body>
	<jsp:useBean id="person" class="beans.Person" scope="request"/>
	<jsp:setProperty name="person" property="*" />
	

	<h2 align="center">Willkommen</h2>
	<hr width="40%" align="center" />
	<div align="center">
		<form action="/pers_app/PersonenController" method="get">
			<table align="center" cellpadding="3">
				<tr>
					<td align="right">Name:</td>
					<td><input type="text" name="name" size="32" />
				</tr>
				<tr>
					<td align="right">Vorname:</td>
					<td><input type="text" name="vorname" size="12" />
				</tr>
				<tr>
					<td align="right"><input type="reset" value="Reset"/></td>
					<td><input type="submit" value="Senden"/></td>
				</tr>
			</table>
		</form>
	</div>
	<hr width="40%" align="center" />
</body>
```
die bean beans.Person hat zwei eigenschaften: name und vorname und entsprechende set- und get-methoden (den standardkonstruktor auch). 

wenn ich im _PersonenController_-Servlet die Bean auslesen möchte, bekomme ich immer *null*:


```
Person person = (Person)request.getAttribute("person");
```

icht hätte gedacht, dass die bean erzeugt wird und mit dem absenden des formulars die werte für name und vorname in die bean-eigenschaften übernommen werden. ist das den nicht so? und, wann wird dann die bean erzeugt?


danke


----------



## ivan_7 (29. Jun 2007)

nun, ich habe jetzt scope auf _session_ geändert: 


```
<jsp:useBean id="person" class="beans.Person" scope="session"/>
```

wenn ich im servlet auf das bean zugreife (über session), dann ist das bean vorhanden. aber, es würde mich schon interessieren, was mit der request-scope falsch ist? liegt es daran, dass ich eine weiterleitung (RequestDispatcher) mache? 

und noch was. ich habe gemeint, dass alle formularfelder-eingaben automatisch in die bean übernommen werden, wenn ich es wie fogt angebe: 


```
<jsp:useBean id="person" class="beans.Person" scope="session"/>
<jsp:setProperty name="person" property="*" />
```

nun, irgendwie klappt das nicht. ich habe das gefühl, dass die bean nach dem absenden des formulars keine übernahme von felderinhalten macht!!! mache ich was falsch, oder ist das wirklich so?

ich habe jetzt ein "work around" gemacht und eine jsp-seite dazwischen geschaltet. diese nimmt einfach die anfrage der erste jsp-seite und leitet sie an servlet (jsp:forward). es funktioniert, das ist einmal gut. aber, ist es wirklich so, dass beim senden vom formular keine übernahme von felderinhalten in die bean-eigenschaften statt findet? oder, gibt es eine bessere, elegantere lösung für die automatische übernahme von daten in die bean, ohne dass man mit ener zwischenseite arbeiten muss?

danke


----------



## HLX (30. Jun 2007)

Hallo Ivan,

ob es am RequestDispatcher liegt ist eine Frage deiner implementierung, aber ich vermute mal: ja! Der RequestDispatcher kann durchaus die Ursache dafür sein.

Zum <jsp:usebean>:
Deine Bean kann keine Werte enthalten, da es keine Verbindung zwischen deinem HTML-Formular und der Bean gibt. Woher soll das Input-Tag wissen, dass es deine Bean füllen soll. Die Verwendung von <jsp:setProperty> in Verbindung mit einem Formular ist auch mangels Eleganz nicht sehr gebräuchlich.

Mein Tipp:
1. Übertrage das Formular zum Servlet. Dort findest du deine Formularwerte als Request-Parameter (request.getParameter("name). Hier füllst du manuell deine Bean mit diesen Werten.
2. Wenn du willst, das die Eingabeseite beim Wiederaufruf die zuletzt eingegebenen Werte anzeigt, verwende
in der JSP-Seite <jsp:useBean> mit scope="session". Bei den Eingabefeldern benutzt du beim Attribut "value" <jsp:getProperty> um Werte aus der Bean anzuzeigen. 
3. Vergiss <jsp:setProperty> - im Servlet kannst du viel besser debuggen
4. Wenn dir die manuelle Übertragung der Werte zu lästig ist, verwende ein Framework (z.B. Apache Struts). Dieses macht das dann für dich


----------



## ivan_7 (30. Jun 2007)

danke, HLX!

nun, wollte ich eigentlich den code im servlet reduzieren (keine typumwandlung, kein exception-handlicht usw.). aber, du hast recht. ich werde es halt so machen.


----------

