2009-01-09 103 views

回答

38

如何知道我是否在回发?

取决于JSF版本。

在JSF 1.0/1.1中,没有ResponseStateManager#isPostback()方法可用。检查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); 
} 

在JSF 2.0,而使用FacesContext#isPostback(),这下盖实际上代表们ResponseStateManager#isPostback()

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

我们可以在jsf页面上检查isPostback在java代码中)? – 2012-06-12 06:45:44

6

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

由于JSF1.2所述的ResponseStateManager(辅助类来StateManager一个知道特定呈现技术被用来产生响应,一个单抽象类,通过的RenderKit贩卖。)

在恢复查看阶段的生命周期,ViewHandler retrieves the ResponseStateManager object为了测试请求是回发还是初始请求。

如果请求是回发,则调用ViewHandler的therestoreView方法。此方法使用theResponseStateManager对象重新构建组件树并恢复状态。在构建树并且恢复状态之后,直到呈现响应阶段再次出现时,不需要ViewHandler实例。

该条上述(Creating and Using a Custom Render Kit)mentionned说明了如何实现/得到一个ResponseStateManager,通过的RenderKit(通过实施使该组件的标记的标记处理程序定义)。
可能这对于您在您的上下文中获取自己的ResponseStateManager足够了吗?

+0

谢谢你的完整性(我投票给你)。我需要一个更实用的提示,那就是我可以得到我的实现正在使用的ResponseStateManager的一个实例:我后来发现,我可以从FacesContext访问RenderKit并使用getResponseStateManager() – 2009-01-09 09:25:59

2

对于JSF1.2

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