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

Status
Nicht offen für weitere Antworten.

k4lle

Mitglied
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.
 
M

maki

Gast
Du brauchst einen Konverter.

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

k4lle

Mitglied
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
Code:
    .
.
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
Code:
	<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...
 
M

maki

Gast
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

Mitglied
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

Top Contributor
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

Mitglied
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.
 
M

maki

Gast
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:
Code:
<%@ taglib uri="http://sourceforge.net/projects/facestrace" prefix="ft"%>

und das tag setzen:
Code:
<ft:trace />

Dann weisst du zumindest ungefähr, was los ist ;)
 

k4lle

Mitglied
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:

Code:
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.


Code:
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 ;-)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Serverseitige Objekte in JSF Allgemeines EE 0
OnDemand Performance Probleme wegen vieler Objekte Allgemeines EE 3
C Objekte aus EJB an Client schicken Allgemeines EE 6
N Objekte zwischen zwei Application Contexts austauschen Allgemeines EE 19
T Zugriff auf Session-Objekte in JSP Allgemeines EE 2
G Wie Objekte von JSP nach Servlet? Allgemeines EE 4
T Struts und Objekte in Comboboxen Allgemeines EE 4
T Objekte an Taglib übergeben Allgemeines EE 7
D JSP - Datenmodell - Objekte speichern Allgemeines EE 6
D neues Fenster öffnen Allgemeines EE 3
R HTML Formular Allgemeines EE 3
Streeber JSF Formular Überprüfung -> TF markieren Allgemeines EE 2
S JSP Parameter mit Formular übergeben Allgemeines EE 2
T Scopes - Daten in JSF-Formular anlegen/bearbeiten, Felder vorbelegen Allgemeines EE 3
G Framework für selbsterstellte Formular und Seiten gesucht Allgemeines EE 3
I Über Formular Daten zu Servlet Allgemeines EE 36
H File Upload per Formular - prinzipielle Vorgehensweise? Allgemeines EE 2
N Über Formular Bild auf FTP uploaden u. Strings in ne DB Allgemeines EE 3
M Online Formular Allgemeines EE 7
K Servlet per Formular aufrufen Allgemeines EE 8
S JSP/Servlet -> Einzelne Zeilen aus DB in Formular darstel Allgemeines EE 19
H Parameterübergabe ohne Formular? Allgemeines EE 7
B Formular Allgemeines EE 25
J Formular aktualisieren-Daten werden erneut in DB geschrieben Allgemeines EE 6

Ähnliche Java Themen

Neue Themen


Oben