# [JSF] bedingte Ausgabe



## JasonV (7. Apr 2009)

Moin ;-)

Also, bin noch recht frisch im JSF-Thema drin. Ich stehe nun vor einem kleineren Problemchen:

Ich habe eine Seite, auf der man einen Text eintragen kann (dahinter eine request scoped bean). Nach dem Submit soll im Erfolgsfall ein Text angezeigt werden. Wie kann ich das verwirklichen? 

Eigentlich sollte die Bean nicht zu einer Session-Bean werden. Oder bietet sich das hier an, weil ich eigentlich im Erfolgsfall auch noch den Empfänger ausgeben wollte. Allerdings kann man mit der Applikation viele Nachrichten hintereinander versenden, also müsste ich die Bean ja nach jeder Aktion "leeren" (in der action-Methode wohl) und dort eine Historie pflegen. Aber gibt es auch einen anderen Weg?


Gruß und Danke für Ideen,
jasonv


----------



## mmeyer1987 (7. Apr 2009)

Moin,

Noch einer aus dem Norden?! :toll:


Für das bedingte Anzeigen von Text hast du mehrere Möglichkeiten, spontan fallen mir zwei ein:


Eine Messages-Komponente, der du eine Message anhängst. Dieses kannst du in der durch das Submit aufgerufenen Action machen.


Du legst dir einen Outputtext mit der Nachricht auf die Seite, und setzt das rendered-Attribut auf false. Nach (dem von dir definiertem) erfolgreichem Ausführen der Action setzt du es noch auf true, dann würde der Text beim nächsten Rendern erscheinen.

Vom Session Scope würde ich persönlich dir in diesem Fall auch abraten, da du sonst wie du selbst sagst, dafür sorgen müsstest, wann du welche Daten wieder nullst usw. 


Hoffe, das war etwas verständlich? Bin selbst noch nicht so ewig lang in der Thematik. :rtfm:  


Gruß, Manuel


----------



## JasonV (7. Apr 2009)

mmeyer1987 hat gesagt.:


> Noch einer aus dem Norden?! :toll:


Ne, Ruhrgebiet - aber ich nutze das hier um mich abzugrenzen von den ganzen Muffeln 



mmeyer1987 hat gesagt.:


> Eine Messages-Komponente, der du eine Message anhängst. Dieses kannst du in der durch das Submit aufgerufenen Action machen.
> 
> 
> Du legst dir einen Outputtext mit der Nachricht auf die Seite, und setzt das rendered-Attribut auf false. Nach (dem von dir definiertem) erfolgreichem Ausführen der Action setzt du es noch auf true, dann würde der Text beim nächsten Rendern erscheinen.


Bei Methode 1 verstehe ich nicht, wie das laufen soll. Könntest Du mir das verdeutlichen?

Punkt 2 habe ich über die Session-Bean gemacht (momentan, damit ich den Text überhaupt mal sehe), also meine request scoped zu session scoped. Da habe ich dann das rendered-Attribut benutzt und habe nach erfolgreichem Versand eine boolean und den alten Empfänger als getter integriert. 


Gruß,
Carsten


----------



## mmeyer1987 (7. Apr 2009)

Hi,

hier zu Methode 1:

Auf der jsp-Seite habe ich mir ein Hidden-Input-Textfeld angelegt, siehe hier:

```
<h:inputHidden id="inpHidden" value="null"></h:inputHidden>
```

Gleich dazu eine Message-Komponente, die für das Textfeld da ist:


```
<h:message for="inpHidden"></h:message>
```

Das Hidden-Inputfeld ist also nur Halter für eine Message-Komponente. Ich habe mehrere Stellen, an denen ich Messages haben will, deswegen.

Für das Hidden-Input-Feld hast du im Pagecode nun auch den Getter:


[HIGHLIGHT="Java"]protected HtmlInputHidden getInpHidden() {
		if (inpHidden== null) {
			inpHidden= (HtmlInputHidden) findComponentInRoot("inpHidden");
		}
		return inpHidden;
	}[/HIGHLIGHT]


In der Java-Action könntest du folgendes machen:

[HIGHLIGHT="Java"]
public String doAction() {
// Hier deine Verarbeitungen machen.

	if(meineAktionenWarenErfolgreich){
	// Hier Message anlegen
	FacesMessage mess = new FacesMessage(FacesMessage.SEVERITY_INFO,"Meine Summary-Nachricht", "Meine Detail-Nachricht");
	// Message an Komponente hängen
	FacesContext.getCurrentInstance().addMessage(getInpHidden().getClientId(FacesContext.getCurrentInstance()), mess);
	}
}[/HIGHLIGHT]


Wird dir das deutlich?

Grüße!


----------



## JasonV (7. Apr 2009)

Das klingt logisch und wesentlich eleganter. Ich danke Dir!


----------



## maki (7. Apr 2009)

Methode 2 (das rendered Attribut) ist besser & der Standard Weg für so ein verhalten, zusammen mit der EL kann man da sehr viel machen


----------



## mmeyer1987 (7. Apr 2009)

maki hat gesagt.:


> Methode 2 (das rendered Attribut) ist besser & der Standard Weg für so ein verhalten, zusammen mit der EL kann man da sehr viel machen



Moin,

Das rendered Attribut im Zusammenhang mit EL nutze ich zur bedingten Anzeige von Komponenten bzw. kompletten Teilbereichen meiner Seiten. Aber wieso für Messages? Für mich sind diese Messages request-scoped, sprich, beim nächsten Request will ich nicht selber gucken müssen, das die wieder auf false gesetzt werden. 

Oder wo ist mein Denkfehler? ???:L

Gruß


----------

