Jsf 如何使用导航规则进行重定向

Jsf 如何使用导航规则进行重定向,jsf,redirect,jsf-2,navigation,Jsf,Redirect,Jsf 2,Navigation,JSF中Bean的重定向可以通过 externalContext.redirect("foo.xhtml"); 但是我想使用(faces config.xml)中为&传递命令行参数设置的规则 externalContext.redirect("from-outcome?param=bar"); 它不起作用。如何做到这一点?是外部上下文#重定向(),而不是导航结果 您需要从声明为返回String的操作方法返回导航结果 public String submit() { // ...

JSF中Bean的重定向可以通过

externalContext.redirect("foo.xhtml");
但是我想使用
(faces config.xml)中为
&传递命令行参数设置的规则

externalContext.redirect("from-outcome?param=bar");
它不起作用。如何做到这一点?

外部上下文#重定向()
,而不是导航结果

您需要从声明为返回
String
的操作方法返回导航结果

public String submit() {
    // ...

    return "from-outcome";
}
您可以通过添加
将导航案例配置为发送重定向


结果
/foo.xhtml
param
酒吧
注意,您也可以只使用JSF隐式导航,而不需要这种XML混乱:

public String submit() {
    // ...

    return "/foo.xhtml?faces-redirect=true&param=bar";
}
如果您在无法返回字符串结果的事件或ajax侦听器方法中,则始终可以抓取
NavigationHandler\handleNavigation()
,以执行所需的导航

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");
}

非导航案例的等价物是使用
ExternalContext#redirect()

谢谢@BalusC,但是如何从bean中修改导航规则中的值呢?您可以像这样在
中使用EL
{bean.param}
。这相当于
return”/foo.xhtml?faces redirect=true¶m=“+urlcoder.encode(param,“UTF-8”)(尽管一些Mojarra版本在使用字符集时存在错误)。谢谢,我理解。但回到我的问题:那么,如果不返回字符串,就无法使用
导航规则
?因为有些情况下这是不可能的。如果我想从Ajax调用重定向,该怎么办?在这里,我不能以字符串形式返回导航,或者我错了吗?抱歉,我把这里的事情搞混了(我喜欢隐式导航,其中视图ID与结果完全相同,这样可以消除代码重复;我从未真正使用过XML导航案例,
getBookmarkableURL()
采用视图ID,而不是XML结果),您应该使用
NavigationHandler\handleNavigation()
。示例:并将
应用程序#getNavigationHandler()
强制转换为
配置导航处理程序
,然后您将能够在其上调用
getNavigationCase()
,而该应用程序又具有其他
getBookmarkableURL()