通过 Java 实现最有效的 JSF 1.2 导航



我的索引.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设置为"hello"时,单击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()用法,其中有关于如何使用数据进行简单导航的不错的例子,因为我找不到一个。

干杯

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

当然有。

  • JSF 1.1: ExternalContext#redirect()
  • Java EE 5 (JSF 1.2): ExternalContext#redirect()
  • Java EE 6 (JSF 2.0): ExternalContext#redirect()

可能你读错了javadoc。也许是FacesContext之一?


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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新