gpt4 book ai didi

jsf - 为什么 jsf 生命周期在重定向页面时跳过调用应用程序后的渲染响应?

转载 作者:行者123 更新时间:2023-12-04 16:46:37 25 4
gpt4 key购买 nike

我有两种情况
我有两个在 bean 中有逻辑的 Action
我的按钮

<h:commandButton  value="Submit" action="#{bean.test}" />
<h:commandButton value="Submit" action="#{bean.testOne}" />

这是两个 commnadButtons 和 bean 中的逻辑

public void test() {
log.info("I m in test");
}

public void testOne() {
log.info("I m in testOne");
try {
FacesContext.getCurrentInstance()
.addMessage("", new FacesMessage("Record Saved successfully."));
FacesContext
.getCurrentInstance()
.getExternalContext()
.redirect(
FacesContext.getCurrentInstance()
.getExternalContext().getRequestContextPath()
+ "/cycle/page");

} catch (IOException e) {
log.error(e.getMessage());
}
}

当我要单击第一个按钮(测试操作)时,jsf 生命周期会进入每个阶段,例如
恢复 View
应用请求值
过程验证
更新模型
调用应用程序
渲染响应
但是当我点击 testOne 按钮时,jsf 生命周期在调用应用程序后跳过渲染响应,例如
恢复 View
应用请求值
过程验证
更新模型
调用应用程序
恢复 View
渲染响应

用简单的语言来说,当我通过 facesContext 导航页面时,jsf 跳过了那个阶段。
但是为什么会这样呢?我没有得到问题。

最佳答案

根据 JSF 文档,这就是 INVOKE_APPLICATION 阶段的作用:

During this phase, the JavaServer Faces implementation handles any application-level events, such as submitting a form or linking to another page.

At this point, if the application needs to redirect to a different web application resource or generate a response that does not contain any JavaServer Faces components, it can call the FacesContext.responseComplete method.

If the view being processed was reconstructed from state information from a previous request and if a component has fired an event, these events are broadcast to interested listeners.

Finally, the JavaServer Faces implementation transfers control to the Render Response phase.

您正在做的是在此阶段调用 FacesContext#getCurrentInstance#getExternalContext#redirect,它会执行您的重定向。此方法触发 FacesContext#getCurrentInstance#responseComplete,结束 JSF 生命周期。重定向执行到 JSF View ,因此新的循环在此之后开始。

除此之外且与具体问题无关,如果您想重定向到内部 JSF View ,请不要执行那样的重定向。只需在您的操作方法(即 /cycle/page?faces-redirect=true)中返回导航案例 + ?faces-redirect=true。仅当您想要访问外部 URL 时才使用外部上下文。

另请参阅:

关于jsf - 为什么 jsf 生命周期在重定向页面时跳过调用应用程序后的渲染响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24547523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com