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¶m=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()
.
Grazie a @BalusC, ma come si modifica il valore nella regola di navigazione dal bean? – timmornYE
È 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
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