【问题标题】:How to know if I am in a postback?如何知道我是否处于回发状态?
【发布时间】:2009-01-09 06:55:27
【问题描述】:

我在 JSF 文档中读到 ResponseStateManager 有一个 isPostBack() 方法。我如何(以及在​​哪里)拥有ResponseStateManager 的实例?

【问题讨论】:

  • 我从您的评论中看到您找到了一个实用的解决方案,这很棒。你可以在这里发布它作为答案,我会投票赞成;)

标签: jsf postback


【解决方案1】:

如何知道我是否处于回发状态?

取决于 JSF 版本。

在 JSF 1.0/1.1 中,没有可用的 ResponseStateManager#isPostback() 方法。检查javax.faces.ViewState 参数是否存在于ExternalContext#getRequestParameterMap() 可用的请求参数映射中。

public static boolean isPostback() {
    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
    return externalContext.getRequestParameterMap().contains("javax.faces.ViewState");
}

在 JSF 1.2 中,确实使用了ResponseStateManager#isPostback(),它反过来实际上检查了请求参数映射中是否存在javax.faces.ViewState 参数。

public static boolean isPostback() {
    FacesContext context = FacesContext.getCurrentInstance();
    return context.getRenderKit().getResponseStateManager().isPostback(context);
}

在 JSF 2.0 中,改为使用 FacesContext#isPostback(),实际上它实际上是委托给 ResponseStateManager#isPostback()

public static boolean isPostback() {
    return FacesContext.getCurrentInstance().isPostback();
}

【讨论】:

  • FacesContext 的当前实例在 EL 范围内由 #{facesContext} 提供,因此应该这样做:#{facesContext.postback}
【解决方案2】:

确实,在jsf1.2之前,isPostBack是通过requestScope of the current instance of FaceContext获取的。

自 JSF1.2 起,ResponseStateManager(StateManager 的帮助类,它知道用于生成响应的特定渲染技术,一个单例抽象类,由 RenderKit 提供。)

在生命周期的恢复视图阶段,ViewHandler retrieves the ResponseStateManager object 用于测试请求是回发还是初始请求。

如果请求是回发,则调用 ViewHandler 的 restoreView 方法。此方法使用 ResponseStateManager 对象来重新构建组件树并恢复状态。构建树并恢复状态后,直到再次出现渲染响应阶段才需要 ViewHandler 实例。

上面提到的那篇文章 (Creating and Using a Custom Render Kit) 说明了如何通过 RenderKit(由实现呈现组件的标签的标签处理程序定义)实现/获取 ResponseStateManager。
可能这足以让您在您的上下文中获得自己的 ResponseStateManager 吗?

【讨论】:

  • 感谢您的完整性(我投票给您)。我需要一个更实用的提示,即我可以在其中获取我的实现正在使用的 ResponseStateManager 的实例:我后来发现我可以简单地从 FacesContext 访问 RenderKit 并使用 getResponseStateManager()
【解决方案3】:

对于 JSF1.2

public static boolean isPostback(){
    FacesContext context = FacesContext.getCurrentInstance();
    return context != null && context.getExternalContext().getRequestParameterMap().containsKey(ResponseStateManager.VIEW_STATE_PARAM);
}

【讨论】:

    猜你喜欢
    • 2011-03-28
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多