# @ViewScoped



## internet (23. Apr 2014)

Hallo zusammen,

ich habe nun endlich auf JSF 2.2 umgestellt.
Insbesondere auch aus dem Grund um @ViewScoped nutzen zu können.

Nun habe ich allerdings auch schon die erste Schwierigkeiten:
Ich habe zwei Seiten:

a) liste.xhtml
b) edit.xhtml

In der liste.xhtml habe ich natürlich Objekte in einer Liste. Über eine Methode rufe ich dann die edit.xhtml - Seite auf.

Ich habe zwei Beans:
a) InterestGeneralListController => Hier ist die Methode zum Aufrufen der edit.xhtml- Seite mit folgender Methode:
b) InterestGeneralEditController => dort wird dann editiert oder gespeichert


```
public String doEditInterestGeneral(InterestGeneral interestGeneral) {
interestGeneralEditController.setInterestGeneralToEdit(Mode.EDIT,
				interestGeneral);
		return Pages.EDIT;
	}
```

Das "InterestGeneral" übergebe ich in der Liste, welches dann zudem auch mein Link zur Edit-Seite ist.

```
<p:commandLink ajax="false"
						action="#{interestGeneralListController.doEditInterestGeneral(interestGeneral)}">
						<h:outputText value="#{interestGeneral.contentCategory.name}" />
					</p:commandLink>
```

Die Methode *doEditInterestGeneral(interestGeneral)* in InterestGeneralEditController sind so aus:

```
public void setInterestGeneralToEdit(Mode mode,
			InterestGeneral interestGeneral) {

		this.interestGeneral = interestGeneral;
		this.mode = mode;
	}
```

Mode ist ein Enum, das mit je nachdem Add oder Edit zuweist.
Mein Problem ist nun:

Wenn ich nun InterestGeneral editieren möchte, ist interestGeneral immer NULL.
Ich bin mit dem Debugger drüber, beim Klicken auf den Link zum Editieren wird alles richtig gesetzt. Wenn ich nun zur anderen View (edit.xhtml) wechsle, ist interestGeneral wieder NULL.
Klar kann ich das mit SessionScoped umgehen, aber das ist nicht Sinn der Sache.

Wie kann ich das ganze anderst machen?


----------



## fisherman (27. Apr 2014)

```
public String doEditInterestGeneral(InterestGeneral interestGeneral) {
interestGeneralEditController.setInterestGeneralToEdit(Mode.EDIT,
                interestGeneral);
        return Pages.EDIT;
    }
```
Das Problem könnte hier liegen. Offenbar willst du in der View edit.xhtml bleiben. Dazu muss die Methode aber null zurückgeben. Die Rückgabe eines konkreten Werts veranlasst JSF dazu, die View komplett neu zu bauen. Null lässt JSF dieselbe View wiederverwenden. Das ist eine JSF-Konvention.


----------



## internet (27. Apr 2014)

Danke für Deine Antwort.

Ich möchte ja auch quasi eine andere View.
Ich befinde mich auf der View liste.xhtml und klicke einen Button, welches dann die Methode doEditInterestGeneral aufruft.


----------



## fisherman (27. Apr 2014)

Für den Wechsel zwischen Views ist 
	
	
	
	





```
@ViewScoped
```
 allerdings nicht gedacht. Vielleicht suchst du so etwas wie 
	
	
	
	





```
@CustomScoped
```
. Schau dir mal den Artikel bei BalusC an. Das ist eine schöne Übersicht.


----------



## internet (27. Apr 2014)

ich habe diesen Workaround aus einem JAVA Buch, aber dort war es auch immer SessionScoped, was aber für mich überhaupt keinen Sinn macht.

Daher meine Frage:
Macht dieser Workaround überhaupt Sinn bzw. wie kann man ihn lösen ohne SessionScoped (@CustomScoped möchte ich eig. auch nicht verwenden) Einer von den definierten Scopes muss doch gehen.

Mein Ansatz wäre nun @ViewAccessScoped zu nehmen... Aus der CDI-Erweiterung von MyFaces.
Aber wie sieht dies mit der Performance aus? Ist das zu empfehlen?


----------



## fisherman (27. Apr 2014)

internet hat gesagt.:


> @CustomScoped möchte ich eig. auch nicht verwenden


Den Scope solltest du danach auswählen, was sinnvoll ist, nicht danach, ob er dir behagt.



internet hat gesagt.:


> Einer von den definierten Scopes muss doch gehen.


Davon ist auszugehen. Ob du einen JSF-Scope nimmst oder einen von MyFaces, sollte allein von fachlichen Erwägungen abhängen. Um Performance musst du dir keinen Gedanken machen.


----------



## internet (27. Apr 2014)

fisherman hat gesagt.:


> Ob du einen JSF-Scope nimmst oder einen von MyFaces, sollte allein von fachlichen Erwägungen abhängen.



Was genau meinst du damit? Kannst du das näher erläutern.
Auch würde mich interessieren, worin der Unterschied besteht zwischen den JSF-Scope (Ich nehme an, du meinst damit den JAVA EE Standard "mojarra" ?) und MyFaces.

In Fachbeiträgen habe ich des öfteren gelesen, dass MyFaces deutlich besser in der Performance ist.

Vielen Dank schon Mal für Deine Hilfe


----------



## fisherman (27. Apr 2014)

Damit meine ich, dass du die Implementierung bzw. ein Framework nach dem Kriterium auswählst, ob es für dein Projekt geeignet und sinnvoll ist. Das schließt natürlich auch Fragen der Performance ein. Wenn Fachartikel von Benchmarks berichten, wird da schon etwas dran sein. Hängt aber auch von der Version der Implementierung ab. Die Entwickler der Frameworks schlafen ja auch nicht und bekommen mit, wenn andere Entwickler mangelhafte Performance beklagen. Wo die Unterschiede in den Scopes liegen, musst du schon selbst recherchieren. Einen Link habe ich dir genannt.


----------



## internet (28. Apr 2014)

Die Frage mit der Unterscheidung der Scopes zielte darauf ab, was der Unterschied zwischen Mojarra und MyFaces ist.

Gibt es in MyFaces ebenso ein @SessionScoped usw.?


----------



## fisherman (28. Apr 2014)

Zwischen Mojarra und MyFaces gibt es keine großen Unterschiede, sie implementieren ja die gleiche Spezifikation. Mojarra ist die Referenzimplementation. Das beantwortet auch deine Frage bezüglich @SessionScoped. Hilfreich ist die Dokumentation dazu. Die ist öffentlich zugänglich, und mit ihr solltest du dich etwas vertraut machen.


----------



## tandraschko (28. Apr 2014)

Wenn du CDI benutzt für die Managed beans, nimm einfach Apache DeltaSpike (der Nachfolger von MyFaces CDI aka CODI). Da gibts nen ViewAccessScoped.
Der ist länger als ViewScoped und kürzer als SessionScoped - wird auch automatisch zerstört.

Wegen Performance brauchst du dir bei solch einen Scope keine Sorgen machen. Da ist eher die JSF-Impl die Bremse und nicht der jeweilige Scope.
Wenn du auf Performance bestehst, würde ich zu MyFaces (als JSF-Impl) und OpenWebBeans (als CDI-Impl) greifen.


----------

