# Objekte in ein neues Formular laden und dort verändern JSF?



## k4lle (16. Okt 2007)

Ich habe folgendes Problem. Ich habe ein JSF-Formular dessen Eingaben ich mittels Hibernate in einer DB speichere. Jetzt erstelle ich auf einer neuen Seite ein neues JSF-Formular und will da die ausgewählte Zeilen aus der <h:datatable> laden, um sie dort verändern zu können. 
Problem:
HTTP transportiert nur Strings. Also habe ich einfach meine Bean-Properties (z.B. Name und Alter) in Strings umgewandelt und rufe diese mittels value="..." in dem neuen Formular auf. Natürlich sind jetzt die Strings mitels value mit der JSF-Komponnete verbunden. So kann ich also nur die ausgewählten Zeilen in einem neuen Formular lesen.
Ich will aber die Bean-Properties (Name und Alter) in dem neuen Formular ändern können. Ich weiß aber absolut nicht wie ich das anstellen soll.

Kurzgefasst:

Formular    ->    DB    ->   neues Formular auf andere.jsp, welches die Bean Properties des ersten Formulars laden sol, 
                                       damit diese dort verändert werden könne.

Über Hilfe würde ich mich sehr freuen.


----------



## maki (16. Okt 2007)

Du brauchst einen Konverter.

Der wandelt ein Objekt in einen String um, und umgekehrt.


----------



## k4lle (16. Okt 2007)

ok den konverter brauche ich um die objekte in string umzuwandeln (und umgekehrt). da liegt aber nicht mein eigentliches problem. 

habe zum test z.b. die bean-properties einzeln in strings umgewandelt. schlechte lösung, aber zum experimentieren ok

```
.
.
private String aktName;
    private String aktAge;
.
.
	public String getAktName(){
		return aktName;
	}
	public void setAktName(String aktName){
		this.aktName = aktName;		
	}
	public String getAktAge(){
		return aktAge;
	}
	public void setAktAge(String aktAge){
		this.aktAge = aktAge;
	}
.
.
    	 aktName = derUser.getName().toString();
    	 aktAge = Integer.toString(derUser.getAge());
.
.
```

in dem neuen formular lasse ich mri die string anzeigen

```
<h:panelGrid columns="2">
		<h:outputLabel id="n" value="Name"></h:outputLabel>
		<h:inputText id="n1" value="#{UserHandler.aktName}"></h:inputText>
		<h:outputLabel id="a" value="Alter"></h:outputLabel>
		<h:inputText id="a1" value="#{UserHandler.aktAge}"></h:inputText>
	</h:panelGrid>
```

will ich so natürlich nicht, sondern will die eigentlichen bean properties Name und Alter in dem formular darstellen, damit sie da verändert werden können.

Frage zum Konverter:
Wenn ich den Konverter natürlich so schreiben kann, das er die Bean-Properties Name und Alter in Strings umwandelt und ich somit in meinem neuen Formular mittels value="#{UserHandler.Name}" und value="#{UserHandler.Alter}" auf die Properties zugreifen kann, dann ist mein Problem auf jeden Fall gelöst. Dann müßte ich ja ganz normal die Attribute in dem neuen Formular verändern können. 
Ich hoffe ich drücke mich deutlich aus...


----------



## maki (16. Okt 2007)

Für die üblichen verdächtigen (Integer, String, etc.) brauchst du keinen eigenen zu schreiben, für andere gibt es Standardkonverter (zB. Date), für eigene Objekte brauchst du aber einen.


----------



## k4lle (16. Okt 2007)

beim koverter geht es doch darum: z.B. in der view wird ein datum als textstring dargestellt und wenn ich dieses datum mit der bean-property datum verbinde, muss es konvertiert werden, da java mit java.util.Date arbeitet. (Standardkonverter DateTimeConverter).

Ich aber lade eine neue JSF-Seite (Formular) und will dort die Bean-Properties Name und Alter laden und verändern können. Name ist ein String. alter ein int. Also wird für Name kein Konverter und für alter der IntegerConverter standardmäßig benutzt. 

da ja eine neue jsf-seite aufgerufen wird (lebenszyklus startet neu), muss der int-Wert alter in ein string gewandelt werden, da HTTP nur String transportiert. ich habe also probleme zu verstehen, wie ich den int-wert alter in ein string wandel (wegen dem transport in HTTP) und diesen dann auf einer neuen seite in einem formular lade um ihn dort verändern zu können.

ich kann es mir doch eigentlich so vorstellen:

View-Komponnete   <--->    KOnverter   <---> Bean-Property
befinde ich mich innerhalb einer seite kann ich das ja verstehen, aber da bei mir ja eine neue seite aufgerufen wird habe ich da wohl ein paar verständnisprobleme.

ich muss also in meinem neuen formular so auf die properties zugreifen können, damit ich sie verändern kann:
value="#{UserHandler.Name}" und value="#{UserHandler.Age}"

ich hoffe du kannst mir kurz erklären was ich da nicht verstehe.... 
vielen dank.


----------



## y0dA (16. Okt 2007)

> da ja eine neue jsf-seite aufgerufen wird (lebenszyklus startet neu), muss der int-Wert alter in ein string gewandelt werden, da HTTP nur String transportiert. ich habe also probleme zu verstehen, wie ich den int-wert alter in ein string wandel (wegen dem transport in HTTP) und diesen dann auf einer neuen seite in einem formular lade um ihn dort verändern zu können.



Du solltest den *int Wert* einfach als *Integer Objekt* ablegen damit klappt die Ausgabe ohne zuvor auf String zu konvertieren (Stichwort Wrapper Klassen).



> View-Komponnete <---> KOnverter <---> Bean-Property
> befinde ich mich innerhalb einer seite kann ich das ja verstehen, aber da bei mir ja eine neue seite aufgerufen wird habe ich da wohl ein paar verständnisprobleme.
> 
> ich muss also in meinem neuen formular so auf die properties zugreifen können, damit ich sie verändern kann:
> value="#{UserHandler.Name}" und value="#{UserHandler.Age}"



Falls du tatsächlich eine neue Seite (= dieselbe oder ein forward auf eine "andere" Seite, bspw: Allgm. Ansicht forward auf Detailansicht) aufrufst kannst du ja nach wie vor auf den *Controller* der zuvor aktuellen Seite zugreifen.


Irgendwie verstehe ich dein Problem nicht so ganz


----------



## k4lle (16. Okt 2007)

das habe ich mir schon fast gedacht :-(. Ich teste jetzt nochmal und wenn es nicht klappt schreibe ich gleich nochmal kurz was dazu. ich finde es schwierig etwas zu beschreiben, wenn mir leider an einer stelle ein wenig das verständnis fehlt. ich will das genau verstehen was da passiert und deswegen teste ich jetzt und wenn ich das nicht hinbekomme, dann melde ich mich später nochmal.

Trotzdem schonmal danke für die Antworten.


----------



## maki (16. Okt 2007)

Du solltest schon verstehen, wie JSF funktioniert, vor allem der LifeCyle.

Factestrace kann ich nur empfehlen: http://facestrace.sourceforge.net/

In der JSP (zB. im footer) die taglib einbinden: 

```
<%@ taglib uri="http://sourceforge.net/projects/facestrace" prefix="ft"%>
```

und das tag setzen:

```
<ft:trace />
```

Dann weisst du zumindest ungefähr, was los ist


----------



## k4lle (16. Okt 2007)

ich hätte mir vielleicht einfach mal bevor ich euch den ganzen text schreibe nochmal in das programm gucken soll. habe da nämlich vor ein paar tagen herumgebastelt und jetzt habe ich erstmal wieder genau gesehen wo überhaupt mein Problem liegt. ich hatte irgendwie was anderes im kopf wieso es nicht klappt.
naja das hier war mein problem:


```
private Integer aUser;
.
.
     public void getalleUser() {  
         User aktUser = (User)this.getDataTable().getRowData(); 
         System.out.println("Der User ist: " + aktUser);
         System.out.println(aktUser.getUserId());
         this.aUser = aktUser.getUserId();
.
.
     public String loadUser(){
    	 Session session = HibernateSessionVerwaltung.getSession();
    	 User derUser = (User) session.load(User.class, aUser);
    	 return "laden";
     }
```

wenn ich jetzt im commandButton per action="#{UserHandler.loadUser}" aufrufe, dann wird der gerade eingetragene Benutzer in einen neuen Formular dargestellt. Fürs löschen ist das natürlich gut, da dann genau dieser eingetragene Benutzer gelöscht wird. Da ich aber natürlich beim Aufruf von loadUser den aktuell ausgewählten Benutzer in einem neuen Formular laden wollte habe ich die Funktion loadUser() wie folgt erweitert.



```
public String loadUser(){
    	 Session session = HibernateSessionVerwaltung.getSession();
    	 User derUser = (User) session.load(User.class, aUser);
    	 user.setName(derUser.getName());
    	 user.setAge(derUser.getAge());
    	 return "laden";
     }
```

Falls ihr (als erfahrene JSF-Freaks bzw. Java ;-)) denkt das man das schöner lösen kann, dann würde ich mich auf Anmerkungen freuen.
Also das obere einfach vergessen . Über das was ich da meine muss ich mir selber einfach mal in Ruhe gedanken machne und nachlesen. Naja trotzdem danke für eure schnellen Antworten ;-)


----------

