2

我的 index.xhtml JSF 首页上有一个下拉菜单。相关的代码/命令按钮如下所示:

    <h:selectOneMenu id="nodes" value="#{MyBacking.chosenNode}">
    <f:selectItems value="#{MyBacking.nodes}" />
</h:selectOneMenu>

<a4j:commandButton value="Retrieve" styleClass="ctrlBtn"
    id="retrieveBtn" style="margin-bottom: 2px;"
    onclick="#{rich:component('nodeLoadWait')}.show()"   # modal
    action="#{MyBacking.redirect}"
    image="/img/btnRetrieve26.png" />

action之前设置为“你好”,在我的faces-context.xml

<navigation-rule>
    <from-view-id>/index.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>hello</from-outcome>
        <to-view-id>/nodeMgmt.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

action设置为“你好”时,单击retrieve按钮工作正常,因为面将处理导航,MyBacking.setChosenNode方法将分配所有必要的数据,以便 nodeMgmt.xhtml 的内容将显示为完全填充。

但是,如果用户点击导致的初始活动retrieve超时,即使 bean 检测到超时,网页也会挂起,我想将用户重定向到“超时”页面。

为了处理返回超时消息的支持 bean(在应用程序“内部”时已经存在错误检测),我认为与其使用faces-context.xml文件,不如在内部处理它。

我发现 FacesContext.getCurrentInstance().getExternalContext().redirect 但 JSF 1.2 javadoc 没有此功能。也许是因为它没有特色?它重定向虽然这令人困惑。为什么没有关于这种方法的文档?

尽管如此,它会将我重定向到页面,但在呈现时没有考虑 bean 在初始请求期间实例化的数据。该 bean 当前处于请求范围内。bean中的相关代码是

    try {
        FacesContext.getCurrentInstance().getExternalContext().redirect("nodeMgmt.jsf");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

使用后端 java 调用是进行这种重定向的最佳方式吗?如果没有,最好使用faces-context.xml?如果是这样,怎么做?当我们在这里时 - 任何人都可以将我引导到 FacesContext.getCurrentInstance().getExternalContext() 用法的良好阅读资源,其中有关于如何使用数据进行简单导航的不错示例,因为我无法找到一个。

干杯

4

1 回答 1

2

我发现 FacesContext.getCurrentInstance().getExternalContext().redirect 但 JSF 1.2 javadoc 没有此功能。也许是因为它没有特色?它重定向虽然这令人困惑。为什么没有关于这种方法的文档?

肯定有。

可能您正在阅读错误的 javadoc。FacesContext也许之一?


尽管如此,它会将我重定向到页面,但在呈现时没有考虑 bean 在初始请求期间实例化的数据。该 bean 当前处于请求范围内。

重定向指示浏览器触发一个全新的 HTTP 请求。因此,旧请求中的所有请求范围的 bean 都将被丢弃并在新请求中重新初始化。如果你想保留请求,你想使用转发来代替(JSF 默认使用),但这不适用于 ajax 发起的请求,因为它无论如何都会粘在同一页面上。只有带有重定向的响应才会强制 Ajax 使用 JavaScript 更改窗口位置。

如果您想在新请求中保留一些参数,则必须将它们作为请求参数传递。例如

externalContext.redirect("nodeMgmt.jsf?foo=bar");

并将它们设置为 bean 中的托管属性。

于 2011-05-16T17:03:21.737 回答