2010-01-18 121 views
2

我想知道,在用戶關閉JSF 1.2上的窗口(點擊瀏覽器的「X」)後,如何在JSF中執行session.remove("userBean")JSF:清除會話作用域Bean

我正在考慮在用戶點擊瀏覽器的'X'後彈出一個確認消息,但不太確定如何訪問或綁定到我定義的方法的按鈕,其中我有該邏輯來清除範圍的bean。或者有沒有更好的方法來做到這一點?

任何幫助將不勝感激。

謝謝。

+0

查看我的附錄。 – 2010-01-18 05:27:42

回答

6

我在想,如何在JSF 1.2中關閉窗口(點擊瀏覽器的'X')後在JSF中執行session.remove(「userBean」)。

你不需要擔心它。如果會話超時,那麼這個bean肯定會被刪除。如有必要,您可以在<session-config>web.xml中控制會話超時期限。如果你真的想要掛斷會話超時/銷燬,那麼你可以實現HttpSessionListener和截獲sessionDestroyed(),或者讓UserBean實現HttpSessionBindingListener並截取valueUnbound()

如果你真的堅持在瀏覽器上關閉按鈕,這畢竟是比較多的工作,那麼你所能做的就是使用Javascript的beforeunload事件。沒有其他方法。你應該記住,這是一個不規範的事件,因此並不是所有的瀏覽器都支持它。例如。 Opera不支持這個事件。這是精簡的工作,因爲當你做一個普​​通的香草導航或表單提交時,這個事件也會被觸發,你需要在每個「普通」鏈接/按鈕上禁止這個事件。您還需要觸發Ajaxical請求以通知服務器關閉,因爲您將無法更改頁面位置或在瀏覽器關閉時再提交隱藏表單。

2

爲什麼你想刪除一個屬性。事實上,當會話失效時,無論如何都會收集垃圾,因爲沒有參考。在這種情況下,您可能希望使用較低的超時時間。

如果您想立即使會話無效。只要點擊「確定」按鈕,您就可以使用JavaScript功能將請求發佈到您的服務器。這可能不是一件非常可靠的事情,但作爲一個設施不會受到傷害。下面是一個示例代碼,

JavaScript函數

function show_confirm() 
{ 
    var r=confirm("Are you sure you want to abort the session?"); 
    if (r==true) { 
    // set an appropriate form action and 
    document.form.submit(); 
    } 
} 

HTML

<input type="button" onclick="show_confirm()" value="Show confirm box" /> 

[您的意見後編輯]

所以,你要綁定的按鈕到你的bean方法,你必須d自定義的東西,使用CSS和JavaScript。看看this tutorial,它會爲您提供一些有關如何創建自定義彈出窗口的信息。由於它只是一個普通的<div>,你可以像其他任何按鈕一樣操作,不需要火箭科學,只需將你的按鈕代碼放入<div>即可。

+0

如何使用JavaScript函數將請求發佈到我的服務器,點擊「確定」按鈕。作爲新手,你能舉一些例子嗎? 謝謝, – user234194 2010-01-18 04:46:39

+0

我的意思是你可以使用確認框。看我的附錄。 – 2010-01-18 05:22:36

+0

但我不能將OK按鈕綁定到我的方法從bean類,我的意思是不是javaScript method.Kindly建議。 – user234194 2010-01-18 06:40:28

2

您可以使用MyFaces Orchestra在自定義conversation.accessconversation.manual中定義您的bean。他們將允許你的豆子比在會話中存放的時間更近。

  • 您可以定義對話的超時時間,與會話超時時間不同(且較小)。
  • 如果使用conversation.access,那麼當bean不再被用戶請求引用時(即對話結束),它們將立即被刪除。這不適用於你的情況(關閉瀏覽器),但仍然很有用。

對話是由屬於相同邏輯上下文的用戶執行的步驟序列 - 即整個註冊過程是一個對話,但它跨越多個頁面。

通常,用戶關閉後,您不必擔心會話中剩餘的內容。它最終會被超時並收集垃圾。在瀏覽時你必須擔心會話中的內容,因爲它會變得非常大。

1

在JSF中,你將作出類似

JSF頁面:

<h:commandButton id="closeBtn" 
     type="submit" value="Close" onclick="return showConfirmClose();" 
     actionListener="#{backBean.cleanUpMethod}" 
</h:commandButton> 

的Javascript:

//in case the user clicked No, this method should return false, 
//preventing the action from being submitted, but double check all the return values first 

function showConfirmClose(){ 
    var c = confirm("Are you sure?"); 
    return c;  
} 

BackBean:

public void cleanUpMethod(ActionEvent event){ 
     //do cleaning here 
}