如何知道我是否在回发?

时间:2009-01-09 06:55:27

标签: jsf postback

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

3 个答案:

答案 0 :(得分:42)

  

如何知道我是否在回发?

取决于JSF版本。

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

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); } 参数。

ResponseStateManager#isPostback()

在JSF 2.0中,改为使用FacesContext#isPostback(),它实际上委托给public static boolean isPostback() { return FacesContext.getCurrentInstance().isPostback(); }

{{1}}

答案 1 :(得分:6)

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

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

  

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

     

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

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

答案 2 :(得分:2)

对于JSF1.2

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