19

我读过ResponseStateManagerisPostBack()方法的 JSF 文档。我如何(以及在​​哪里)有一个实例ResponseStateManager

4

3 回答 3

44

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

取决于 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()which 反过来实际检查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();
}
于 2011-03-10T22:04:01.073 回答
6

确实,在jsf1.2之前,isPostBack是通过FaceContext当前实例的requestScope获取的

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

在生命周期的恢复视图阶段,ViewHandler 检索 ResponseStateManager 对象以测试请求是回发还是初始请求。

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

上面提到的那篇文章(创建和使用自定义渲染工具包)说明了如何通过 RenderKit(由实现渲染组件的标记的标记处理程序定义)实现/获取 ResponseStateManager。
可能这足以让您在您的上下文中获得自己的 ResponseStateManager 吗?

于 2009-01-09T07:32:01.680 回答
2

对于 JSF1.2

public static boolean isPostback(){
    FacesContext context = FacesContext.getCurrentInstance();
    return context != null && context.getExternalContext().getRequestParameterMap().containsKey(ResponseStateManager.VIEW_STATE_PARAM);
}
于 2011-03-10T21:37:56.773 回答