繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM