2012-08-22 94 views
0

我的英语存在一些问题,所以我对错误表示歉意。在tomcat上的Vaadin web应用程序只为所有用户创建一个web应用程序的实例

我是Java编程的初学者。我使用IntelliJIdea作为IDE,Vaadin框架创建GUI和tomcat作为Web服务器。项目是使用maven生成的。 要创建我用下面的来源为例应用:

From stack overflow

Video tutorial

有应用类,(这不是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 
} 

所以,看来我的应用程序工作正常。但是我面临下一个问题: 我在Tomcat 7配置中运行应用程序。它启动没有任何问题。我将Opera作为浏览器打开并以user1身份登录。一切似乎都正确。然后,我打开Goog​​le Chrome或其他浏览器并以user2登录。如果在Opera中刷新窗口,它将显示知道user2登录,但不是user1。我试图在不同的计算机上做同样的事情,并得到了同样的结果。 (在一台机器上记录为user1,在另一台上记录为user2)。 Firebug显示sessionsID在不同的浏览器中不同。

看来,这个问题是在web.xml文件中,在那里我配置的servlet。但我曾尝试过不同的配置示例,并始终得到相同的结果。

不幸的是,我没有设法在谷歌或其他论坛找到答案。

回答

2

我会说你的问题与静态应用程序单例有关。统计信息由JVM中的所有用户共享。

1

正如Henri指出的那样,您在此处使用的是静态Application Singleton。这意味着对(以及扩展名为WebApplicationController#getInstance)的每个调用都将返回相同的应用程序实例,而不管正在调用哪个HTTP会话。

如果你需要从你的web应用程序的其他部分方便地访问应用程序实例,最常见的方法是使用一个ThreadLocal<Application>变量来存储实例。通过使用HttpServletRequestListener,您可以在请求开始时设置该值,并在结束时清除该值。

例如代码,请参见Vaadin网站上的文章ThreadLocal Pattern第二个代码示例。

还有其它的方法 - 使用Spring或Guice的创建和管理中的应用实例,但如果你已经在使用这些框架,他们才有意义。

另外值得一提的是,你可以通过调用Window#getApplication访问一个窗口所属的应用实例;这个关联只在窗口被添加到应用程序时才会生成,所以在构造函数中不可用。

+0

谢谢。我已经替换了单例应用程序,并且Web应用程序开始以正确的方式工作。 – Sergey

相关问题