2017-03-09 38 views
1

所以,我一直在閱讀有關RAP的應用,我不能停止想我應該如何創建靜態變量只對當前會話(如果是訪問的同時申請一個以上的人)。我已閱讀關於SingletonUtil。然而,我有幾個關於它的問題。RAP應用單

1-我應該爲應用程序創建一個SessionSingleton嗎?或者我應該爲我的應用程序中的每個類創建一個SessionSingleton(我知道這聽起來很愚蠢,我可能應該爲該應用程序創建一個SessionSingleton,但是......只要確保)。

2 - 一旦我創建這個辛格爾頓,每個用戶(或會話)將只有其靜態字段的訪問,是否正確?肯定他們不會從不同會話的其他靜態字段獲取數據是正確的。 (假設我正在創建一個購物車,如果客戶可以從另一個會話中看到購物車,則不可能這樣做)。

+0

簡而言之:你根本不應該使用靜態變量。該框架以某種方式爲您提供*會話範圍容器對象*(我不知道RAP)。而且你應該使用它來處理當前調用中存在的任何事情,並且不需要保存在數據庫中。 –

回答

1

再次重申什麼Timothy Truckle說,你應該遠離單身儘可能遠。

在Web應用程序,靜態字段隱含有應用範圍,因爲每個Web應用程序從他人通過單獨的類加載器隔離。也就是說,您的示例購物車將在同一個Web應用程序的所有會話/用戶之間共享。這通常不是你想要的。

爲每個會話的購物車,你可以使用SingletonUtil

喜歡這樣

SoppingCart cart = SingletonUtil.getSessionInstance(ShoppingCart.class); 

SoppingCart cart = SingletonUtil.getUniqueInstance(ShoppingCart.class, session); 

第一個變種使用當前 UI會議 - 分配給當前正在執行的請求線程的那個。

第二個變體要求您提供應該獲取/創建單身人士的UI會話。例如,如果您使用此功能,則可以通過從UI會話啓動的後臺線程運行代碼。

UISession session = RWT.getUISession(display); 

Thread thread = new Thread(this::calcualteItemsInShoppingCart); 
thread.start(); 

void calculateItemsInShopingCart() { 
    SoppingCart cart = SingletonUtil.getUniqueInstance(ShoppingCart.class, session); 
    // use cart... 
} 

一般來說,使用(會話/應用程序)單例只能作爲最後的手段。他們遲早會成爲負擔。儘量設計您的代碼,以便您可以在入口點創建購物車或示例,並將其傳遞到需要訪問的代碼部分。

注意,在RAP,可以存在每servlet會話多個UI會話(每個瀏覽器窗口/標籤之一)。

又見RAP文檔的Singletons and Static Fields in RAP章。

這是否回答你的問題?

+0

是的,它的確如此。謝謝,Rüdiger! –