2009-01-09 152 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); 
} 
相關問題