我读过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的therestoreView方法.此方法使用ResponseStateManager对象重新构建组件树并恢复状态.构建树并恢复状态后,在再次发生渲染响应阶段之前,不需要ViewHandler实例.
上面提到的那篇文章(创建和使用自定义渲染工具包)说明了如何通过RenderKit实现/获取ResponseStateManager(由实现呈现组件的标记的标记处理程序定义).
这可能足以让您在上下文中获得自己的ResponseStateManager吗?