我的英语有些问题,所以我为错误道歉。
我是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
}
所以,似乎我的应用程序运行正常。但我遇到了下一个问题: 我在Tomcat 7配置上运行应用程序。它启动没有任何问题。我打开Opera作为浏览器并登录,例如user1。一切似乎都正常。然后我打开谷歌浏览器或其他浏览器并以user2身份登录。如果在Opera中刷新窗口,它将显示知道user2已登录,但不会显示user1。我试过在不同的计算机上做同样的事情,我得到了相同的结果。 (在一台机器上记录为user1,另一台机器记录为user2)。 Firebug显示不同浏览器中的sessionsID是不同的。
似乎问题出在web.xml文件中,我配置了servlet。但是我尝试了不同的配置示例,并且总是得到相同的结果。
不幸的是,我无法在谷歌或其他论坛找到答案。
答案 0 :(得分:2)
我会说你的问题与静态应用程序单例有关。静态内容在JVM中的所有用户之间共享。
答案 1 :(得分:1)
正如亨利指出的那样,你在这里使用静态应用程序单例。这意味着每次调用Application#getInstance()
(以及扩展名为WebApplicationController#getInstance
)都会返回相同的Application实例,而不管调用的是哪个HTTP会话。
如果您需要从Web应用程序的其他部分轻松访问Application实例,最常见的方法是使用ThreadLocal<Application>
变量来存储实例。通过使用HttpServletRequestListener
,您可以在请求开始时设置值,并在请求结束时将其清除。
例如代码,请参阅Vaadin网站上ThreadLocal Pattern文章中的第二个代码示例。
还有其他方法 - 使用Spring或Guice来创建和管理Application实例,但只有在您已经使用这些框架时它们才有意义。
还值得注意的是,您可以通过调用Window#getApplication
来访问Window所属的Application实例;此关联仅在将Window添加到应用程序时进行,因此在构造函数中不可用。