2012-08-08 54 views
2

當用戶單擊任何commandButton時,將在託管bean中調用相應的操作。 是否有可能從@PostConstruct方法或從事件偵聽器方法獲取此操作名稱?JSF在託管bean中獲取當前操作

+0

必須在'請求',檢查它 – 2012-08-08 08:28:55

回答

4

按鈕的名稱=值對本身可用作HTTP請求參數的常用方式。可想而知,命令按鈕的生成的HTML表示看起來像這樣

<input type="submit" name="formId:buttonId" value="Submit" ... /> 

然後,它的存在作爲一個請求參數與名稱formId:buttonId具有非空值。 JSF在Apply Request Values階段使用這些信息來確定按鈕是否被按下。這種情況與按鈕組件相關聯的渲染器的decode()方法期間,大致如下:

if (externalContext.getRequestParameterMap().containsKey(component.getClientId(context))) { 
    component.queueEvent(new ActionEvent(component)); 
} 

或當它涉及一種AJAX請求,則該按鈕的名稱,而不是可作爲javax.faces.Source請求參數的值。

if (component.getClientId(context).equals(externalContext.getRequestParameterMap().get("javax.faces.Source"))) { 
    component.queueEvent(new ActionEvent(component)); 
} 

無論哪種方式,ActionEvent最終存儲爲UIViewRoot私有字段這是沒有可用的公共API的方式。所以,除非你抓住反思和實施的具體黑客,這是故事的結束。

要確定按下按鈕,最好的辦法就是像JSF本身一樣手動檢查請求參數映射。

根據具體功能要求,這是不是從問題十分清楚,另一種可能是在所有感興趣的UICommand組件使用actionListener<f:actionListener>,或使用<action-listener>faces-config.xml註冊一個全球性的。這將被調用之前真實action被調用。

-1
UIComponent sourceComponent = UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()); 
+0

歡迎來到堆棧溢出!儘管這段代碼可以解決這個問題,但[包括一個解釋](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高您的帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。也請儘量不要用解釋性註釋來擠佔代碼,這會降低代碼和解釋的可讀性! – 2018-02-02 09:52:53

+0

此版本的信息也應該添加。可能不適用於舊版本 – Kukeltje 2018-02-02 16:04:57