[英]Why jsf life cycle skips render response after Invoke application when redirect the page?
我有两个场景
我有两个在bean中有逻辑的动作
我的按钮
<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生命周期会进入每个阶段
恢复视图
应用请求值
流程验证
更新模型
调用应用程序
渲染响应
但是当我点击testOne按钮时,jsf生命周期会在调用应用程序之后跳过渲染响应
恢复视图
应用请求值
流程验证
更新模型
调用应用程序
恢复视图
渲染响应
用简单的语言当我通过facesContext导航页面时,jsf跳过那个阶段。
但为什么会这样呢? 我没有遇到问题。
根据JSF文档,这是INVOKE_APPLICATION阶段的作用:
在此阶段,JavaServer Faces实现处理任何应用程序级事件,例如提交表单或链接到另一个页面。
此时,如果应用程序需要重定向到其他Web应用程序资源或生成不包含任何JavaServer Faces组件的响应,则可以调用FacesContext.responseComplete方法。
如果正在处理的视图是从先前请求的状态信息重建的,并且如果组件已经触发了事件,则这些事件被广播给感兴趣的听众。
最后,JavaServer Faces实现将控制转移到渲染响应阶段。
你正在做的是在这个阶段调用FacesContext#getCurrentInstance#getExternalContext#redirect
,它会执行你的重定向。 此方法触发FacesContext#getCurrentInstance#responseComplete
,结束JSF生命周期。 重定向是在JSF视图中执行的,因此在此之后开始新的循环。
除此之外,与具体问题无关,如果要重定向到内部JSF视图 , 请不要执行此类重定向 。 只需在动作方法中返回导航大小写+ ?faces-redirect=true
(即/cycle/page?faces-redirect=true
)。 仅当您要访问外部URL时才使用外部上下文。
也可以看看:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.