2017-10-22 12 views
1

私はWebアプリケーションを作成しています。Vaadin UI - すべてのクライアントに静的フィールドを使用できません

私は、を拡張するMyUIを持っています。

public class MyUI extends UI { 

     public static Authentication AUTH; 

     @Override 
     protected void init(VaadinRequest vaadinRequest) { 

      AUTH = new Authentication(); 

      updateContent(); 

     } 

//other methods 

    } 

Authentication()私はユーザーをログに記録しました。ログアウトすると、そのユーザーはnullに設定されます。

2つのデバイスからサーバーにアクセスすると、サーバーに2つの接続が必要なときに、誰かがログアウトすると、もう1つもログアウトされることに気付きました。

認証クラスでは、この方法があります:

public void doLogout() { 
    System.out.println("User: " + this.user.getMail() + " has logged out."); 
    this.user = null; 
} 

ユーザーがすでにnullに設定されているので、私は他のアカウントからログアウトを実行しようとするとき、私は、user.getMail()にエラーが発生します。

com.vaadin.ui.UIは固有ですか? Vaadinでどのように異なる接続を扱うことができますか?

答えて

5

ジャワ、一般

における基本的なJavaここで、Vaadinとは何の関係も...

キーワードstaticは、そうでない場合は、より一般的に「グローバル変数」として知られている「クラス変数」として知られている、one value per classを意味し、 。オブジェクト指向ではありません。一般に、静的な使用を最小限に抑える必要があります。

このキーワードを省略すると、「このクラスのインスタンスごとに1つの値」を意味し、インスタンス変数はメンバ変数とも呼ばれます。これはオブジェクト指向です。

私は、Vaadinプロジェクトに着手する前に、Javaの基礎を学ぶことをお勧めします。また、Java Servletテクノロジーの基本について学ぶこともできます。おそらくO'Reillyが発行したサーブレットのヘッドファーストブックを読むことができます(今は時代遅れですが、基本は同じです)。また、Vaadinが本質的にマルチスレッドのようなサーブレット環境であるため、スレッド化や並行性の問題などの高度なトピックについて学ぶ必要があります。結局のところ、Java Concurrency In PracticeのGoetz氏の本を読んでください。

Vaadin具体

セッション属性を使用して、Vaadinアプリケーションのユーザごとに値を格納します。これはキー値ストアで、キーを指定することによって値を挿入および取得します。キーは「属性」の名前です。セッションは、Java Servletテクノロジーの一部として、ユーザーが初めて接続するときに自動的にインスタンス化されます。

また、そのUIクラスにユーザーごとの値をインスタンス変数として格納することもできます。各Vaadinユーザーは、最初に接続するときにUIインスタンスで開始します。しかし、注意:Vaadin 8アプリで複数のウェブブラウザのタブ/ウィンドウを開くことができます。それぞれにはUIインスタンスがあります。したがって、複数のUIオブジェクト間でデータを共有するには、セッション属性を使用します。

すべてのVaadinアプリには少なくとも1つのUIサブクラスが定義されていますが、上記の追加のブラウザタブ/ウィンドウで異なるコンテンツを表示するには、さらにUIサブクラスを定義することができます。

2

たぶん代わりに静的変数のあなたはここでセッション属性(より一般的に更新)を使用する必要がありますので、セッション固有のデータを格納するためにVaadinSessionを使用

UI.getCurrent().getSession().setAttribute("AUTH", AUTH); 
    Authentication auth2 = UI.getCurrent().getSession().getAttribute("AUTH"); 

を。

+0

通常、「通常の」変数を使用するのはOKです.Webブラウザごとに1つのUIなので、複数のウィンドウやブラウザで同じ環境/セッションを使用する場合を除き、ユーザーは正しく区別されます –

+1

True、ここは良い記事ですその違いについて:[Vaadinの変数スコープ:VaadinSessionとUI](https://blog.oio.de/2013/02/22/vaadins-variable-scopes-vaadinsession-and-ui/)。 autheticationセッションの方が適切かもしれないと思います。 – pirho

関連する問題