it-swarm.com.de

Wie übergeben Sie Ansichtsparameter, wenn Sie von einer Aktion in JSF2 aus navigieren?

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.

34
dule

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.

52
fdreger

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

13
dule

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>
2
The Alchemist

Sie können das mit Primefaces wie folgt machen:

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

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. 

0
Koray Tugay