2013-08-29 11 views
8

un reindirizzamento da Bean in JSF può essere fattoCome fare reindirizzamento usando navigation-rule

externalContext.redirect("foo.xhtml"); 

Ma io voglio usare le regole, stabilite in <navigation-rule/> (faces-config.xml) per <from-outcome/> & & passare argomenti a riga di comando.

externalContext.redirect("from-outcome?param=bar"); 

Non funziona. Come farlo?

risposta

13

ExternalContext#redirect()takes an URL, non un risultato di navigazione.

È necessario restituire i risultati di navigazione dai metodi di azione dichiarati per restituire String.

public String submit() { 
    // ... 

    return "from-outcome"; 
} 

È possibile configurare il caso di navigazione per inviare un reindirizzamento aggiungendo <redirect>.

<navigation-rule> 
    <navigation-case> 
     <from-outcome>from-outcome</from-outcome> 
     <to-view-id>/foo.xhtml</to-view-id> 
     <redirect> 
      <view-param> 
       <name>param</name> 
       <value>bar</value> 
      </view-param> 
     </redirect> 
    </navigation-case> 
</navigation-rule> 

Si noti che si può anche solo fare uso di JSF navigazione implicita, senza la necessità di questo pasticcio XML:

public String submit() { 
    // ... 

    return "/foo.xhtml?faces-redirect=true&param=bar"; 
} 

Se sei all'interno di un metodo listener di eventi o Ajax, che non può tornare un risultato stringa, quindi è sempre possibile afferrare NavigationHandler#handleNavigation() per eseguire la navigazione desiderata.

public void someEventListener(SomeEvent event) { // AjaxBehaviorEvent or ComponentSystemEvent or even just argumentless. 
    // ... 

    FacesContext context = FacesContext.getCurrentInstance(); 
    NavigationHandler navigationHandler = context.getApplication().getNavigationHandler(); 
    navigationHandler.handleNavigation(context, null, "from-outcome"); 
} 

La non-navigazione caso equivalente che sta usando ExternalContext#redirect().

+1

Grazie a @BalusC, ma come si modifica il valore nella regola di navigazione dal bean? – timmornYE

+1

È possibile utilizzare EL in "" come " # {bean.param}". Questo è equivalente a "return" /foo.xhtml?faces-redirect=true¶m= "+ URLEncoder.encode (param," UTF-8 ");' (anche se alcune versioni di Mojarra hanno bug con l'uso di charset). – BalusC

+0

Grazie, ho capito. Ma per tornare alla mia domanda: quindi non c'è modo di usare 'navigation-rule' senza restituire una stringa? Perché ci sono situazioni in cui ciò non è possibile. Cosa fare, se voglio reindirizzare da una chiamata Ajax? Non posso restituire la navigazione come String o sbaglio? – timmornYE