题
我在 JSF 文档中读到过 ResponseStateManager
有一个 isPostBack()
方法。我如何(以及在哪里)可以获得一个实例 ResponseStateManager
?
解决方案
如何知道我是否处于回发状态?
取决于 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();
}
其他提示
确实,在jsf1.2之前,isPostBack是通过 FaceContext 当前实例的 requestScope.
从 JSF1.2 开始,ResponseStateManager(StateManager 的帮助程序类,它知道用于生成响应的特定渲染技术, 单例抽象类, ,由 RenderKit 提供。)
在生命周期的恢复视图阶段, ViewHandler 检索 ResponseStateManager 对象 为了测试请求是回发还是初始请求。
如果请求是回发,则调用ViewHandler 的restoreView 方法。此方法使用 ResponseStateManager 对象来重新构建组件树并恢复状态。构建树并恢复状态后,在渲染响应阶段再次发生之前不需要 ViewHandler 实例。
上面提到的那篇文章(创建和使用自定义渲染套件)说明了如何通过 RenderKit(由实现呈现组件的标签的标签处理程序定义)实现/获取 ResponseStateManager。
也许这足以让您在您的上下文中获得自己的 ResponseStateManager ?
对于JSF1.2
public static boolean isPostback(){
FacesContext context = FacesContext.getCurrentInstance();
return context != null && context.getExternalContext().getRequestParameterMap().containsKey(ResponseStateManager.VIEW_STATE_PARAM);
}