0

英語に問題がありますので、お詫び申し上げます。

私はJavaプログラミングの初心者です。IntelliJIdeaをIDEとして使用し、Vaadinフレームワークを使用してGUIを作成し、TomcatをWebサーバーとして使用しています。プロジェクトはMavenで生成されました。アプリケーションを作成するには、例として次のソースを使用します。

スタックオーバーフローから

ビデオチュートリアル

Applicationクラス(com.vaadin.Application継承ではありません)がありますが、シングルトンです。

package com.exadel.dinnerorders.vaadinwindow.application;
import com.exadel.dinnerorders.entity.Order;
import com.exadel.dinnerorders.entity.User;
import com.exadel.dinnerorders.service.TasksManagerService;
import com.google.common.eventbus.EventBus;

public class Application {
    private EventBus eventBus = new EventBus();
    private static Application INSTANCE = new Application();
    private User user;
    private Order order;
    private TasksManagerService tasksManagerService = new TasksManagerService();

    private Application() {
        tasksManagerService.start();
    }

    public synchronized static Application getInstance(){
        return INSTANCE;
    }

    public EventBus getEventBus() {
        return eventBus;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public User getUser() {
        return user;
    }

    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }

    public TasksManagerService getTasksManagerService() {
        return tasksManagerService;
    }
}

そしてWebApplicationController、を拡張するクラスがありますcom.vaadin.Application

package com.exadel.dinnerorders.vaadinwindow.application;

import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import com.vaadin.terminal.Sizeable;
import com.vaadin.ui.*;

import java.util.Collection;

public class WebApplicationController extends com.vaadin.Application {
    private EventBus eventBus = Application.getInstance().getEventBus();
    private Layout loginLayout;
    private String datePattern = "YYYY-MM-DD";

    @Override
    public void init() {
        createLayouts();
        createMainWindow();
        eventBus.register(this);
        setTheme("apptheme");
    }
    //some another methods for initialization main window and layouts
}

したがって、私のアプリケーションは正常に動作しているようです。しかし、次の問題に直面しました。Tomcat7構成でアプリケーションをアイデアで実行します。問題なく起動します。ブラウザとしてOperaを開き、たとえばuser1としてログインします。すべてが正しく機能しているようです。次に、Google Chromeまたは別のブラウザを開き、user2としてログインします。また、Operaでウィンドウを更新すると、user2がログインしていることはわかりますが、user1は表示されません。別のコンピューターで同じことをしようとしましたが、同じ結果が得られました。(あるマシンではuser1としてログに記録され、別のマシンではuser2としてログに記録されます)。Firebugは、sessionsIDがブラウザごとに異なることを示しています。

問題は、サーブレットを構成するweb.xmlファイルにあるようです。しかし、私はさまざまな構成例を試しましたが、常に同じ結果が得られました。

残念ながら、私はグーグルや他のフォーラムで答えを見つけることができませんでした。

4

2 に答える 2

3

あなたの問題は静的なアプリケーションシングルトンに関連していると思います。統計は、JVM内のすべてのユーザー間で共有されます。

于 2012-08-22T19:04:01.073 に答える
2

Henri が指摘しているように、ここでは静的 Application シングルトンを使用しています。つまり、呼び出し元の HTTP セッションに関係なく、へのすべての呼び出しApplication#getInstance()(ひいては) が同じ Application インスタンスを返すことを意味します。WebApplicationController#getInstance

Web アプリケーションの他の部分から Application インスタンスに簡単にアクセスする必要がある場合、最も一般的な方法は、ThreadLocal<Application>変数を使用してインスタンスを格納することです。を使用するHttpServletRequestListenerと、リクエストの開始時に値を設定し、終了時にクリアできます。

コード例については、Vaadin Web サイトのThreadLocal パターンに関する記事の 2 番目のコード サンプルを参照してください。

Spring または Guice を使用して Application インスタンスを作成および管理する方法は他にもありますが、これらのフレームワークを既に使用している場合にのみ意味があります。

を呼び出すことで、Window が属する Application インスタンスにアクセスできることにも注意してくださいWindow#getApplication。ただし、この関連付けは Window がアプリケーションに追加されたときにのみ行われるため、コンストラクターでは使用できません。

于 2012-08-23T08:03:01.207 に答える