2010-08-31 16 views
30

Da un'azione nel mio bean, sto provando a reindirizzare a un'altra pagina in attesa di un parametro di visualizzazione. Qual è il modo consigliato per farlo in JSF2?Come si passano i parametri di visualizzazione durante la navigazione da un'azione in JSF2?

Ad 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 fagiolo assomiglia:

@ManagedBean 
@RequestScoped 
public class MyBean { 

private int id; 

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

Ed ora, voglio che il ritorno del action 'submit' per spostarsi 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. Il frammento di faces-config è simile al 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> 

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

Così 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.

risposta

47

La cosa poco intuitivo circa il passaggio di parametri in JSF è che non si decide cosa inviare (nell'azione), ma piuttosto cosa desideri 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 accodati all'URL come params.

Si noti che questo è esattamente lo stesso meccanismo di qualsiasi altro binding JSF: non è possibile leggere il valore di inputText da un posto e farlo scrivere altrove. L'espressione del valore definita in viewParam viene utilizzata sia per la lettura (prima del reindirizzamento) che 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.

+0

Ho fatto un piccolo test con esso, e penso che funzioni come volevo. Grazie! Anche se presumibilmente, intendevi "success? Faces-redirect = true & includeViewParams = true"; e dule

+0

sì, mi dispiace. Ho incollato entrambe le parti di codice da un progetto di lavoro per evitare errori di battitura, e qui segue: il primo proviene dal modello xml (dove la e commerciale deve essere sfuggito) ed è incompleto e l'altro ha un nome di variabile diverso. Lo modifico subito. – fdreger

+0

@fdreger dove inseriresti i metadati quando usi h: commandButton? – Kevin

2

prova anche questi:

Avrai bisogno di qualcosa come:

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

... e ...

A giudicare da this page, 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> 
+0

Il problema è che non ho intenzione diretto tramite alla pagina successiva. La mia domanda riguarda la navigazione da un'azione bean. Pagina 1 chiama un'azione bean, l'azione bean fa roba, restituisce "successo", e ora voglio navigare con il successo ma aggiungere un parametro di visualizzazione con il reindirizzamento. – dule

+0

Scusa, ho frainteso il tuo post. Penso che http://java.dzone.com/articles/bookmarkability-jsf-2 possa farti ottenere quello che vuoi. L'esempio è esattamente quello che stai cercando, penso: 'http: //domain/blog/entry.jsf? Id = 9' –

+0

Grazie per le risposte, ma non sono sicuro che la mia domanda sia ancora compresa correttamente. Non sono chiaro a quale esempio ti riferisci in quell'articolo, perché non discute sulla navigazione da un'azione. La cosa più vicina nell'articolo è passare una vista-param lungo la pagina successiva, ma quello che voglio non è passare lo stesso view-param da una pagina all'altra, piuttosto voglio passare una nuova vista-param in una pagina da una navigazione di azione. Lascia che provi a riformulare la mia domanda iniziale per vedere se riesco a renderlo più chiaro. – dule

13

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 è la soluzione più flessibile, ma sembra funzionare come voglio.

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

+0

usi ancora la funzione faces-config? – Kevin

+0

quale jsf hai usato? – Kevin

0

È possibile farlo utilizzando primefaces in questo modo:

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

Basta aggiungere l'attributo visto per reindirizzare tag come di seguito:

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

Here sono alcuni esempi di navigazione.

-1

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" /> 
+0

Scelta errata per l'utilizzo di un pulsante di comando qui. Utilizza un pulsante normale: http://stackoverflow.com/questions/13070537/difference-between-hbutton-and-hcommandbutton (lo stesso vale per PrimeFaces p: pulsante) – Kukeltje

Problemi correlati