我的 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?
当然有。
- JSF 1.1:
ExternalContext#redirect()
- Java EE 5 (JSF 1.2):
ExternalContext#redirect()
- Java EE 6(JSF 2.0):
ExternalContext#redirect()
可能您读错了 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/