java - Java 最高效的 JSF 1.2 导航

标签 java jsf backing-beans

我的 index.xhtml JSF 首页上有一个下拉列表。关联的代码/commandButton 如下所示:

    <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 之前设置为 'hello',在我的 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 引起的初始 Activity 超时,即使 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() 用法的良好阅读资源,其中有关于如何使用数据进行简单导航的不错示例,因为我找不到一个。

干杯

最佳答案

I found FacesContext.getCurrentInstance().getExternalContext().redirect but the JSF 1.2 javadoc does not feature this. Perhaps it's because it's not featured? It redirects though which is confusing. Why no documentation on this method?

当然有。

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


Nonetheless, it redirects me to the page, but renders without taking into account the data instantiated by the bean during the initial request. The bean is in request scope currently.

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

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

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

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

关于java - Java 最高效的 JSF 1.2 导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6020656/

相关文章:

java - 在多个 pdf 文件中搜索一个词并根据字数为 pdf 编制索引

JSF 输入到多个支持 bean 属性

java - 使用 JSF RequestScoped Bean 进行确认页面

安全约束和欢迎文件

jsf - '52' 的转换错误设置值 'null Converter'

java - 仅使用循环反转数字;无数组,转换为字符串只是初学者…Bug :Zero

java - Java中静态方法不支持动态多态的原因

java - 在枚举中添加映射并将键和值放入其中?

java - 如何使用 JSF 和导航规则创建带参数的 GET 请求?

jsf - 如何使用 f :viewParam? 对 GET 请求执行操作