我的索引.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 中的托管属性。