2013-03-27 25 views
2

我目前使用Vaadin 7創建RIA,並且設計登錄功能。Vaadin 7 - 設置並獲取屬性到VaadinSession

應用設計是簡單的:

UI類執行導航beetwen不同視圖類。特別是,第一個顯示的View是一個LoginView類,並且在用戶被認證之後,UI類將用戶重定向到MainView。

驗證身份驗證後,我想將用戶數據(例如名字和姓氏)設置到會話中,並在Web應用程序的右上角始終顯示它(無論具體哪個視圖)。

作爲begginner我讀的書Vaadin,我首先用一章第11 https://vaadin.com/book/-/page/advanced.global.html所示的方案,但它似乎並不如預期,可能是因爲我使用的查看導航方案。

所以我用下面的辦法:

一旦認證正確完成LoginView嘗試將用戶數據存儲與下面的代碼VaadinSession屬性:

VaadinSession.getCurrent().setAttribute("name", name); 

然後UI導航到MAINVIEW並試圖得到用戶的名字:

VaadinSession.getCurrent().getAttribute("name"); 

但它得到一個空值。

有誰知道爲什麼?我感謝任何幫助。

謝謝。

+0

嘗試使用UI.getCurrent()的getSession()的setAttribute( 「名」,名字) – mahesh 2013-03-29 14:57:20

+0

我已經做了同樣的事情,它的工作原理。你是否檢查你是否將空值? – Monir 2013-04-16 20:24:58

+1

需要更多示例來幫助您,嘗試發佈可重新創建的獨立應用程序。 – Monir 2013-04-16 20:28:07

回答

0

在擴展UI的主類上使用@PreserveOnRefresh註釋。 然後,您可以將變量數據存儲在主類中。 您可以使用((MyUIClass)UI.getCurrent())。getSomeVariable方法表達式從任何位置(在任何視圖中)給它。

+0

不是一個真正正確的答案。在Vaadin 7中,用戶可以打開多個Web瀏覽器窗口/選項卡,每個窗口都顯示其自己的相同UI類(甚至其他UI類)的實例。所有這些窗口/選項卡屬於同一個會話。換句話說,Vaadin 7現在有兩個級別的範圍:一個VaadinSession對象具有一個或多個UI對象。關於這兩個範圍請參閱[本文](https://blog.oio.de/2013/02/22/vaadins-variable-scopes-vaadinsession-and-ui/)。對於用戶身份驗證,您需要更高級的作用域,VaadinSession而不是UI。附:看到關於線程安全的文章! – 2014-08-29 23:54:48

0

我有一個猜測,爲什麼你得到你的空值。在現代Vaadin的大多數教程中,導航頁面都是作爲對象在UI中創建的。如果在此過程中實例化的其中一個視圖是MainView。如果顯示名稱的標籤設置在類的構造函數的字符串,該行:

label.setValue(VaadinSession.getCurrent().setAttribute("name", name));將是無效的屬性還沒有被登錄功能尚未設定。

您需要更新@override enter()函數中顯示用戶字符串的標籤,否則請處理該標籤。

0

我建議將值存儲在HTTP會話上。

VaadinServletService.getCurrentServletRequest().getSession().setAttribute("name", name); 

VaadinServletService.getCurrentServletRequest().getSession().getAttribute("name");