Wie übergeben Sie Ansicht Parameter, wenn sie von einer Aktion in JSF2 Navigation?

StackOverflow https://stackoverflow.com/questions/3605238

  •  25-09-2019
  •  | 
  •  

Frage

Von einer Aktion in meiner Bohne, ich versuche, zu einer anderen Seite erwartet eine Ansicht Parameter zu umleiten. Was ist der empfohlene Weg, dies in JSF2 zu tun?

.

Z. B, sagen meine Quelle Seite lautet: http: //localhost/page1.xhtml

es hat einen Befehlsschaltfläche, die eine Aktion aufruft:

<h:commandButton value="submit" action="#{myBean.submit}" />

, wo meine Bohne aussieht wie:

@ManagedBean
@RequestScoped
public class MyBean {

private int id;

public String submit() {
    //Does stuff
    id = setID();
    return "success";
}

Und jetzt möchte ich die ‚submit‘ Aktion Rückkehr zu navigieren http: //localhost/page2.xhtml id = 2

Ich habe versucht, dies mit dem Ziel-param in meinem Navigations Fall zu tun, sondern mit ungeraden Ergebnissen. Die Gesichter-config-Schnipsel sieht wie folgt 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 Wesen, obwohl MyBean auf Anfrage scoped gesetzt ist, ruft sie nur myBean.getId () das erste Mal, dass ich meine Anwendung laden, und verwendet das gleiche Wert für alle nachfolgenden Anrufe, falsche Ansicht Parameter für page2 erzeugen.

Also habe ich mich entweder für einen besseren Weg, dies zu tun, oder einen Grund / Lösung dafür, warum der Blick-param ist nicht von meiner Bohne jedes Mal angefordert wird.

War es hilfreich?

Lösung

Die unintuitive Sache über Parameter in JSF vorbei ist, dass Sie nicht entscheiden, was (in der Aktion) zu senden, sondern das, was Sie (in der Zielseite) erhalten mögen.

Wenn Sie eine Aktion zu tun, dass Enden mit einer Umleitung, die Zielseite Metadaten geladen wird und alle erforderlichen Parameter werden ausgelesen und an die URL als params angefügt.

Beachten Sie, dass dies genau der gleiche Mechanismus wie bei jedem anderen JSF Bindung: Sie nicht inputWert von einem Ort lesen können und haben es irgendwo anders schreiben. Der Wertausdruck in viewParam definiert wird sowohl zum Lesen verwendet (vor der Umleitung) und zum Schreiben (nach der Umleitung).

Mit Ihrem Bean einfach tun:

@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 Empfangsseite:

    <f:metadata>
        <f:viewParam name="id" value="#{myBean.id}" />
    </f:metadata>

Es wird genau das tun, was Sie wollen.

Andere Tipps

Ohne eine schönere Lösung, was ich Arbeit gefunden einfach ist meine Abfrage-String in der Bohne Rückkehr Aufbau:

public String submit() {
    // Do something
    return "/page2.xhtml?faces-redirect=true&id=" + id;
}

Nicht das flexibelste von Lösungen, aber scheint zu funktionieren, wie ich will es.

Auch mit diesem Ansatz den Prozess des Aufbaus des Abfrage-String zu bereinigen: http://www.warski.org/blog/?p=185

Schauen Sie sich diese:

Sie gehen müssen 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>

Geht man von Diese Seite , so etwas wie dies könnte 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 es Primefaces tun, wie folgt mit:

<p:button 
      outcome="/page2.xhtml?faces-redirect=true&amp;id=#{myBean.id}">
</p:button>

Fügen Sie einfach das gesehen Attribut Redirect-Tag wie folgt:

<redirect include-view-params="true">
    <view-param>
        <name>id</name>
        <value>#{myBean.id}</value>
    </view-param>
</redirect>

hier einige Navigations-Beispiele sind.

Eine Lösung ohne Bezug auf ein Bean:

<h:button value="login" 
        outcome="content/configuration.xhtml?i=1" />

In meinem Projekt habe ich diesen Ansatz erforderlich:

<h:commandButton value="login" 
        action="content/configuration.xhtml?faces-redirect=true&amp;i=1"  />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top