从 JSF 中的 Bean 重定向可以通过
externalContext.redirect("foo.xhtml");
但我想使用规则,在<navigation-rule/>
(faces-config.xml) 中设置<from-outcome/>
&& 传递命令行参数。
externalContext.redirect("from-outcome?param=bar");
不管用。怎么做?
从 JSF 中的 Bean 重定向可以通过
externalContext.redirect("foo.xhtml");
但我想使用规则,在<navigation-rule/>
(faces-config.xml) 中设置<from-outcome/>
&& 传递命令行参数。
externalContext.redirect("from-outcome?param=bar");
不管用。怎么做?
ExternalContext#redirect()
接受 URL ,而不是导航结果。
您需要从声明为 return 的操作方法返回导航结果String
。
public String submit() {
// ...
return "from-outcome";
}
您可以通过添加来配置导航案例以发送重定向<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>
请注意,您也可以只使用 JSF 隐式导航而不需要这种 XML 混乱:
public String submit() {
// ...
return "/foo.xhtml?faces-redirect=true¶m=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()
.