10

从 JSF 中的 Bean 重定向可以通过

externalContext.redirect("foo.xhtml");

但我想使用规则,在<navigation-rule/>(faces-config.xml) 中设置<from-outcome/>&& 传递命令行参数。

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

不管用。怎么做?

4

1 回答 1

16

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&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().

于 2013-08-29T13:53:41.290 回答