Von einer Aktion in meiner Bean aus versuche ich, auf eine andere Seite umzuleiten, wobei ein Ansichtsparameter erwartet wird. Was ist der empfohlene Weg, dies in JSF2 zu tun?
Zum Beispiel meine Quellseite ist: http: //localhost/page1.xhtml
es hat eine Befehlsschaltfläche, die eine Aktion aufruft:
<h:commandButton value="submit" action="#{myBean.submit}" />
wo meine Bohne aussieht:
@ManagedBean
@RequestScoped
public class MyBean {
private int id;
public String submit() {
//Does stuff
id = setID();
return "success";
}
Und jetzt möchte ich, dass die Aktion "Submit" zurückkehrt, um zu navigieren http: //localhost/page2.xhtml? Id = 2
Ich habe versucht, dies mit einem view-param in meinem Navigationsfall zu tun, aber mit ungeraden Ergebnissen. Das Faces-Konfigurations-Snippet sieht folgendermaßen aus:
<navigation-rule>
<from-view-id>/page1.xhtml</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/page2.xhtml</to-view-id>
<redirect>
<view-param>
<name>id</name>
<value>#{myBean.id}</value>
</view-param>
</redirect>
</navigation-case>
</navigation-rule>
Das seltsame Verhalten ist, obwohl myBean so eingestellt ist, dass es einen Anforderungsbereich anfordert, es ruft myBean.getId () nur beim ersten Laden meiner Anwendung auf und verwendet denselben Wert für alle nachfolgenden Aufrufe, wodurch falsche Ansichtsparameter für page2 erzeugt werden.
Also suche ich entweder nach einem besseren Weg oder nach einem Grund/einer Lösung, warum der view-param nicht jedes Mal von meiner Bean abgerufen wird.
Das Unbegreifliche beim Übergeben von Parametern in JSF ist, dass Sie nicht entscheiden, was gesendet werden soll (in der Aktion), sondern was Sie empfangen möchten (auf der Zielseite).
Wenn Sie eine Aktion ausführen, die mit einer Weiterleitung endet, werden die Metadaten der Zielseite geladen, und alle erforderlichen Parameter werden gelesen und als Parameter an die URL angehängt.
Beachten Sie, dass dies genau der gleiche Mechanismus ist wie bei jeder anderen JSF-Bindung: Sie können den Wert von inputText nicht von einer Stelle aus lesen und an einer anderen Stelle schreiben lassen. Der in viewParam definierte Wertausdruck wird sowohl zum Lesen (vor der Umleitung) als auch zum Schreiben (nach der Umleitung) verwendet.
Mit deiner Bohne machst du einfach:
@ManagedBean
@RequestScoped
public class MyBean {
private int id;
public String submit() {
//Does stuff
id = setID();
return "success?faces-redirect=true&includeViewParams=true";
}
// setter and getter for id
Wenn die empfangende Seite
<f:metadata>
<f:viewParam name="id" value="#{myBean.id}" />
</f:metadata>
Es wird genau das tun, was Sie wollen.
Ohne eine schönere Lösung habe ich einfach die Abfragezeichenfolge im Bean-Return erstellt:
public String submit() {
// Do something
return "/page2.xhtml?faces-redirect=true&id=" + id;
}
Nicht die flexibelste Lösung, scheint aber so zu funktionieren, wie ich es will.
Verwenden Sie diesen Ansatz auch, um die Erstellung der Abfragezeichenfolge zu bereinigen: http://www.warski.org/blog/?p=185
Schauen Sie sich diese an:
Du brauchst so etwas wie:
<h:link outcome="success">
<f:param name="foo" value="bar"/>
</h:link>
...und...
<f:metadata>
<f:viewParam name="foo" value="#{bean.foo}"/>
</f:metadata>
Aus dieser Seite zu urteilen, könnte so etwas einfacher sein:
<managed-bean>
<managed-bean-name>blog</managed-bean-name>
<managed-bean-class>com.acme.Blog</managed-bean-class>
<managed-property>
<property-name>entryId</property-name>
<value>#{param['id']}</value>
</managed-property>
</managed-bean>
Sie können das mit Primefaces wie folgt machen:
<p:button
outcome="/page2.xhtml?faces-redirect=true&id=#{myBean.id}">
</p:button>
Fügen Sie einfach das seen-Attribut zum Umleitungs-Tag wie folgt hinzu:
<redirect include-view-params="true">
<view-param>
<name>id</name>
<value>#{myBean.id}</value>
</view-param>
</redirect>
Hier sind einige Navigationsbeispiele.