Come si fa a passare i parametri della vista durante la navigazione da un'azione in JSF2?

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

  •  25-09-2019
  •  | 
  •  

Domanda

Da un'azione nel mio fagioli, sto cercando di reindirizzare a un'altra pagina in attesa di un parametro di vista. Qual è il metodo consigliato di fare questo in JSF2?

.

per esempio, dire la mia pagina di origine è: http: //localhost/page1.xhtml

ha un commandButton che chiama un'azione:

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

dove il mio aspetto di fagioli come:

@ManagedBean
@RequestScoped
public class MyBean {

private int id;

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

E ora, voglio che il ritorno del action 'submit' per navigare http:? //localhost/page2.xhtml id = 2

Ho provato a fare questo con una visione a param nel mio caso la navigazione, ma con risultati strani. Gli sguardi volti-config frammento come il seguente:

<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>

L'essere strano comportamento, anche se MyBean è impostato su richiesta ambito, si chiama solo myBean.getId () la prima volta che carico la mia domanda, e riutilizza lo stesso valore per tutte le chiamate successive, producendo parametri di vista non corretti per page2.

Quindi sto cercando sia un modo migliore per fare questo, o una ragione / soluzione per il motivo per cui la vista-param non viene richiesto dal mio chicco di volta in volta.

È stato utile?

Soluzione

La cosa poco intuitivo circa il passaggio di parametri in JSF è che non si decide cosa inviare (nell'azione), ma piuttosto ciò che si desidera ricevere (nella pagina di destinazione).

Quando si esegue un'azione che termina con un redirect, i metadati pagina di destinazione viene caricata e tutti i parametri necessari vengono letti e aggiunti alla URL, params.

Si noti che questo è esattamente lo stesso meccanismo come con qualsiasi altro JSF vincolante: non è possibile leggere il valore di inputText da un posto e lo hanno scrivere da qualche altra parte. Il valore espressione definito viewParam viene utilizzato sia per la lettura (prima che il reindirizzamento) e per la scrittura (dopo il reindirizzamento).

Con il bean basta fare:

@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

Se il lato ricevente ha:

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

Lo farà esattamente quello che vuoi.

Altri suggerimenti

Senza una soluzione più bello, quello che ho trovato al lavoro è semplicemente costruendo la mia stringa di interrogazione in sede di dichiarazione di fagioli:

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

Non è il più flessibile di soluzioni, ma sembra funzionare come lo voglio a.

Anche utilizzando questo approccio per ripulire il processo di costruzione della stringa di query: http://www.warski.org/blog/?p=185

Dai un'occhiata a queste:

Avrai bisogno di qualcosa come:

<h:link outcome="success">
  <f:param name="foo" value="bar"/>
</h:link>

... e ...

<f:metadata>
  <f:viewParam name="foo" value="#{bean.foo}"/>
</f:metadata>

A giudicare da questa pagina , qualcosa di simile potrebbe essere più facile:

 <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>

È possibile farlo utilizzando primefaces come questo:

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

Basta aggiungere l'attributo visto al tag di reindirizzamento, come di seguito:

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

qui sono alcuni esempi di navigazione.

Una soluzione senza riferimento ad un Bean:

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

Nel mio progetto ho bisogno di questo approccio:

<h:commandButton value="login" 
        action="content/configuration.xhtml?faces-redirect=true&amp;i=1"  />
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top