JSF "Komponenten dynamisch rendern" oder auch "die 'nächste' Seite beeinflussen"

Wutklumpen

Mitglied
Der Wutklumpen mal wieder, Hallo!

---
€dit: Oh man, was für ein Roman oO Ich versuch grade mal die Fragen zu extrahieren, wer möchte kann aber gerne Lesen =)

1. Gibts ne tolle möglichkeit, selbst in ein Bean einzugreifen und deren Daten zu ändern?
2. Kann einer action-Methode irgendwie Parameter übergeben werden?
3. Kann man eine actionListener-Methode zu einer navigation überreden?
4. Wie kann man am einfachsten zur Laufzeit zB values von Components ändern?

Ich lass das mal so kurz und knapp stehen, detailierter gibts unten ;)
-----

Ich arbeite ja nun seit einigen Wochen mit JSF, aber so manche Vorgehensweisen sind mir wohl nicht wirklich bekannt!

Ich arbeite seit letzter Woche an einer Datatable, wir ganz normal gefüllt, und jede Row bekommt einen Edit u. einen Delete-Button.

Die Delete-Funktion klappt super, aber an der Edit-Funktion hab ich grade zu kämpfen.
Um der Datatable neue Datensätze hinzuzufügen, gibts ne CreateNewConfig-Seite, die die Daten aufnimmt.
Da ich unter chronischer Redundanzvernichtungsmanie leide, versuche ich natürlich diese CreateNewConfig-Seite zum Editieren wieder zuverwenden.
(Frage 1)
1. Problem hierbei war, die Daten aus der Tabellenrow wieder in die Bean zu brigen, damit die Daten automatisch in der Textfeldern stehn.
Gibts ne tolle möglichkeit, selbst in ein Bean einzugreifen und deren Daten zu ändern? Oder macht man das eigentlich generell nicht?
Gelößt hab ichs, nach meinem Empfinden wieder mal etwas unschön.

Der Edit-Button hat ein action u. ein actionListener-Attribut, die Method hinter action gibt nur nen String zurück, um auf die CreatNewconfig-Seite zu navigieren.
(Frage 2/3)
(Da fällt mir gleich ne Zwischenfrage ein, kann man entweder:
einer action-Methode, irgendwie Parameter übergeben?
oder eine actionListener-Methode zu einer navigation überreden?
Selbst wenn die actionListener-methode einen String zurückgibt, der einem outcome enspricht tut sich da nix, oderm uss man die dann zusammen nutzen, so wie ich es grade tue?)

...
Die Methode des actionListeners holt sich die Daten der geklickten Row und schreibt selbige eben in die Variablen der Bean. (this.VARIABLE = RowData.getVARIABLE). So funktionierts, die Daten stehen dann auch in der Form auf der CreateNewConfig-Seite.

(Frage 4)
Zum anderen Umstand:
Auf der CreateNewConfig-Seite steht ja nun überall in Überschriften usw "Create New".
Meine eigentliche Intension war es, dass ich mir sobald der Edit-Button gedrückt wird den FacesContext schnappe, getViewRoot().findComponent("Id´s der betreffenen Überschrifften ") und einfach deren value kurzzeitig ändere, bzw die actionListener-Methode vom Button auf eine update- stat save-Methode setze.
Hierbei habe ich nicht wirklich nen Anhaltspunkt wie bzw wo ich das machen soll.

Meine jetztige Lösung ist, dass ich zu jeder Überschrift 2 Komponenten hab, von denen eine nich gerendert, das selbe bei dem(n) Button(s), dazu natürlich noch ein möglicherweise völlig unnötigen extra-bool in der Bean, welcher das rendern steuert.

Code:
<h:outputText id="createConfig" value="Create new Configuration" rendered="#{!configBean.shallChange}"/>
<h:outputText id="editConfig" value="Edit Configuration" rendered="#{configBean.shallChange}"/>

Das is doch suboptimal, dass muss doch anders gehen!
Ich hab wenigstens noch versucht, diese "Doppelkomponenten" von außen zu steuern, wieder über FacesContext.getvieRoot().findComponent("xxx").setRendered();
Diese Funktion wird aber scheinbar zu früh aufgerufen, als das der FacesContext der von der CreateNewconfig-Seite sei. Und somit hat das lediglich die Auswirkung das sich garnichts mehr tut, weil er die Components nicht findet.

Mit nem valueChangeListener würde es ja gehn, aber das ganze soll ja ohne usereingriff gehn, sonst kann ichs mir auch sparen. Ich suche also jetzt noch eine Möglichkeit, ohne Usereingriff eine bestimmt Methode aufzurufen

Merci, für jegliches Komentar!
Klümpchen
 
Zuletzt bearbeitet:
Oh, für 4. hab ich gerade eine vllt elegantere Lösung gefunden.

im <f:view>-Tag gibts ein tolles "beforPhase"-Attribute, dem ich ne Methode übergeben kann, welche da so aussieht:
Code:
public void setShownElements(PhaseEvent event)
	{
		FacesContext fc = event.getFacesContext().getCurrentInstance();
		if(this.shallChange)
		{	
			System.out.println("Shall Change!");
			fc.getViewRoot().findComponent("form1:createPipeline").setRendered(false);
			fc.getViewRoot().findComponent("form1:editPipeline").setRendered(true);
			fc.getViewRoot().findComponent("form1:save_new").setRendered(false);
			fc.getViewRoot().findComponent("form1:save_edit").setRendered(true);
		}
		else
		{
			fc.getViewRoot().findComponent("form1:createPipeline").setRendered(true);
			fc.getViewRoot().findComponent("form1:editPipeline").setRendered(false);
			fc.getViewRoot().findComponent("form1:save_new").setRendered(true);
			fc.getViewRoot().findComponent("form1:save_edit").setRendered(false);
		}
	}

Jetzt sind zwar nachwievor die Doppelelemente vorhanden, werden aber wenigstens nich direkt durch das rendered-Attribut beeinflusst.

Gibts hierzu anmerkungen? Is das vllt sogar für sowas gedacht?^^
 
Zurück